如何更改同一事件的事件触发顺序
How do you change the event firing order of the same event?
Jquery 绑定很棒,但我不知道绑定以什么顺序发生。因此,我目前的问题是:
$(document.body).delegate('form', methods.checkForm);
$('form').bind('submit', methods.submitFormIfCheckedFormIsTrue);
methods.checkForm = function (e) {
if (!$(this).isVerified()) {
return false;
}
return true;
};
methods.submitFormIfCheckedFormIsTrue = function (e) {
e.preventDefault();
$.ajax("/submitForm", {
data:$(this).serialize(),
type:"post"
});
};
这显然不是我正在使用的实际代码,但它非常接近。发生的情况是,submitFormIfCheckedFormIsTrue 函数在 checkForm 函数之前或期间触发,因此检查非常无用。我的技巧是将类"checked"添加到表单中,并检查表单是否在其他函数中具有该类......但是,您单击"提交",它会检查,然后如果一切正常,则必须再次单击它才能提交...这是迟钝的。
关于这个问题的另一件重要的事情是,由于无法更改的原因,它们位于我应用程序的完全不同的部分。此外,它们正在异步加载。
那么我想知道的主要事情...是如何更改顺序,或以某种方式设置事件的优先级......
示例中使用"委托",那么ajax提交总是会首先运行,所以对你的问题的简短回答是"你不能"。您的委托附加到 'body' 元素,因此附加到更接近 DOM 树中表单的元素的事件将首先触发。
事件从表单 -> 正文冒泡,因此执行此操作时没有排序。
一种选择是让您的验证触发第二个事件。
methods.checkForm = function (e) {
e.preventDefault()
if ($(this).isVerified()) {
$(this).trigger('form-verified');
}
};
然后,与其将另一个处理程序绑定到'submit'
,不如将其绑定到'form-verified'
。
$('form').bind('form-verified', methods.submitFormIfCheckedFormIsTrue);
这也是完成排序事件的另一种方法,如果它们附加到同一元素而不是使用委托。
此外,如果您使用的是jQuery>= 1.7,那么您应该使用on
而不是bind
和delegate
http://api.jquery.com/on/。
更新
如果两者都绑定到同一元素,则它们将按照它们附加到元素的顺序触发。假设 checkForm 绑定在另一个事件之前,那么问题是如果其他事件附加到同一元素,return false;
不会阻止它们触发。为此,您还需要e.stopImmediatePropagation()
.
methods.checkForm = function (e) {
e.preventDefault()
if (!$(this).isVerified()) {
e.stopImmediatePropagation();
}
};
如果您必须调整事件的顺序,这里还有一个有用的答案。 jQuery 事件处理程序总是按照它们绑定的顺序执行 - 有什么办法解决这个问题吗?
在一般意义上,事件处理程序将按照它们被绑定的顺序调用,但前提是它们绑定在同一级别。在您的情况下,您将一个直接绑定到窗体,而另一个是在document.body
级别绑定的委托处理程序。直接绑定的事件将首先发生,然后事件冒泡由另一个处理。
如果使用 .delegate()
将两个处理程序绑定在同一级别,则应按顺序调用它们:
$(document.body).delegate('form', 'submit', methods.checkForm);
$(document.body).delegate('form', 'submit',
methods.submitFormIfCheckedFormIsTrue);
然后在第一个(泛型(处理程序中,您应该调用 event.stopImmediatePropagation()
方法来防止调用其他处理程序(请注意,只需返回 false 即可防止默认值并阻止事件进一步冒泡,但它不会阻止该级别的其他处理程序运行(:
methods.checkForm = function (e) {
if (!$(this).isVerified()) {
e.stopImmediatePropagation();
return false;
}
return true;
};
(顺便说一下,问题中显示的代码省略了.delegate()
调用中的事件(第二个参数( - 我已经把它放在我的代码中。
或者直接绑定两个处理程序,而不是使用 .delegate()
。说到使用.delegate()
,如果你使用的是最新版本的jQuery,你可能想切换到使用.on()
,新的全能事件绑定方法。
"发生的情况是,submitFormIfCheckedFormIsTrue 函数在 checkForm 函数之前或期间触发">
肯定之前,而不是期间。(在几乎所有浏览器中(JavaScript 在单个线程上运行,因此您永远不会同时运行两个函数。
- 多个jQuery.on()事件无法运行xBrowser(取决于顺序)
- javascript中无法正常工作的事件顺序
- javascript执行事件顺序
- Rails 4 主干网的事件顺序 需要加载
- Mouseover和Mouseout之间的事件顺序
- jQuery delegate()/on()-强制事件顺序
- 表单事件顺序-在前端使用表单数据
- jQuery UI可拖动事件顺序
- 在IE中处理Javascript事件顺序
- 事件顺序,点击< >标签
- 在FullCalendar AgendaDay视图中更改事件顺序
- jquery-mobile事件顺序和为什么setTimeout设置$this为undefined
- 在主干js中模型更改事件顺序
- html中Select元素的事件顺序
- 使用jQuery UI datepicker验证日期范围:事件顺序
- Stripe webhooks事件顺序
- HTML & lt; a>标记事件顺序
- Backbone.js中视图绑定的事件顺序是什么
- 触发 DOM 元素事件时的事件顺序
- 如何更改x可编辑事件顺序