在创建事件处理程序时,jQuery是否会修改目标元素?

时间:2011-09-08 20:59:31

标签: javascript javascript-events jquery

例如:

$("myElement").click(function(){
alert("Clicked!");
};

#myElement是否已被修改,onclick属性设置,或者jQuery是否只设置了一个监听器?

4 个答案:

答案 0 :(得分:3)

click()函数更改任何DOM属性。

它为该特定的jQuery元素添加了一个监听器。

同样适用于.change(), .keyup(), ...等。

答案 1 :(得分:0)

如果使用.click();

,jQuery会设置一个监听器

答案 2 :(得分:0)

它不会修改元素。

  

jQuery() - 也可以写成$() - 搜索DOM   对于与提供的选择器匹配的任何元素,并创建一个新元素   引用这些元素的jQuery对象

答案 3 :(得分:0)

查看jQuery 1.6.2源代码:

$("myElement").click(...) calls: $("myElement").bind('click', ...) 
which then calls: jQuery.event.add(...) 
which ultimately does either elem.addEventListener(...) or elem.attachEvent(...)

因此,我们可以肯定地说它没有设置onclick属性(这是我们所期望的,因为addEventListener更具可扩展性)。

但是,当我逐步执行.click()函数时,将一个属性 添加到DOM对象中。它与jQuery的数据函数有关,它在jQuery的数据函数中的这段代码中,它是从event.add(...)调用的。它看起来像jQuery用来跟踪哪个对象而不保留DOM引用(可能导致内存泄漏)的某种guid标识符。添加该属性的代码位于:

   if ( !id ) {
        // Only DOM nodes need a new unique ID for each element since their data
        // ends up in the global cache
        if ( isNode ) {
            elem[ jQuery.expando ] = id = ++jQuery.uuid;
        } else {
            id = jQuery.expando;
        }
    }

因此,总而言之,jQuery没有触及.onclick属性,但是在设置第一个事件处理程序时,它在DOM对象上至少设置了一个其他属性。