2017-07-05 4 views
0

Ich habe ungeordnete Listen unten für Früchte, Tiere, Bäume .... über 100 Tasten mit gleicher Klasse:Verwendung addEventListener ersetzen jedes onClick

<ul> 
    <li><button class="bb" value="apple" onClick="aJax(value)">Apple</button></li> 
    <li>Banana 
     <ul> 
     <li><button class="bb" value="green_banana" onClick="aJax(value)">Green_banana</button></li> 
     <li><button class="bb" value="yellow_banana" onClick="aJax(value)">Yellow Banana</button></li> 
     </ul> 
    </li> 
    <li><button class="bb" value="cherry" onClick="aJax(value)">Cherry</button></li> 
    <li><button class="bb" value="cow..................and more.... 
</ul> 

Wenn geklickt, ich will Ajax passieren Wert zurückgeben Daten aus mySql:

<script> 
    function aJax(value) 
     xmlhttp = new XMLHttpRequest(); 
     xmlhttp.open("GET","some_page.php?q="+value,true); 
     xmlhttp.send(); 
     xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     document.getElementById("some_id").innerHTML = xmlhttp.responseText;} 
               } 
       } 
    </script> 

Ist es möglich, über addEventListener in meinem Fall zu verwenden, um jede onClick zu ersetzen? Wie mache ich es, wenn ich den JS-Code auf die Kopfzeile setzen möchte? Pls Hilfe, ich brauche es in nativen JS. Vielen Dank.

Antwort

3

Ja, Sie können es tun:

var bbs = document.getElementsByClassName("bb"); 
 
for(var i =0; i< bbs.length; i++){ 
 
    bbs[i].addEventListener('click', function(){ 
 
    var attr = this.value; 
 
    console.log(attr); 
 
    }); 
 
}
<ul> 
 
    <li><button class="bb" value="apple" >Apple</button></li> 
 
    <li><button class="bb" value="banana">Banana</button></li> 
 
    <li><button class="bb" value="cherry">Cherry</button></li> 
 
</ul>

Statt console.log(attr); Sie Ihre benutzerdefinierte Funktion

+2

Es ist besser, anonyme Funktionen zu vermeiden, wenn Sie Ereignis-Listener hinzufügen, denn wenn Sie sie später entfernen wollen, wird der 'removeEventListener' fehlschlagen, da er genau dieselben Parameter benötigt. –

+0

Hallo, ich ändere gerade ein bisschen von der ul li, um ul in ul zu machen, kann dein Code noch benutzt werden? –

+0

es funktioniert für alle Elemente mit der Klasse 'bb' –

1

versuchen, dass:

window.addEventListener('load' , function() { 

    var list = document.querySelectorAll('ul > li > button'); 

    for (var i = 0 , l = list.length ; i < l ; i++) { 

     list[ i ].addEventListener('click' , function() { 
      aJax(this.value); 
     }); 

    } 

}); 
1

die einfachste Art und Weise nennen (keine Schleifen benötigt)

var container = document.querySelector("ul"); 
 
container.addEventListener("click", doSomething, false); 
 
    
 
function doSomething(e) { 
 
    if (e.target !== e.currentTarget) { 
 
     var clickedItem = e.target.value; 
 
     console.log(clickedItem); 
 
    } 
 
    e.stopPropagation(); 
 
}
<ul> 
 
    <li><button class="bb" value="apple" >Apple</button></li> 
 
    <li><button class="bb" value="banana">Banana</button></li> 
 
    <li><button class="bb" value="cherry">Cherry</button></li> 
 
</ul>

Überprüfung dieses ehrfürchtige Artikel, ich bin ziemlich sicher, dass es ist, was Sie suchen Handling Events for Many Elements

+0

wird es schneller ohne Schleife laufen? –

+0

Absolut! Die Verwendung des Ereignisdelegierungsmodells hat zwei wesentliche Vorteile. Erstens, es ist viel besser in Anwendungen, in denen viele Ereignisse generiert werden. und zweitens aktiviert es die Behandlung von Ereignissen durch andere Objekte als diejenigen, die die Ereignisse generieren. Es ist eine saubere Trennung zwischen Design und Verwendung einer Komponente. – taha

1

Während andere Antworten richtig sind, wenn Ihre Liste ist lang, könnten Sie delegieren der Klick auf das ul Element:

function logValue(evt){ 
 
    let target = evt.target; 
 
    // only console.log if the click target has class "bb" 
 
    if(target.classList.contains("bb")){ 
 
    console.log(target.value) 
 
    } 
 
} 
 

 
// wait for the document to be loaded 
 
window.addEventListener("load",()=>{ 
 
    let list = document.querySelector(".my-list"); 
 
    if(list){ 
 
    //delegate click handler to the <ul> element 
 
    list.addEventListener("click", logValue); 
 
    } 
 
});
<ul class="my-list"> 
 
    <li><button class="bb" value="apple">Apple</button></li> 
 
    <li>Banana 
 
    <ul> 
 
     <li><button class="bb" value="green_banana">Green_banana</button></li> 
 
     <li><button class="bb" value="yellow_banana">Yellow Banana</button></li> 
 
    </ul> 
 
    </li> 
 
    <li><button class="bb" value="cherry">Cherry</button></li> 
 
</ul>

+0

delegieren den Klick auf die "ul" ist der beste Weg, es zu tun – taha

+0

Hallo, ich ändere nur ein bisschen von der ul li zu machen ul in ul, ist Ihr Code noch verwendet werden kann? –

+0

Ich bearbeitet, so können Sie selbst überprüfen ;-) (ja, es funktioniert) – n00dl3

Verwandte Themen