jQuery不会接受编程元素.onchange()调用

jQuery doesn't pick up programmatic element.onchange() calls

本文关键字:onchange 调用 元素 编程 jQuery      更新时间:2023-09-26

这更像是一个教育问题,而不是一个需要解决的问题。

所以我有一个使用 Ryan Fait 的自定义元素插件进行样式设置的input

<input type="checkbox" class="styled" id="no-favourite" />

我绑定了一个 jQuery change()处理程序:

$("#no-favourite").change(function(){
    console.log("changed"); 
});

并编辑了自定义元素插件的check方法,以包括:

try{
    element.onchange(); 
}catch(err){
    console.log(err);
}

这行不通。我预计会console.log"更改",最坏的情况是console.log错误,尽管两者都没有收到。jQuery change处理程序在单击关联的label时被调用。

我通过使用解决了这个问题:

$(element).change();

所以我想知道,为什么jQuery不对element.onchange()进行编程调用?

假设element是一个DOM元素(如果它是一个jQuery元素,它就会爆炸),你正在尝试调用元素的属性onchange

当您通过 jQuery 绑定事件处理程序时,它不会添加任何onchange属性 - 这些属性仅在内联(在标记中)或通过本机 javascript 绑定处理程序时才存在。

jQuery将使用其 API 绑定的事件存储在每个对象内的特殊data容器中,因此您不能真正使用本机方法调用它on*(只能使用 .onchange = function() 或内联onchange=进行本机设置)。

如果你启动你的控制台(chrome),并键入$.event,你会看到jQuery事件的内部表示形式,"默认"事件存储在$.event.global中,并在内部管理。

在 http://code.jquery.com/jquery-1.8.0.js 搜索jQuery.event.global[ type ]

    if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
        // No jQuery handlers for this event type, and it can't have inline handlers
        return;
    }
    // Caller can pass in an Event, Object, or just an event type string
    event = typeof event === "object" ?
        // jQuery.Event object
        event[ jQuery.expando ] ? event :
        // Object literal
        new jQuery.Event( type, event ) :
        // Just the event type (string)
        new jQuery.Event( type );