jQuery如何保护覆盖jQuery和$

时间:2010-12-16 22:21:50

标签: javascript jquery

jQuery source中定义jQuery的本地副本后立即找到这些变量。

// Map over jQuery in case of overwrite
_jQuery = window.jQuery

// Map over the $ in case of overwrite
_$ = window.$

可以阅读评论并知道原因......但

  • 这些代码行如何执行此操作?

  • 添加类似内容会保护我的个人命名空间还是更深层次的源代码?

  • 如果不在源代码中,可能会发生什么坏事?

5 个答案:

答案 0 :(得分:4)

如果查看jquery.js文件,您会发现它们首先保存以前的定义(第31-32行v1.4.4行):

// Map over the $ in case of overwrite
_$ = window.$,

然后,如果您致电noConflict,则只需将值设置回来(第397-398行)

noConflict: function( deep ) {
    window.$ = _$;

您可以添加与您自己的项目类似的内容来保护名称空间。这个概念不仅仅适用于javascript。

如果没有包含这些行,那么你将无法在同一页面上运行jQuery和Prototype,因为它们都使用$运算符 - 没有什么不好可能发生,只是你的代码不会工作并可能导致错误。

答案 1 :(得分:3)

  

jQuery如何保护覆盖jQuery和$

它没有(但见下文)。如果你加载jQuery,然后加载其他东西给那些符号写入别的东西,它们将不再与jQuery相关联。例如:

HTML:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1/prototype.js"></script>

JavaScript的:

window.onload = function() {
  // Outputs false, because Prototype has overwritten it
  display("Does $ === jQuery? " + ($ === jQuery));

  // Outputs true, because Prototype has overwritten it
  display("Does $('foo').id === 'foo'? " + ($('foo').id === 'foo'));

  function display(msg) {
    var p = document.createElement('p');
    p.innerHTML = msg;
    document.body.appendChild(p);
  }
};​

Live copy

但是似乎来保存它们。怎么样?

答案是closures。它在其作用域函数中有一个本地引用,它与全局引用(window上的属性)没有关联,所以内部它不关心你是否覆盖这些符号。当然,关心,如果你覆盖$ jQuery,因为如果你这样做,你就无法调用jQuery。 :-)但是如果你只覆盖$,这不是问题,只需使用jQuery或者如果你不喜欢打字(让我们面对它,这很尴尬),那就这样做:

(function($) {
    // Your usual jQuery code here using `$`,
    // this code runs immediately
)(jQuery);

... 在匿名函数(同时定义和调用)中本地阴影 $符号。如果您正在使用ready事件:

,jQuery会使这一点变得特别容易
jQuery(function($) {
    // Your usual jQuery code here using `$`,
    // this code runs when the DOM is ready (see
    // the `jQuery.ready` function).
});

答案 2 :(得分:1)

如果你要包含另一个类似原型的库,它使用$,那么jQuery需要引用$window.jQuery才能支持jQuery.noConflict()功能等...

http://api.jquery.com/jQuery.noConflict/

使用

$是因为它很方便,但这可能会被多个库使用。

这有帮助吗?

答案 3 :(得分:1)

Javascript无法提供您正在寻找的保护。

JQuery并没有“保护”这些变量。它只是将引用$jquery复制到另外两个变量中。您阅读的代码等同于:

var obj1 = {}; /* create an empty object and reference it as obj1 */
var obj2 = obj1; /* made a second reference to that same object */

此代码不会“保护”obj1。以后您的代码更改obj1

的值是完全有效的
obj1 = 'foo'; /* now obj1 references a string */

obj1并没有“神奇地保留其价值”;在那一行之后,它只是一个字符串。但该对象仍可在obj2中使用。

答案 4 :(得分:0)

这些行的目的是能够恢复原始的$jQuery全局变量,以防jQuery本身覆盖它们。它没有做任何事情来保护其他代码不会覆盖jQuery。

如果要保护自己的命名空间,可以执行setInterval,检查全局变量是否仍然是对象的instanceof(仅当对象在闭包内受保护时,否则也可以修改) )。但是,这不是一个好的做法,因为javascript的想法是能够扩展和定制。将控件交给开发人员,不要试图“锁定”对象。