Javascript Refactor$(document).ready()当前有2个实例
我有以下JavaScript函数,但希望重构$(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(); });
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);
});