11

直到最近,我一直在并排使用 jQuery 和 YUI,没有任何问题。有时,在 YUI 按钮的回调内部,$会被其他一些函数遮蔽(点击查看大版本): 安慰

对于我的一生,我无法弄清楚为什么会这样。是的,我知道我可以安全地使用jQueryorwindow.$无处不在,而不仅仅是$,但这只是一种解决方法,而不是实际的修复。

在运行时,我怎样才能找到这个$冒名顶替者的来源?- 例如找到它的声明位置,以及为什么它在我的出血范围内。


事实证明,这种行为很容易在 Stack Overflow 上重现(至少在 Chrome 和 Firefox 4 中),因为 SO 使用 jQuery(再次点击查看完整尺寸):

更多控制台 还有更多控制台

我只能推断$

function () {
    return document.getElementById.apply(document, arguments)
}

必须来自控制台本身!

找到了。

with又罢工了。

在此处输入图像描述 在此处输入图像描述

Chromium 错误:http ://code.google.com/p/chromium/issues/detail?id=70969

4

4 回答 4

2

我敢打赌这不会发生在 IE 中?这是我能找到的唯一提示:

http://davidwalsh.name/dollar-functions

http://dam5s.tumblr.com/post/3079779011/bug-in-chromes-javascript-console

Chrome/Firefox/Safari 中的某种错误。

于 2011-02-12T00:54:33.763 回答
2

这里有一些东西可以尝试。Firebug 的调试器向您显示范围内可用的所有变量,在您的示例中,它显然不是本地范围,而且它也不是全局的,因为您已经测试了 window.$。因此,它的 has(?) 是一个闭包变量(应该在同一个文件中)。

随附的屏幕截图显示了可用的闭包范围Firebug 调试器

该示例显示 $.each 中的数据可用作闭包变量。同样,根据我的理论,您应该能够通过在页面上查找 $ 的实例来找到罪魁祸首,因为闭包是词法定义的。也许有一个像 jquery 插件一样传入 $ 的自调用函数。

于 2011-02-12T00:55:15.650 回答
0

你可以尝试使用 jquery.noConflict http://api.jquery.com/jQuery.noConflict

于 2011-02-12T01:40:31.513 回答
0

使用监视表达式...

  • 设置一个检查 $ 是否正确的函数,可能是 jQueryCheck(),如果不正确则发出警报。

    函数 jQueryCheck(){ if(!$.filter) alert('wtf'); }

  • 在您期望代码中出现问题之前的某个步骤添加断点。

  • 添加一个运行 jQueryCheck() 的监视表达式。

  • 点击断点,然后继续点击下一步。当变量变为无效时,将弹出警报,然后您将在更改发生后上线。

这是我用来测试的代码

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script>
function invalid(){
    /* set breakpoint on loop below
        click invalid button
        add watch expression jQueryCheck()
        click nextstep repeatedly until wtf alert
    */
    for(var i=0; i<100; i++){
        if(i == 10)
            $ = 10;
    }
}
function valid(){
    $ = jQuery;
}
function jQueryCheck(){
    if(!$.filter)
        alert('wtf');
}
</script>

<input type="button" onclick="valid()" value="run valid">
<input type="button" onclick="invalid()" value="run invaid">
于 2011-02-12T00:55:38.373 回答