jQuery没有选择编程的element.onchange()调用

时间:2012-08-16 02:11:59

标签: javascript jquery forms

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

所以我有input使用Ryan Fait's custom elements plugin设置样式。

<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错误,尽管都没有收到。单击关联的change时会调用jQuery label处理程序。

我通过使用:

解决了这个问题
$(element).change();

所以我想知道,为什么jQuery没有选择element.onchange()的程序化调用?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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 );