#javascript #jquery #document-ready
#javascript #jquery #документ готов
Вопрос:
Я пишу расширение jQuery, содержащееся в самоисполняющейся функции:
(function($) {
// global variables for the purposes of this test
__$ = $;
__$support = $.support;
$.support.abc = "123";
// Setup for my extension goes here.
})(jQuery);
На моей тестовой странице у меня есть
<script type="text/javascript" src="jquery-1.5.2.js"></script>
<script type="text/javascript" src="myplugin.js"></script>
<script type="text/javascript">
$(function() {
console.log(__$ === $); // false
console.log(__$support === $.support); // false
console.log($.support.abc); // undefined
});
</script>
Почему это происходит? У меня нет других скриптов или плагинов jQuery, которые могли бы перезаписать jQuery
объект.
Я не смог найти, какой код в самом исходном коде jQuery перезаписывает jQuery
объект после того, как документ готов. Есть идеи?
Если нет способа избежать этого, какова была бы правильная процедура для определения новых свойств jQuery.support
объекта, к которым все еще можно получить доступ после того, как документ будет готов?
РЕДАКТИРОВАТЬ: я опустил важную часть моего тестового кода, которая непреднамеренно провела переоценку исходного кода jQuery — и объясняет, почему возникла эта проблема. Смотрите мой ответ ниже.
Комментарии:
1. Вы уверены, что ваша функция выполняется?
2. @Мэтт, да. Остальная часть тестовой страницы работает, и все в плагине (который имеет дело с событием AJAX onprogress) работает правильно. Но когда я открываю консоль и проверяю
$.support.myproperty
, он не определен, что раздражает, потому что это означает, что пользователи моего плагина не могут воспользоваться этой проверкой.
Ответ №1:
Что-то не так, потому что я получаю правильный вывод.
Комментарии:
1. Если вы посмотрите на код, сгенерированный jsfiddle, они фактически переносят ваш код JavaScript в
$(window).load(function() { /** your code **/})
, так что это не одно и то же. Сегодня вечером у меня нет времени, но завтра я попытаюсь создать отдельную тестовую страницу.2. @kpozin Ах да, забыл об этом. Я изменил это, проверьте это. Тот же результат.
Ответ №2:
Вау, я чувствую себя глупо.
Мой тестовый код (та часть, которую я не опубликовал в вопросе) был намеренно вызван jQuery.ajax()
на jquery-1.5.2.js
(поскольку это достаточно большой файл для тестирования событий прогресса). Однако я забыл, что если не установить для dataType
параметра что-то другое, отличное от script
, jQuery будет оценивать любой JavaScript, который извлекается jQuery.ajax()
вручную.
Итак, jQuery оценивал новую копию своего собственного исходного кода и window.jQuery
поэтому перезаписывался.