2016-06-22 16 views
0

Der Versuch, ein Skript zu erstellen, das an className gebunden ist und eine andere Funktion aufruft.javascript: Aufruf der Funktion nach Klassennamen

Ich habe diesen Code für die erste Instanz von ClassName, aber wenn ich die [0] in der ersten Zeile des Skripts entfernen, funktioniert es nicht mehr.

<input type="text" value="NOTBound" class="NOTBound"/> 
    <input type="text" value="Bound value 1" class="Bound"/> 
    <input type="text" value="NOTBound" class="NOTBound"/> 
    <input type="text" value="Bound value 2" class="Bound"/> 
    <script> 
    inputBound = document.getElementsByClassName('Bound')[0]; 
    inputBound.onfocus = function() { 
     var input = this.value; 
     formFunct(input); 
    } 
    function formFunct(input) { 
     console.log('done did the form Funct: ' + input) 
    } 
    </script> 

Wie bekomme ich es mit className="Bound" für alle Eingänge zu arbeiten? Ich brauche keine jQuery-Lösung.

Vielen Dank.

+1

Sie haben durch alle von ihnen iterieren (Es gibt zwei große Antworten unten, aber Sie können auch eine normale ** for ** -Schleife verwenden (getElementsByClassName gibt ein Array zurück), außer Sie möchten eine Javascript-Bibliothek verwenden, die das für Sie erledigt. – briosheje

+0

Sie müssen den Befehl 'document.getElementsByClassName ('Bound')' durchlaufen und das 'onfocus' -Ereignis für jedes Element in der Liste anwenden. –

+0

Wirklich zu schätzen, dass alle so schnell einspringen. Danke an alle! – david

Antwort

6

Verwenden Sie eine Schleife, um alle Elemente zu durchlaufen.

Verwenden Array#forEach führt forEach() Verfahren eine Funktion vorgesehen einmal pro Array-Element.

Eine weitere alternative konnte Array.from über HTMLCollection von getElementsByClassName zurück zu verwenden, so dass Sie Array# Methoden direkt über zurückgegebene Ergebnis aufrufen kann.

var inputBound = document.getElementsByClassName('Bound'); 
 
[].forEach.call(inputBound, function(inputBound) { 
 
    inputBound.onfocus = function() { 
 
    var input = this.value; 
 
    formFunct(input); 
 
    } 
 
}) 
 

 
function formFunct(input) { 
 
    console.log('done did the form Funct: ' + input) 
 
}
<input type="text" value="NOTBound" class="NOTBound" /> 
 
<input type="text" value="Bound value 1" class="Bound" /> 
 
<input type="text" value="NOTBound" class="NOTBound" /> 
 
<input type="text" value="Bound value 2" class="Bound" />

Hinweise:

+1

Das ist eine kluge Verwendung von '.call'. Vielleicht ist es für das OP ziemlich weit fortgeschritten (sonst hätte er das nicht gefragt), aber es ist definitiv die beste Antwort, großartige Herangehensweise. – briosheje

+0

Oder nur eine normale for-Schleife, wäre schneller und von allen Browsern unterstützt. –

+0

@briosheje, ich habe eine Notiz darüber hinzugefügt .. Danke;) – Rayon

4

Iterate über NodeList verwenden und Event-Handler an das Element befestigen.

// get all elements and convert to array 
 
Array.from(document.getElementsByClassName('Bound')) 
 
    // iterate overa array elements 
 
    .forEach(function(ele) { 
 
    // bind event handler 
 
    ele.onfocus = function() { 
 
     var input = this.value; 
 
     formFunct(input); 
 
    } 
 
    }); 
 

 
function formFunct(input) { 
 
    console.log('done did the form Funct: ' + input) 
 
}
<input type="text" value="NOTBound" class="NOTBound" /> 
 
<input type="text" value="Bound value 1" class="Bound" /> 
 
<input type="text" value="NOTBound" class="NOTBound" /> 
 
<input type="text" value="Bound value 2" class="Bound" />

+1

Ich mag diesen hier wirklich. Einfach und verständlich. Vielen Dank. – david

3

einfach durchlaufen alle Node (n) in einem NodeList (mit einem guten alten for-Schleife :))

inputBounds = document.getElementsByClassName('Bound'); 
for(var counter = 0; counter < inputBounds.length; inputBounds++) 
{ 
    inputBounds.item(counter).onfocus = function() { 
     var input = this.value; 
     formFunct(input); 
    } 
} 
Verwandte Themen