2011-04-23 44 views
0

我写包含在自执行功能的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源代码 - 并解释了为什么会发生这个问题。请参阅下面的答案。

+0

你确定你的函数正在执行? – 2011-04-23 06:16:11

+0

@Matt,是的。测试页面的其余部分起作用,并且插件中的所有内容(处理AJAX进展事件)都能正常工作。但是当我打开控制台并检查'$ .support.myproperty'时,它是未定义的,这很烦人,因为这意味着我的插件的用户无法利用该检查。 – kpozin 2011-04-23 06:17:48

回答

0

哇,我觉得很蠢。

我的测试代码(我未在问题中发布的部分)有意在jquery-1.5.2.js上调用jQuery.ajax()(因为这是测试进度事件的合理大文件)。但是,我忘记了,除非手动将dataType选项设置为script以外的其他选项,否则jQuery将评估由jQuery.ajax()检索的任何JavaScript。

因此,jQuery正在评估自己的源代码的新副本,因此window.jQuery被覆盖。

0

有些事情是错误的,因为我得到了correct output

+0

如果你看看由jsfiddle生成的代码,它们实际上将你的JavaScript代码包装在'$(window).load(function(){/ ** your code ** /})'中,所以它不是同一件事。我今晚没有时间,但明天我会尝试搭建一个独立的测试页面。 – kpozin 2011-04-23 06:24:53

+0

@ kpozin噢,忘了这件事。我改变了它,检查出来。相同的输出。 – alex 2011-04-23 06:26:06