我不理解 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})
答案 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
事件无关。