2015-06-29 2 views
-1

Я использую библиотеку jQuery jcarousellite. Библиотека добавляет конструктор jCarouselLite к прототипу конструктора $/jQuery.

$.fn.jCarouselLite=function(){ /*"LOTS OF CODE HERE"*/ } 

У меня есть AJAX вызов JQuery (я использую $ .ajax), который сделан на документе готового события ($(document).ready) которая вызывает функцию обратного вызова успеха, то обратный вызов имеет следующий код:

console.log(Object.getOwnPropertyNames($.fn)); 

I включает встроенный/внутренний сценарий, прежде чем тело заканчивается, который имеет тот же код, что и выше:

console.log(Object.getOwnPropertyNames($.fn)); 

Однако выход первого console.log не содержат тыс e constructor jCarouselLite, в то время как на выходе второго console.log содержится его. Я хочу использовать его в первом обратном вызове Ajax, но так как он не найден, я получаю ссылочную ошибку.

Я что-то упустил?

ПРИМЕЧАНИЯ: ЭТО НЕ ПРОБЛЕМА С ПОРЯДКА ВКЛЮЧЕНИЯ скриптов: Я включил SCRIPTS в соответствующем порядке ТАК ПОЖАЛУЙСТА НЕ Предполагаю, что в качестве ответа.

+0

Это произойдет, если вы включили jQuery дважды. – SLaks

+0

* «Однако вывод первого« *, который вы вызываете первым? один в обратном вызове? один в конце?(подсказка, первая в конце должна произойти в первую очередь) –

+1

Мне нравится ваша заметка в конце, так как факт все еще будет проблемой, связанной с тем, как вы включаете скрипты. :) –

ответ

1

Вы включаете jQuery дважды, и вот как я это знаю.

Позволяет сказать, у вас есть следующий код, с комментировал бревенчатых выходов:

jquery.js

jquery.foo.js:

(function ($) { 
    'use strict'; 
    $.fn.foo = function() { 
     console.log("Hello World!"); 
     return this; 
    }; 
}(jQuery)); 

mycode. js:

console.log($.fn.foo); // function 
setTimeout(function() { 
    console.log($.fn.foo); // undefined 
}, 1000); 

Единственный способ, по которому foo может стать неопределенным на одну секунду позже, если вы включили jQuery дважды, или вы исключили свойство из прототипа. Ничто в jQuery не удаляет свойства из прототипа, поэтому вывод должен состоять в том, что вы включаете jQuery дважды. Вторая копия jQuery не имеет инициализированного плагина, поэтому через 1 секунду, когда вы регистрируете прототип (который находится на новой копии jQuery), у него больше нет плагина.

Чтобы доказать это, если вы изменили код к следующему, он должен работать, независимо от того, JQuery включаются дважды:

(function ($) { 
    console.log($.fn.foo); // function 
    setTimeout(function() { 
     console.log($.fn.foo); // function 
    }, 1000); 
}(jQuery)); 

Причина, по которой фиксирует это она принимает значение jQuery и сохраняет его так что если window.jQuery будет изменен, ваш код не будет затронут. Если он продолжал регистрироваться не определенно через 1 секунду, вы бы знали, что прототип меняется. (вам все равно следует избегать включения jQuery в два раза, это пустая трата трафика/батареи и т. д. и может повлиять на время загрузки)

Смежные вопросы