2

这是一个似乎已经被问过几次的问题的具体变体,如果答案已经存在,我们深表歉意。

我有一个带有菜单栏和大型内容 div 的标准网站。每次呈现页面时,我都想运行许多 javascript 函数,也就是说 - 在初始加载和更新中心内容 div 的任何 ajax 调用之后。

我知道我需要在 ajax 调用的“成功”部分调用它们——但我试图避免的是一个巨大的调用列表都在一个地方。我有大约 30 个 javascript 文件,我想将它们分开而不是相互依赖。

我正在尝试设置的是一个中央“功能注册表”——这就是我到目前为止所拥有的——

var rebind = function(){

    var functions = [];

    var add = function(f){
        functions.push(f);
    }

    var call = function(){
        for (i = 0; i < functions.length; i++) {
            functions[i]();
        }
    }

    return {
        add: add,
        call: call
    }
}();

这是我如何调用这个函数 -

$(function() {
    rebind.call();
});

$(document).on("click", "a.ajax-content", function() {
    var url = $(this).attr("href");
    $("div#content").load(url, function() {
        rebind.call();
    });

    history.pushState(null, null, url);
    event.preventDefault();
});

这是我如何注册函数的示例,以 Datepicker 为例。

rebind.add(function() {
    $(".dm-type").datepicker({
        dateFormat: "dd/mm",
        changeYear: false,
        changeMonth: true
    });
});

澄清一下,我尽可能使用 $(document).on('click'...。此方法仅适用于需要在页面加载后调用的函数。document.ready 的全局版本也可以处理AJAX 调用。

这似乎是一个好主意,但它不是 100% 工作的。我得到了一些无限循环,例如 jquery-raty。

有没有人为此提出一个好的解决方案?我查看了 livequery,它没有处理我需要的所有内容,我读到不建议这样做,因为它会减慢速度。如果有一个简单的解决方案,那将对我有很大帮助。

谢谢!詹姆士

4

1 回答 1

0

我会使用不同的技术,因为您已经在使用 jQuery - 委托!

将自定义事件附加到您的主体并将其用作侦听器,即您可以创建多个函数调用,甚至管理从那里触发的调用。

 //in a global file    
 $(document.body).on('myCustomEvent',function(event, data){
    //console.log(event,data);
    //manage your function calls here.
    //You can pass data through and have your logic here too.
    if(data.somedata || data.someotherdata) datepicker();
});


//in a singular file
$(document).on("click", "a.ajax-content", function() {
    var url = $(this).attr("href");
    $("div#content").load(url, function() {
        $(document.body).trigger('myCustomEvent', [{somedata:true}]);
    });
    history.pushState(null, null, url);
    event.preventDefault();
});

您还可以在所有单独的脚本文件中将侦听器附加到主体,并且任何脚本触发的每个触发器都会在所有其他脚本等中触发它。

于 2013-09-20T08:43:18.200 回答