javascript包含一次,声明函数一次,绑定一次

时间:2010-11-25 16:44:01

标签: javascript

有没有办法只包含一次javascript文件或只声明一次函数?我遇到的问题是我有一个包含javascript include的HTML模块。那么这个模块加载一个循环,因此该文件被多次加载。我已经解决了大部分问题,但困扰我的是我知道同样的功能被多次创建,这个外观可以多达30次迭代。对我来说,我不喜欢这样一个事实,即一遍又一遍地创造同样的功能。我应该关心吗?有没有办法阻止这种情况?我知道我可以检测函数何时存在,我可以将函数声明放在if语句之间吗?

更新

我尝试过其中一条建议:

if(typeof btnSendInvite_click != 'function')
{
    function btnSendInvite_click()
    {
        alert("#invite_guest_" + $(this).attr("event_id"));
        return false;
    }
}

但这不起作用。我也试过了

if(!btnSendInvite_click)
    {
        function btnSendInvite_click()
        {
            alert("#invite_guest_" + $(this).attr("event_id"));
            return false;
        }
    }

但它不起作用。会发生什么事情,我有这条线:

$(document).ready(function()
                    {
                        $(".btnSendInvite").bind("click", btnSendInvite_click);
                    });

当单击按钮时,该函数执行六次,这是文件被包含的次数,它告诉我多次创建函数...我想。

更新

经过多次努力之后,这个问题变成了与我想的不同的东西。绑定被多次调用,因此它被绑定多次,因此多次调用该函数。我想我的下一个问题是,有没有办法将一个函数绑定到一个控件只有一次?我已经尝试了jquery“one”,它不起作用。

3 个答案:

答案 0 :(得分:3)

是的,你可以(run on jsfiddle)。

if (!window.myFunction) {
    window.myFunction = function() {
        //...
    }
}

修改:在您的情况下,它将是:

if (!window.btnSendInvite_click) {
  window.btnSendInvite_click = function() {
    alert("#invite_guest_" + $(this).attr("event_id"));
    return false;
  }
}

bind()的调用也必须在该条件块中。

注意:以下变体不起作用,至少不适用于所有浏览器:

if (!window.myFunction) {
  function myFunction() {
    //...
  }
}

编辑2 :对于您的更新:

调用bind时声明变量。

if (window.iBoundThatStuff!=true) {
    iBoundThatStuff=true;
    //call bind() here
}

答案 1 :(得分:0)

是的,您应该担心多次不包含脚本文件,而不是多次声明该功能......

对于第一部分,您可能需要考虑更改html结构,以便js文件只包含一次(即使浏览器缓存了js文件,第二次可能实际上没有进入服务器 - 取决于几个因素......仍有惩罚)

现在至于只声明一次你的函数,记住函数也是js中的对象(第一类公民),所以你可以测试一个函数是否已经定义好像你正在测试一个对象.... if(! window.myFunc){window.myFunc = function(){}} ...

你可能想看一下函数和js中的作用域......这里有一些链接

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

http://www.yuiblog.com/blog/2010/02/24/video-crockonjs-3/

http://www.slideshare.net/douglascrockford/crockford-on-javascript-act-iii-function-the-ultimate

答案 2 :(得分:0)

将JS包含在循环中是荒谬的。将你的JS移出循环。 JS可以判断函数是否已定义,但在JS中修复错误的服务器端循环绝对是一种不好的做法。