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。然而,我喜欢编写插件,这些插件可以在包含时自行工作;这个答案需要插件的使用者做一些额外的工作。