2017-02-08 3 views
-2

Vielleicht kann ich die gesamten Code hier nicht schreiben, aber ich denke, das kann mein Problem ist, erklären: hinzufügen onClick mehr mit bekommen JavaScript dynamisch gleicher Aktion

Und das Ergebnis

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>
:

Ich bekomme myfunction 5 mal ausgeführt.

Meine Frage ist:

Wie myfunction ausgeführt 5mal zu vermeiden (ich will es 1 Mal ausführen) ohne Entfernen für weil ich es brauche für meinen Fall Looping? Ich versuche, das onClick-Ereignis zu entfernen, funktioniert aber nicht.

Danke

+0

Klicken Sie einfach auf einmal: D –

+3

Bindungsereignis ** 10 ** mal auf demselben Element in 'for'. Entfernen Sie einfach 'for'. – Tushar

+0

Oder wenn Sie das 'for' nicht entfernen können, binden Sie das Event * outside * it –

Antwort

3

(Ich bin mir nicht sicher, warum Sie wirklich Ereignis innerhalb der for-Schleife müssen anhängen), aber man könnte das Click-Ereignis dettach vor dem Anbringen nächste mit jQuery-Methode .off().

off(): einen Ereignishandler entfernen.

Beispiel:

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

Hoffnung, das hilft.

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

Scheint völlig unnötig für mich. – Tushar

+0

Zu mir auch, aber das OP sagt _without looping für Ursache entfernen ich brauche es für mein case_ also versuche ich, es zu beantworten. –

+2

Ich denke, das ist die beste Antwort, es scheint der sauberste Weg .. lol. Ich habe versucht, etwas wie ".once()" zu finden, das existierte und wendete es an, aber es würde wahrscheinlich immer noch darüber laufen und es fünfmal laufen lassen. x) – FllnAngl

0

es wie unten Do:

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

Die folgende Logik kann besser sein:

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

Ich sehe die Verwendung von "Callback1" hier nicht, es gibt nur 'false' daraus zurück. Hinweis: Es verhindert nicht die Standardaktion und das Ereignissprudeln des angeklickten Elements. – Tushar

+0

sicher der Frage Besitzer nicht seinen Code offen und will die Idee im Allgemeinen .. Ich bin sicher, dass 'callback1' in der Realität eine andere Logik enthält –

+0

Was ich meine, ist $ ('# mybutton'). Auf ('klicken', Funktion() {return false;}); 'stoppt das Event-Bubbling zum übergeordneten Element. Während in Ihrem Code wird es nicht. Um es wie den Code von OP zu machen, füge 'return callback1()' am Ende des Event-Handlers hinzu. Und ich sehe nicht einmal, warum Sie eine neue Funktion erstellt haben, die von dort den Wert false zurückgibt (_vorausgesetzt, das ist der einzige Code in dieser Funktion_). – Tushar

0

Um etwas mehr Dynamik haben & elegante & over-engineered, können Sie Tasks cla verwenden s, wie folgend, vorausgesetzt, alle Rückrufe die gleichen Argumente erhalten:

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>

Verwandte Themen