2011-01-31 57 views
1

我想知道绑定表单字段上的单个change()事件是否足以在字段值更改时正确执行操作。jQuery - 绑定输入字段上的多个事件

还是应该绑定所有可能的事件?像这样:

$(this).bind('change keyup focus click keydown', function(){ 
     // ... 
    }).change(); 

另外,绑定多个事件是否会影响性能?

+0

那么,一些事件不会在值发生变化时引发。例如。当文本字段中的值发生变化时,如果单击文本字段,则不会更改“焦点”或“点击”,但不会更改该值。 – 2011-01-31 15:39:28

回答

3

change只会在该领域失去焦点(对于大多数输入)时触发。如果您想要更实时一些,请使用HTML 5 oninput事件。这几乎可以捕获输入元素的任何类型的值更改(并且它也会起泡!)。但在Internet Explorer 8及更低版本中不受支持,但I wrote a plugin针对这些浏览器映射到onpropertychange

参见:

对于事物的性能方面,每一个事件,你在不同的时间描述大火所以性能应该不会,除非一个问题。

+0

但它不工作..是因为我有xhtml文档类型? – Alex 2011-01-31 15:47:11

1

我认为没有性能损失,除非你在处理程序中做了非常缓慢的处理。

1

每个事件发生在不同的时间。可能会有一些重叠,但取决于你在做什么,他们可能会有很大的不同。例如,事件发生在input上的值已更新之后。而之前发生的是​​。这可以使您停止输入文本框中的值。

就性能而言,您将在此示例中运行五个不同事件的代码。与单一事件相比。至少你的代码应该区分事件之间的重叠。

2

只有在收听change事件可能已足够您(另请参阅@Andy E's answer)。从documentation

change事件发送到一个元素,当它的值发生变化时。此事件限于<input>元素,<textarea>框和<select>元素。对于选择框,复选框和单选按钮,当用户使用鼠标进行选择时,会立即触发事件,但对于其他元素类型,事件将被推迟直到元素失去焦点。

1

这样的问题:

$(this).bind('change keyup focus click keydown', function(e) { // ... 

是,你必须弄清楚哪些事件实际上被解雇,进入事件处理程序。

switch(e.type) { 
    case 'change': { 
     break; 
    } 
    case 'focus': { 
     break; 
    } 
    // ... 
} 

我只想绑定一个change事件,如果这对您已经足够了。因为clickchange之前发生火灾,focus发生在click之后等等,所以在发生所有这些事件时你会遇到很多麻烦。这很痛苦,找出并正确行事。