在条件下开火所有事件,否则不开火

时间:2015-05-08 15:48:53

标签: javascript jquery javascript-events

我正在使用现有的javascript(我无法改变)并需要检查提交上的内容。

如果我的条件为真,则不应该应用其他提交处理程序。

如果我的条件为假,则应适用所有其他提交处理程序。

到目前为止我尝试过:

var form = jQuery('form'),
that = this,
events = $._data(form[0]).events['submit'];

form.off('submit');
form.on('submit', function (event) {
    if (that.myCondition()) {
        event.preventDefault();
        event.stopPropagation();
        return false;
    } else {
       console.log('Call these: ', events);
    }
});

此时events始终为空。

我打电话给form.off('submit')时它是空的,我也没有让它与深度克隆一起工作。

更新: 在这个jsfiddle中,您会看到两个事件都被触发了。我想要一个(最好是我添加LAST 的一个)被解雇并防止另一个被解雇。

2 个答案:

答案 0 :(得分:1)

如果我的要求正确,你可以试试像

这样讨厌的黑客
getInstance(non-null stuff)

演示:Fiddle

答案 1 :(得分:1)

尝试使用$.Callbacks("stopOnFalse")

var callbacks = $.Callbacks("stopOnFalse");
// if `input.val().length === 0` `fn1` not called
var fn2 = function fn2(event) {
    // `this`:`form` element
    // console.log(this); 
    event.preventDefault();
    event.stopPropagation();
    console.log('1st submit called:', input.val().length);
    if (input.val().length === 0) {
        // `input.val().length === 0`
        // do stuff , do not do stuff ? here
        output1.html('Input needed!');
        // reset `output2` `html`
        output2.html("...");
        // return `false` to "stop" `callbacks` queue;
        // `fn1` not called
        return false;
    }
};
// if `input.val().length !== 0` , `fn1` called,
// else `fn1` not called
var fn1 = function fn1(event) {
    // do stuff 
    // call `event.preventDefault();` , here, if needed;
    // else call `output2.html('success!');` , submit form
    // event.preventDefault();
    console.log('2nd submit called:', input.val().length);
    output2.html('success!');
};
// add `fn2` , `fn1` to `callbacks` queue
callbacks.add(fn2, fn1);
// call both `fn2` , `fn1` if `input.val().length !== 0` ,
// else, do not call `fn1`
form.on('submit', function (event) {
    // `fire` `callbacks` `fn2` , `fn1` with context `this`:`form` ,
    // pass `event` as parameter to `fn2`, `fn1`
    callbacks.fireWith(this, [event])
});

jsfiddle http://jsfiddle.net/bkdm7fzt/3/