Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Refactor$(document).ready()当前有2个实例_Javascript_Jquery_Refactoring - Fatal编程技术网

Javascript Refactor$(document).ready()当前有2个实例

Javascript Refactor$(document).ready()当前有2个实例,javascript,jquery,refactoring,Javascript,Jquery,Refactoring,我有以下JavaScript函数,但希望重构$(document).ready(),因为我有它的2个实例。我怎样才能做到这一点 FlashMessenger = { init: function() { setTimeout(function() { $(".flash").fadeOut("slow", function () { $(".flash").remove(); });

我有以下JavaScript函数,但希望重构$(document).ready(),因为我有它的2个实例。我怎样才能做到这一点

FlashMessenger = {
    init: function() {
        setTimeout(function() {
            $(".flash").fadeOut("slow", function () {
                $(".flash").remove();
            });
        }, 5000);
    }
}

SelectLanguage = {
    init: function() {
        $('#selectLanguageId').change(function() {
            $('#frmSelectLanguage').submit();
        });
    }
}

$(document).ready(FlashMessenger.init);
$(document).ready(SelectLanguage.init);

只需使用匿名函数将它们组合到一个调用中:

$(document).ready(function()
{
  FlashMessenger.init();
  SelectLanguage.init();
});

为$(document.ready)设置多个处理程序是完全可以接受的,尽管您可能有很好的理由这样做,但我不知道。您可能有兴趣知道$(handler)可以用作$(document)的速记。ready(handler):

如果你真的想在一次通话中使用它们,请尝试以下方法:

$(function() {
    FlashMessenger.init();
    SelectLanguage.init();
});

我认为op所说的是,“如果将来我在
document.ready
中调用第三个函数,那么我如何在不接触那段代码的情况下调用它?”

如果不需要多个
$(document).ready()
调用,只需创建一个名为
startupHooks
的数组,并将每个方法添加到其中:

startupHooks[ startupHooks.length ] = myNewStartupHook;
你的启动脚本可能看起来像

$(document).ready(function() {
    for( var i=0; i<startupHooks.length; i++ ) {
        startupHooks[i]();
    }
}
$(文档).ready(函数(){
对于(var i=0;i选项1

FlashMessenger = {
    init: function() {
        setTimeout(function() {
            $(".flash").fadeOut("slow", function () {
                $(".flash").remove();
            });
        }, 5000);
    }
}    
SelectLanguage = {
    init: function() {
        $('#selectLanguageId').change(function() {
            $('#frmSelectLanguage').submit();
        });
    }
}

$(function(){
    FlashMessenger.init();
    SelectLanguage.init();
});
选择2

FlashMessenger = {
    init: function() {
        setTimeout(function() {
            $(".flash").fadeOut("slow", function () {
                $(".flash").remove();
            });
        }, 5000);
    }
}

SelectLanguage = {
    init: function() {
        $('#selectLanguageId').change(function() {
            $('#frmSelectLanguage').submit();
        });
    }
}

$(document).ready(function(){
    FlashMessenger.init();
    SelectLanguage.init();
});
选项3
实际上,您不需要这两个对象,因为它们只包含init方法,所以在我看来,这是最终的解决方案,除非您在其他地方使用这些对象

$(function(){
    $('#selectLanguageId').change(function() {
        $('#frmSelectLanguage').submit();
    });
    setTimeout(function() {
        $(".flash").fadeOut("slow", function () {
                $(".flash").remove();
        });
    }, 5000);
})

我喜欢2和3是有原因的。

首先,你没有理由把它们结合起来

但如果你想:

$(document).ready(function(jq){
    FlashMessenger.init(jq);
    SelectLanguage.init(jq);
});
细分:

  • 创建一个函数来执行所有初始化(它可以是命名的,也可以是匿名的;上面的一个是匿名的)
  • 让它调用其他init函数,传入jQuery传递给您的jQuery实例,以防它们使用它

您也可以选择将每个
init
调用包装在
try/catch
块中,这样一个init中的错误不会阻止下一个init的发生,但这取决于您的需要。

就我个人而言,我不赞成使用document.ready。 如果您将脚本放在html页面的末尾(就在标记之前),您可以随意编写脚本。 也许这对0.01%的脚本不起作用,但对我来说从来没有失败过

这样做的积极效果是,初始HTML+CSS呈现速度更快。
你也可以在yahoo上读到它。

你在那里遗漏了一些
)(至少)。几乎,但不完全。你需要用()调用init函数。你在那里遗漏了一些
)(至少)。(四个人犯了同样的错误?奇怪。)引用T.J.Crowder的话:“你遗漏了一些
)编辑:太晚了:)@JPot:但是,奇怪的是,四个不同的人会犯同样的两个错误。到目前为止,他们中只有两个人修复了其中一个错误,而没有一个人修复了另一个。@T.J.克劳德:复制粘贴有时可能是b****的。呃,谢谢你指出这一点。我有点心不在焉。编辑。@Skelton&Ben:Version仍然无法将jQuery传入函数的参数传递到
init
函数中。如果它们依赖它(这是常见的),它们将失败。@JPot:True,在这种情况下,我们可以看到它们没有。但是在一般情况下。。。
$(function(){
    $('#selectLanguageId').change(function() {
        $('#frmSelectLanguage').submit();
    });
    setTimeout(function() {
        $(".flash").fadeOut("slow", function () {
                $(".flash").remove();
        });
    }, 5000);
})
$(document).ready(function(jq){
    FlashMessenger.init(jq);
    SelectLanguage.init(jq);
});