2014-02-13 147 views
1

我有這個JS功能:運行JS函數一次

<script type="text/javascript"> 
        var counter = <?php echo $oak; ?>; 
        function myFunction() { 
         counter++; 
         document.getElementById('countervalue').innerHTML = counter; 
        } 
       </script> 

該功能一旦觸發點擊圖像上。我的問題是,我希望它只在第一次按下圖像時觸發。有任何想法嗎?提前致謝。

的html代碼:

<div class="cut_oak_tree"> 
      <img src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(this.outerHTML), myFunction()" /> <!--DO NOT CHANGE SRC --> 
      <br> 
      <img src="http://www.pbpixels.com/x/images/oak.png " onclick="loadXMLDoc(this.outerHTML), myFunction()" /> <!--DO NOT CHANGE SRC --> 
      <img src="http://www.pbpixels.com/x/images/oak.png " onclick="loadXMLDoc(this.outerHTML), myFunction()" /> <!--DO NOT CHANGE SRC --> 
     </div> 
+0

如何設置這是在點擊圖片叫什麼?告訴我們這個代碼。 – DontVoteMeDown

+0

一個布爾值來跟蹤它是否被點擊?從圖像中刪除點擊處理程序? – Teepeemm

+0

編輯的html代碼和好主意^ – user3287771

回答

2

嘗試this code

對事件調用(onclick="myFunction(this)"),那麼你的函數將看起來像function myFunction(img) {添加this。然後它裏面刪除其click處理程序:

img.onclick = null; 

最後的結果是:

function myFunction(img) { 
    counter++; 
    document.getElementById('countervalue').innerHTML = counter; 
    img.onclick = null; 
} 

而一個形象的例子:

<img src="http://www.pbpixels.com/x/images/oak.png " onclick="myFunction(this)" /> 

我不會用一個boolean像@SLoW建議,因爲這樣你將無法知道哪個圖像已被點擊。要做到這一點,你必須使用一個對象,並存儲每個圖像id - 或類似的東西 - 和它的clicked狀態。

+0

不錯,它幾乎工作,我的問題是,如果你足夠快地按下圖像,它仍然會在圖像被刪除前計數1:o因此,基本上,你可以從同一棵樹 – user3287771

+0

@ user3287771獲得5次點擊,但是在你的帖子上沒有任何關於*刪除*圖片的內容..所以我不能說什麼。 – DontVoteMeDown

+1

嘗試移動上面的counter ++ img.onclick.null,看看是否有幫助。 – snollygolly

0

我想創建一個名爲isClicked變量,在加載頁面時,將其設置爲false,然後將其設置爲true點擊圖像時。然後在增加計數器之前編寫if聲明以確保isClickedfalse

<script type="text/javascript"> 
     var counter = <?php echo $oak; ?>; 
     var isClicked = false; 
     function myFunction() { 
      if (isClicked === false){ 
       isClicked = true; 
       counter++; 
      } 
     document.getElementById('countervalue').innerHTML = counter; 
    } 
</script> 
+0

完美的作品,唯一的問題是我有三個圖像使用相同的功能,它每次按下圖像時都必須計數1。有任何想法嗎?謝謝 – user3287771

+0

我假設你想要分別跟蹤每個圖像的點擊次數?採用布爾方法,可能是布爾數組,每個布爾值都跟蹤,或者使用@DontVoteMeDown的方法將img作爲參數傳遞給函數並刪除點擊處理程序。這似乎工作。 – snollygolly

1

添加標記

function myFunction() { 
    if(!myFunction.invoked){ 
     counter++; 
     document.getElementById('countervalue').innerHTML = counter; 

     myFunction.invoked = true; 
    } 
} 

myFunction.invoked = false; 
1

刪除onclick句柄,通過向您點擊的功能元素:

<img src="http://www.pbpixels.com/x/images/oak.png " onclick="loadXMLDoc(this.outerHTML); myFunction(this)" /> 

function myFunction(elm) { 
    elm.onclick = null; // Remove the onclick 
    counter++; 
    document.getElementById('countervalue').innerHTML = counter; 
} 
1

,如果你有興趣在一個jQuery方法,您可以使用。一()! http://api.jquery.com/one/

var counter = <?php echo $oak;?> 

    $(".cut_oak_tree img").one("click",function(){ 
      counter++; 
      $("#countervalue").text(counter); 
    }); 
+0

我看不到任何有問題的jquery標籤。 http://youmightnotneedjquery.com/ – DontVoteMeDown

+0

我絕望地愛上了jquery:P http://designm.ag/resources/5-reasons-why-i-love-and-am-sticking-with-jquery/ – alex

1
// the wrapper that allows to call the inner function only once 
function once(inner) { 
    var executed = false; 
    return function (args) { 
     if (executed === false) { 
      executed = true; 
      inner.apply(this, arguments); 
     } 
    } 
} 

// a test function that should only be called once 
var inner1 = function (name, age) { 
    window.alert("1 " + name + " -> " + age); 
} 

// another test function 
var inner2 = function (name, age) { 
    window.alert("2 " + name + " -> " + age); 
} 

// testing 
var wrapped1 = once(inner1); 
wrapped1("Tom", 23); 
wrapped1("Tina", 24); 
wrapped1("Toby", 25); 

var wrapped2 = once(inner2); 
wrapped2("Tom", 23); 
wrapped2("Tina", 24); 
wrapped2("Toby", 25); 
+0

對不起,但是,WTH?!? – DontVoteMeDown

+0

什麼不清楚?問,我會盡力解釋它。這個解決方案的關鍵點在於,用'一次'你可以將功能外包的問題只能執行一次。它可以重複使用。 – Thekwasti

+0

看起來像這就像jQuery(http://api.jquery.com/one/)中的'.one'函數。 – Thekwasti