0

我不理解Firefox 22.0中 jQuery 1.9.1 的以下行为,当以下代码(jsFiddle)没有按预期产生ReferenceError时(即使在严格模式下也没有),而是返回一个对象

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

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

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

更新- 请注意,该对象press与从ids 创建的其他全局对象不同 - 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})
4

3 回答 3

2

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

于 2013-08-06T13:20:31.923 回答
1

这是浏览器中的常见行为,当向文档添加具有 ID 属性的元素时,浏览器也会在其中显示一个属性,该属性以window元素的 ID 为名称,元素为值。如果兼容性是一个问题,我不会依赖它,因为(a)它没有在我能找到的任何通用标准中明确列出,并且(b)如果你不小心,魔法变量会导致各种头痛。但目前 5 种常见浏览器中至少有 4 种可以做到这一点。(IE、Chrome、Opera 和 Firefox 都可以,尽管 FF 的 Web 控制台对此相当不稳定。我没有 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。元素仍然是元素,并且对于您想要使用它们做的任何基本内容仍然可以正常工作。

于 2013-08-06T19:37:01.557 回答
0

id 的 jQuery 选择器是否总是在没有引号和 # 符号的情况下工作?

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

于 2013-08-06T13:22:22.743 回答