2013-07-27 90 views
0

我想要一個按鈕,在1秒後彈出。你不能夠按它,而它不是彈出Javascript布爾不起作用?

$(document).ready(function(){ 
    var pressed1 = false; 
    // Audio-Element 'audioElement' gets declared 
    $('#button1').bind("contextmenu",function(e){ 
    if(!pressed1){ 
     audioElement.play(); 
     pressed1 = true; 
     $('#button1').css({backgroundImage: "url(img/button_pressed.png)"}); 
     setTimeout('$("#button1").css({backgroundImage: "url(img/button.png)"}); pressed1 = false;', 1000); 
     return false; 
    }else{ 
     return false; 
    } 
    }); 
}); 

按鈕1秒「pressed1」設置爲「假」後彈出,但我無法再次按下按鈕。即使通過JavaScript控制檯將'pressed 1'設置爲'false'!

+4

將您的代碼從單引號中取出,並將其封裝在'function(){}'中。 – mash

+0

@Starx請參閱Matt Browne的回答。 – mash

+0

@Starx - 它是必要的。 Mash正在談論傳遞給'setTimeout()'的代碼,如果字符串中的代碼將在全局作用域中進行評估,並且不會看到'pressed 1'變量。 – nnnnnn

回答

4

由於@Mash建議,試試這個來代替:

$(document).ready(function(){ 
    var pressed1 = false; 
    // Audio-Element 'audioElement' gets declared 
    $('#button1').bind("contextmenu",function(e){ 
    if(!pressed1){ 
     audioElement.play(); 
     pressed1 = true; 
     $('#button1').css({backgroundImage: "url(img/button_pressed.png)"}); 
     setTimeout(function() { 
      $("#button1").css({backgroundImage: "url(img/button.png)"}); 
      pressed1 = false; 
     }, 1000); 
     return false; 
    }else{ 
     return false; 
    } 
    }); 
}); 

我相信,當您使用setTimeout有一串代碼進行評估,而不是一個功能,該代碼獲取評估內部使用eval(),它具有不同的範圍(無法訪問閉包中的變量)。

+1

...這是因爲當你傳遞一個字符串給'setTimeout()'時,它會在全局上下文中被評估,並且看不到本地'pressed 1'變量。與使用'eval()'相比,'_can_查看本地範圍... – nnnnnn

+0

謝謝,現在工作。我會盡快給出✔^ – Patrick

1

這是因爲變量pressed1是語言環境,如下圖所示,該ready()方法,其中使用的是如下圖所示的false值設置爲一個名爲pressed不是要針對在測試一個全局變量setTimeout設置它的函數

+0

是的,但是如果他使用我們一直建議的函數,那麼該函數將可以訪問'ready'函數中上面聲明的任何變量。 –

+0

@MattBrowne +1爲你正確的答案 –