2014-02-13 149 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