Javascript 支持后置回调的设计模式(例如处理hashchange)
在我的网页上,我有多个独立的插件(因为没有更好的词),它们都与浏览器的Javascript 支持后置回调的设计模式(例如处理hashchange),javascript,jquery,Javascript,Jquery,在我的网页上,我有多个独立的插件(因为没有更好的词),它们都与浏览器的location.hash交互。(我有一些代码可以将他们的工作分开,但这与这个问题无关。)例如,我有: // file1.js $(window).bind('hashchange', function(){ ... } ); // file2.js $(window).bind('hashchange', function(){ ... } ); 当页面加载后哈希值发生变化时,上述操作将按需要进行。但是,我还需要这段代码
location.hash
交互。(我有一些代码可以将他们的工作分开,但这与这个问题无关。)例如,我有:
// file1.js
$(window).bind('hashchange', function(){ ... } );
// file2.js
$(window).bind('hashchange', function(){ ... } );
当页面加载后哈希值发生变化时,上述操作将按需要进行。但是,我还需要这段代码来处理页面最初加载的任何哈希。如果我写这段代码:
// file1.js
$(window).bind('hashchange', function(){ ... } ).trigger('hashchange');
// file2.js
$(window).bind('hashchange', function(){ ... } ).trigger('hashchange');
…然后第一组代码将运行两次。不可取
在所有事件处理程序放置到位后,只有一次触发
hashchange
事件的好模式是什么?一个选项是命名事件处理程序和触发器的名称空间:
// file1.js
$(window).bind('hashchange.file1', function(){...} ).trigger('hashchange.file1');
// file2.js
$(window).bind('hashchange.file2', function(){...} ).trigger('hashchange.file2');
这将使两个处理程序在真正发生泛型
hashchange
事件时都运行,但只会在触发时使命名空间处理程序运行。一个选项是将处理代码分离为每个文件的单独函数,并仅调用该代码,显式:
// file1.js
function doStuff1(){ ... };
$(window).bind('hashchange',doStuff1);
doStuff1();
// file2.js
function doStuff2(){ ... };
$(window).bind('hashchange',doStuff2);
doStuff2();
也许:
// file1.js
$(window).bind('hashchange', function(){ ... } )
// file2.js
$(window).bind('hashchange', function(){ ... } )
// Actual page
$(window).trigger('hashchange');
像这样的东西行吗
function doStuff(){
//run some code only on the first execution
alert('execute miscellaneous code once on load');
function myHandler(){
alert('myHandler fired');
}
//or just execute the function that gets returned below
myHandler();
// return myHandler as the event handler
return myHandler;
};
$(window).bind('hashchange', doStuff() );
这使您能够灵活地以不同于后续hashchange
事件的方式处理初始加载
更新:
更改了上面的代码示例 我们的web应用程序也基于页面中的各种插件,并使用#键显示其状态 但不是在插件级别。
下面的代码是应用程序主js文件的一部分。
它在解析时运行一次
var hashChanged = function(){
//action to do when the # changed
$b.pub( ... );
};
/* avoid an error on older browsers */
if('onhashchange' in window){
window.onhashchange = hashChanged;
}
//start the app, the same way as an # change
hashChanged();
$b.pub
是一种告诉插件做什么的事件。一个合理的建议,所以+1。然而,我喜欢编写插件,这些插件可以在包含时自行工作;这个答案需要插件的使用者做一些额外的工作。