从jQuery选择器传递给处理函数的对象的名称是什么?

时间:2013-08-06 13:15:07

标签: jquery local-variables

我不理解 Firefox 22.0 中jQuery 1.9.1的以下行为,因为以下代码( jsFiddle )不会产生 ReferenceError 符合预期(甚至不在strict mode中),但会返回一个对象

$("#press").click(function(){
    console.log(press);
});

我想阅读一些文档或解释 - 这是有用的还是我应该避免这个?为什么它不会覆盖从外部范围继承的变量?

我不知道要搜索什么 - 此功能是否有名称?或者对于这种被推入处理函数的对象?

更新 - 请注意,对象press与从id创建的其他全局对象不同 - http://jsfiddle.net/Aprillion/BgsZn/2/

$("html #outer #press").click(function(){
    console.log(output);
    console.log(outer);
    console.log(press);
});

[14:23:02.632] [object HTMLDivElement]
[14:23:02.632] [object HTMLDivElement]
[14:23:02.632] ({jQuery19108414748019423938:2})

3 个答案:

答案 0 :(得分:2)

这与jQuery无关,它与某些浏览器为具有ID / name属性的元素定义全局变量这一事实有关。由于您的元素具有press ID属性,因此press变量引用该DOM元素。

答案 1 :(得分:1)

这是浏览器中的常见行为,当向文档添加具有ID属性的元素时,浏览器还将在window中显示一个属性,其中元素的ID作为名称,元素作为值。如果兼容性是一个问题,我不会依赖它,因为(a)它没有在我能找到的任何通用标准中明确列出,并且(b)如果你不小心,魔术变量会引起各种令人头疼的问题。但目前5种常见浏览器中至少有4种是这样做的。 (IE,Chrome,Opera和Firefox都可以,虽然FF的网络控制台相当不稳定。我没有Safari可以测试。)

至于为什么您的按钮显示为({jQuery##########:2})

当jQuery将事件处理程序(或其他类型的数据)添加到元素时,它会设置名为'jQuery' + the version digits + a big random number的属性,并且该值为唯一整数。关于资源等的东西。

无论如何,与Firefox的内置控制台结合使用是相当愚蠢的。在向元素添加属性的瞬间,控制台会忘记它是一个元素。例如,在任何现有页面中弹出控制台(即使about:blank也会这样做)并尝试按顺序键入这些内容(当然,您可以跳过评论):

d = document.createElement('div')     // [object HTMLDivElement]
d                                     // [object HTMLDivElement]

// all's good so far...
d.id = 'stuff'                        // "stuff"
d                                     // [object HTMLDivElement]

// now set a property the browser doesn't define
d.randomProperty = 42                 // 42
d                                     // ({randomProperty:42})

// still an element, though
d.id                                  // "stuff"

txt = document.createTextNode('test') // [object Text]
d.appendChild(txt)                    // [object Text]
d                                     // ({randomProperty:42})

// and once the property's gone...
delete d.randomProperty               // true
d                                     // [object HTMLDivElement]

问题在于控制台,而不是浏览器或jQuery。元素仍然是元素,对于你想要用它们做的任何元素的东西,它仍然可以正常工作。

答案 2 :(得分:0)

Does a jQuery selector by id always work without quotes and # sign?

代码中的press变量与$('#press').click事件无关。