Почему глобальный объект jQuery перезаписывается после загрузки страницы?

#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 поэтому перезаписывался.