jQuery全局/本地事件执行顺序
jQuery global/local event execution order
我有一个带有按钮的面板小部件。单击该按钮应执行与所有此类小部件相关的一些全局操作,然后仅执行与该小部件实例相关的一些本地操作。全局操作通过CSS类绑定在一个单独的javascript文件中,如下所示:
var App = function ()
{
var handleWidgetButton = function ()
{
$('.widgetBtn').on('click', function (e)
{
// do smth global
});
return {
init: function ()
{
handleWidgetButton();
}
};
}
}();
jQuery(document).ready(function()
{
App.init();
});
在html文件中,本地脚本如下:
$("#widgetBtn1234").click(function (e)
{
// do smth local
});
目前,本地脚本是先执行的,然后才执行全局脚本,而我希望它是相反的。我试着用document.ready包装本地的,并在全局之后运行,但这似乎并没有改变执行顺序。有什么合适的方法可以将全局和本地jQuery绑定安排到同一个元素吗?
您遇到的问题来自于使用jQuery的.ready()函数初始化应用程序,而您的本地代码中似乎没有这样的包装器。请尝试以下操作:
var App = function ()
{
var handleWidgetButton = function ()
{
$('.widgetBtn').on('click', function (e)
{
// do smth global
});
return {
init: function ()
{
handleWidgetButton();
}
};
}
}();
$(function()
{
App.init();
});
然后在您的本地JS:
$(function() {
$("#widgetBtn1234").click(function (e)
{
// do smth local
});
});
注意,$(function(){})
可以用作$(document).ready(function(){});
的简写。此外,确保您的JS文件位于本地JS之前,因为javascript是按顺序运行的。
或者,您可以使用setTimeout()
来确保所有内容都正确加载:
(function executeOnReady() {
setTimeout(function() {
// Set App.isInitialized = true in your App.init() function
if (App.isInitialized) runLocalJs();
// App.init() hasn't been called yet, so re-run this function
else executeOnReady();
}, 500);
})();
function runLocalJs() {
$("#widgetBtn1234").click(function (e)
{
// do smth local
});
};
这个怎么样:
var widget = $("#widgetBtn1234").get(0);//get the vanilla dom element
var globalHandler = widget.onclick; //save old click handler
// clobber the old handler with a new handler, that calls the old handler when it's done
widget.onclick = function(e){
//do smth global by calling stored handler
globalHandler(e);
//afterward do smth local
};
可能有一种更具jqueryish风格的方式来写这篇文章,但我希望这个概念对你有用。
-------VVVV----为子孙后代保留古老的答案----VVVV-------
为什么不做这样的事?
var App = function ()
{
var handleWidgetButton = function ()
{
$('.widgetBtn').on('click', function (e)
{
// do smth global
if(this.id === 'widgetBtn1234'){
//do specific things for this one
}
});
return {
init: function ()
{
handleWidgetButton();
}
};
}
}();
请原谅我可能犯的任何语法错误,因为我还没有真正测试过这段代码。
查看我在jsbin上创建的简单JQ扩展。
http://jsbin.com/telofesevo/edit?js,控制台,输出
它允许在全局调用之后依次调用所有定义的个人点击处理程序,必要时处理遗漏的处理程序,并轻松重置所有个人处理程序。
- 如何在onclick事件执行代码时在ImageButton上设置加载gif
- 如果类有多个事件处理程序方法,如何防止多个事件执行
- 单击事件执行单击和悬停事件处理程序,即使单击事件处理程序取消绑定所有处理程序也是如此
- 对多个滚动事件执行一次操作并防止滚动
- jQuery全局/本地事件执行顺序
- 作为预生成事件执行PowerShell脚本失败
- 允许对目标事件执行默认操作,并阻止对父级执行默认操作
- 使用点击jquery事件执行css3转换
- 阻止.mouseout事件执行
- 无法通过键盘事件执行功能
- 循环中的Javascript onclick事件执行了1次以上
- 如何将多个事件处理程序添加到同一个html元素中,并根据事件执行不同的方法
- 在Angular 2中处理click和clickOutside事件执行优先级的最佳方式
- 在mustache模板中对点击事件执行函数
- Java脚本函数,直到save事件执行完成
- 每个事件执行多次代码:多次下载
- 当onclick事件执行异步代码时,我如何在新选项卡请求中打开
- 在所有控制器中对同一个事件执行同一个函数——AngularJS
- Jquery事件执行两次
- 对img load事件执行html注释