有没有办法只包含一次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”,它不起作用。
答案 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中修复错误的服务器端循环绝对是一种不好的做法。