2014-02-13 2 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:

Добавить this на вызов события (onclick="myFunction(this)"), то ваша функция будет похожа function myFunction(img) {. Затем внутри него удалить его 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 Таким образом, вы можете получить как 5 кликов из того же дерева – user3287771

+0

@ user3287771, но есть ничто на вашем сообщении не говорит о * удалении * изображения. Поэтому я ничего не могу сказать об этом. – DontVoteMeDown

+1

Попробуйте переместить img.onclick.null над counter ++ и посмотреть, поможет ли это. – snollygolly

0

Я бы создать переменную isClicked, установите его в false при загрузке страницы, а затем установить его в true, когда изображение щелкнули. Затем напишите заявление if, чтобы убедиться, что isClicked - false, прежде чем увеличивать счетчик.

<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 подходе можно использовать .one (!) 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

i безнадежно влюблен в 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

Что именно неясно? Спроси, и я попытаюсь объяснить это больше. Ключевым моментом этого решения является то, что с 'once' вы передаете на аутсорсинг задачу создания функций только один раз. Его можно использовать повторно. – Thekwasti

+0

Похоже, что это похоже на функцию '.one' из jQuery (http://api.jquery.com/one/). – Thekwasti

Смежные вопросы