0

我有一个功能,当我按下按钮时会执行。
我不希望用户连续两次执行该函数。所以我使用了一个window变量。
我做了:

function a() {  
  if(window.infunction != undefined || window.infunction != null) {  
       return;  
  }  
  window.infunction = 'true';    
  //do stuff  
}  

在其他地方(按另一个按钮)我重置: window.infunction = undefined

这是使用全局变量的正确方法(至少满足我的需要)?

4

3 回答 3

3

函数是对象。它们可以像任何其他对象一样具有属性:

function a(){
    if (a.executed) return;
    a.executed = true;

    //do stuff
}

正如@Ian 在他的评论中提到的,您可以轻松地使该功能可重用。这可能是这种方法的优点,也可能是缺点。

正如@Dave 所说,它可以通过关闭来实现:

var a = (function (){
    var executed = false;

    return function (){
        if (executed) return;
        executed = true;

        //do stuff
    }
})(); 
于 2013-06-03T21:06:03.173 回答
3

不,没有充分的理由为此使用全局变量。只需将所有代码包装在一个函数中以避免污染全局命名空间就很容易了:

(function() {
    //all your code here
})();

但我认为更好的解决方案是在单击按钮时删除事件处理程序。这是一个例子:

HTML:

<button id="click_me">Click me</button>

JavaScript:

function click_function() {
    alert('You clicked the button with ID ' + this.id);
}

function click_listener() {
    click_function.call(this);
    this.removeEventListener('click', click_listener);
}

document.getElementById('click_me').addEventListener('click', click_listener);


或者,一些 JS 库可以很容易地分配一个只会触发一次的处理程序。事实上,我强烈建议您这样做:您不必键入几乎一样多的代码。例如,当使用 jQuery 时,你可以只写:

$('#click_me').one('click', function() {
    alert('You clicked the button with ID ' + this.id);
});

这与上面的代码做同样的事情,除了它兼容更多的浏览器,包括旧版本的 IE。

于 2013-06-03T20:51:58.263 回答
0

禁用按钮或隐藏它,这样用户就不会混淆为什么按钮在第一次单击后什么都不做。

function a(e) {
     e = e || window.event;
     e = e.target || e.srcElement;  
    // disable element
    e.disabled = true;
}


您应该只是取消绑定事件。

function a(e) {  
    // unbind the event
    e = e || window.event;
    e = e.target || e.srcElement;
    e.onclick = null;
}

于 2013-06-03T20:51:13.150 回答