绑定事件,停止多个操作

时间:2009-11-08 00:21:28

标签: jquery bind

我正在约束3个事件:

$("#form").bind('keyup change submit',function(event){
    //do something
    alert("test alert");
});

在表单中,您可以使用文本字段,下拉列表,复选框等....

根据我的注意,在您单击文本框的“外部”之前,“更改”事件不会被文本字段触发。 所以,我使用“keyup”活动,这对我很有用 并且“提交”事件是自我解释的。 (我基本上通过绑定这些事件来避免做多个选择器。) 我可能想稍后再添加更多活动。

这是我的问题......

当我对文本框进行更改时,弹出警报将触发2x。不确定是不是因为我点击弹出窗口上的按钮导致它,或者如果更改文本框中的值也可以触发keyup&同时改变事件。

无论哪种方式,它都让我疯狂。

有关改进此方法的任何想法,而没有多个选择器?

3 个答案:

答案 0 :(得分:1)

编辑:我刚刚看到你关于“没有多个选择器”的说明。如果需要,可以将以下内容链接起来,如果这样会以某种方式适合该法案。

为了最有效地记忆,我会将其分解为几个陈述。

//Your function
var handler = function(e) {  alert('blah'); };

$('#form input[type=text], #form textarea').keyup(handler);
$('#form select, #form checkbox, #form radio').change(handler);
$('#form').submit(handler);

这很好,因为元素只会触发一个事件,而且它可以帮助你。

另一方面,如果您期望IE 6支持,则在复选框/收音机/选择模糊之前不会触发更改事件,因此您可能希望以不同的方式处理这些事件(单击仍然可以很好地用于复选框/收音机)。

答案 1 :(得分:0)

为什么不在回调函数之外的某处设置布尔标志(当然仍然在共享范围内)。第一个调用将设置标志并执行,其他调用将看到标志并返回。您可以在用户关闭警告框时重置标记。

编辑:如果您仍希望不同的元素能够发出这些警报,则另一个选项是让处理程序将其自身删除为事件侦听器。然后,您可以在警报框关闭时重新注册。

答案 2 :(得分:0)

第二个警报由第一个警报触发。弹出第一个警报时,文本字段将失去焦点并触发更改事件。如果您的真实处理程序不会导致文本字段失去应该不是问题的焦点。但是,您可能希望忽略文本字段中的更改事件,因为您已使用keyup处理这些字段。
使用Ryan Lynch的旗帜创意,您可以执行以下操作:

var target = null;
$("#form").bind('keyup change submit',function(event){
    if (event.type == 'keyup') {
        target = event.target;
    // a change event after one or more keyup events in the same element
    } else if (event.type == 'change' && target === event.target) {
        //do nothing
        return false;
    }
    // actual handler code
    alert(event.type) // test code
});

在Firefox上测试过。我希望这会有所帮助。