2017-02-08 3 views
-2

Может быть, я не могу писать весь код здесь, но я думаю, что это может объяснить моя проблема:Добавить OnClick динамически с помощью JavaScript получить несколько же действие

for(var i = 0 ; i < 5 ; i++) { 
 
    $('#mybutton').on('click', function() { return false; }); 
 
    $('#mybutton').on('click', function() { myfunction('123') }); 
 
} 
 

 
function myfunction(text){ 
 
    console.log(text); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button id = 'mybutton'> My Button </button>

И результат:

Я получаю myfunction Выполнено 5 раз.

Мой Вопрос:

Как избежать MyFunction казнены 5 раз (я хочу, чтобы выполнить его 1 раз) не удаляя обхвата для дела мне нужно для моего случая? Я пытаюсь удалить событие onClick, но не работает.

Спасибо

+0

Просто нажмите один раз: D –

+3

Binding событие ** 10 ** раз на тот же элемент в 'for'. Просто удалите 'for'. – Tushar

+0

Или если вы не можете удалить 'for', просто привяжите событие * вне * его –

ответ

3

(я не знаю, почему вы действительно нужно прикрепить событие внутри для цикла), но вы можете dettach событие щелчка перед подсоединением следующий один с использованием метода jQuery .off().

off(): Удалить обработчик события.

Пример:

$('#mybutton').off('click').on('click', function() { myfunction('123') }); 

Надеется, что это помогает.

for(var i = 0 ; i < 5 ; i++) { 
 
    $('#mybutton').off('click').on('click', function() { myfunction('123') }); 
 
} 
 

 
function myfunction(text){ 
 
    console.log(text); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button id = 'mybutton'> My Button </button>

+0

Кажется совершенно ненужным для меня. – Tushar

+0

Мне тоже, но OP говорит, что без удаления цикла для причины мне это нужно для моего case_, поэтому я пытаюсь ответить на него. –

+2

Я думаю, что это лучший ответ, хотя, кажется, самый чистый способ .. lol. Я пытался найти что-то вроде '.once():' incase, что существовал и применял это, но он, вероятно, все еще будет перебирать его и запускать его 5 раз. x) – FllnAngl

0

Делают это, как показано ниже:

for(var i = 0 ; i < 5 ; i++) { 
    $('#mybutton').on('click', function() { return false; }); 
    if (i == 0) 
     $('#mybutton').on('click', function() { myfunction('123') }); 
} 
1

Следующая логика может быть лучше:

const myfunction = function (a) {console.log(a)}; 
 

 
const callback1 = function() { return false; }; 
 
const callback2= function() { myfunction('123') }; 
 

 
$('#mybutton').on('click', function (event) { 
 
    for (var i=0 ; i<=5 ; i++) { 
 
     callback1(); 
 
     callback2(); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<button id="mybutton">click me</button>

+0

Я не вижу здесь использования 'callback1', он просто возвращает' false' из него. Примечание. Это не препятствует действию по умолчанию и пузырьку события щелкнутого элемента. – Tushar

+0

уверен, что владелец вопроса не раскрывает свой код и не хочет идеи вообще. Я уверен, что 'callback1' в реальности содержит другую логику –

+0

Что я имею в виду' $ ('# mybutton'). On ('click', function() {return false;}); 'остановит событие пузырька для своего родителя. Хотя в вашем коде это не будет. Чтобы сделать это так же, как и код OP, добавьте 'return callback1()' в конец обработчика события. И я даже не понимаю, почему вы создали новую функцию, которая возвращает false (_assuming, что является единственным кодом в этой функции_). – Tushar

0

Чтобы иметь что-то более динамичное & элегантный & избыточны, вы можете использовать Tasks CLAS s следующим образом, предполагая, что все обратные вызовы получают одни и те же аргументы:

class Tasks { 
 
    constructor(...tasks) { 
 
    this.tasks = tasks; 
 
    } 
 
    
 
    run(times, ...args) { 
 
    return Array.from({length: times}, (v, k) => k+1).map(iteration => 
 
     this.tasks.map(task => task(...args))     ) 
 

 
    } 
 

 
} 
 

 
const myfunction = function (a) {console.log(a)}; 
 
const callback1 = function() { return false; }; 
 
const callback2= function() { myfunction('123') }; 
 

 

 
$('#mybutton').on('click', function (event) { 
 
    new Tasks(callback1, callback2) 
 
     .run(5, event); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="mybutton">click me</button>

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