【问题标题】:Call function once in jquery ready queue在 jquery 就绪队列中调用函数一次
【发布时间】:2011-05-18 08:07:23
【问题描述】:

我们的代码会输出几个脚本块,这些脚本块将相同的函数添加到文档准备好时调用的队列中。例如:

$(document).ready(function(){
    alert('hey');
});
$(document).ready(function(){
    alert('hey');
});
$(document).ready(function(){
    alert('hey');
});

这不会引起任何问题,但当然不必多次调用相同的代码。

在不改变生成重复块的代码的情况下,有没有办法让jquery只运行第一个代码块而跳过其余的?

请记住,在重复代码之前和之后,就绪队列有可能还有其他功能。

【问题讨论】:

  • 一开始为什么会有重复的代码?真的有必要吗?与其想出一个有效地消除对重复代码的调用的解决方案,不如找到问题的根源并删除重复的代码不是更好吗?
  • @netbrain 好主意!我已经向其他人简要介绍了您的启发性评论,他们正在忙于调查。至于可怜的灵魂还在试图回答这个具体的问题,他还在挖掘!
  • 在每一层后端和前端中保持代码干燥。在我看来,您在多个页面片段中拥有相同的 javascript 代码,并且当页面片段组装到单个 html 页面时,您会得到现在所经历的结果。这是一个正确的假设吗?

标签: javascript jquery code-duplication


【解决方案1】:

我会使用一个对象文字来包装重复的代码,并在它被调用一次时设置一个布尔值,这样它就不会再次运行:

$(document).ready(function(){
    DuplicateHelper.SomeMethod1();
});
$(document).ready(function(){
    DuplicateHelper.SomeMethod1();
});
$(document).ready(function(){
    DuplicateHelper.SomeMethod1();
});

var DuplicateHelper = {
    HasMethod1Run: false,

    SomeMethod1: function() {
        if (!this.HasMethod1Run) {
            // do logic

            this.HasMethod1Run = true;
        }
    }
}

编辑

如果您动态生成代码,则不必为代码使用对象字面量,但您可以使用与布尔值相同的原理:

var runCode = true;

$(document).ready(function(){
    if (runCode) {
        DuplicateHelper.SomeMethod1();
        runCode = false;
    }
});
$(document).ready(function(){
    if (runCode) {
        DuplicateHelper.SomeMethod1();
        runCode = false;
    }
});
$(document).ready(function(){
    if (runCode) {
        DuplicateHelper.SomeMethod1();
        runCode = false;
    }
});

但是,我同意 netbrain 的观点,即这种情况表明您的解决方案架构中的其他地方存在问题。

【讨论】:

  • 很好,但这会改变生成单个代码块的代码。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多