2017-07-19 2 views
0

HTML:Variable basierend auf Funktionsargument erhalten?

<button id="s01" onclick="getMusic(this.id)"></button> 
<button id="s02" onclick="getMusic(this.id)"></button> 

javascript:

var s01 = ["file", "song"]; 
var s02 = ["file", "song"]; 

function getMusic(e){ 
    alert() 
} 

Okay, so habe ich diesen oben genannten Code (Dies ist eine vereinfachte Version). Diese Funktion setzt e in getMusic(e) entweder auf s01 oder s02. Ich muss in der Lage sein, die Variable aufzurufen, die diesem Namen entspricht (innerhalb der alert()), aber ich bin nicht einmal sicher, wo ich anfangen soll. Jede Hilfe wird geschätzt, danke!


P.S. jede Chance, ich kann die onclick="" aus der HTML-Datei entfernen und durch eine addEventListener in der JS-Datei ersetzen und immer noch den gleichen Effekt erzielen? Ich mag es nicht, meine Skripte so zu mischen.

Antwort

3

Wenn Sie ein Objekt verwenden, um Ihre Daten zu halten, ist es viel einfacher

var data = { 
    s01 : ["file", "song"], 
    s02 : ["file", "song"] 
}; 

function getMusic(e){ 
    console.log( data[e] ); 
} 

Wenn Sie addEventListener Sie die Inline entfernen javascript auch

var data = { 
 
    s01 : ["file1", "song"], 
 
    s02 :["file2", "song"] 
 
} 
 

 
document.querySelectorAll('.btn').forEach(function(el) { 
 
    el.addEventListener('click', function() { 
 
    console.log(data[this.id]); 
 
    }); 
 
});
<button id="s01" class="btn">Test 1</button> 
 
<button id="s02" class="btn">Test 1</button>

+0

OP muss nicht seinen Datentyp ändern. Das eingebaute "Fenster" -Objekt präsentiert diese Daten auf exakt die gleiche Weise, d. H. "Fenster [" s01 "]". – Toastrackenigma

+0

@ Toastrackenigma - Deshalb empfehle ich, ein Objekt zu verwenden, globale Variablen hinzuzufügen und anzunehmen, dass die Variablen tatsächlich global sind, ist eine schlechte Praxis. – adeneo

1

Zunächst einmal, um Ihre zweite Frage zu beantworten, ja, können Sie den Event-Listener in Ihrem JS:

012 registrieren
document.querySelectorAll("input[type=button]").forEach(function(el){ 
    el.addEventListener("click", getMusic) 
}) 

Sobald Sie Ihre Event-Handler haben auf diese Weise registriert sind, können Sie die id der Schaltfläche erhalten, indem e.target.id erreichbar.

function getMusic(e){ 
    alert(e.target.id) // will alert with button id 
} 

An diesem Punkt haben Sie eine Zeichenfolge, die die id enthält; Jetzt müssen Sie in der Lage sein, die Werte zu ziehen, die dem id entsprechen. Es ist am sinnvollsten, einen JSON-Beutel mit Hashes entsprechend id zu definieren.

var data = { 
    s01: ["your", "data"], 
    s02: ["your", "other", "data"] 
} 
function getMusic(e){ 
    myData = data[e.target.id] 
    alert(myData) 
} 
+0

Es gibt mindestens zwei Probleme mit Ihrer Antwort. Erstens können Sie 'addEventListener' nicht auf einer nodeList aufrufen, und zweitens ist' e.target' nicht notwendigerweise das im Handler gebundene Element. – adeneo

+0

yep, bemerkte diese Probleme auch. Danke für die Köpfe hoch. bearbeitet. –

-2

In JavaScript, das window Objekt vorhanden ist, die enthält alle globalen Variablen.

einfach window[e] verwenden Ihren Arrays Wert zu erhalten:

var s01 = ["file", "song"]; 
 
var s02 = ["file", "song"]; 
 

 
function getMusic(e){ 
 
    alert(window[e]) 
 
}
<button id="s01" onclick="getMusic(this.id)"></button> 
 
<button id="s02" onclick="getMusic(this.id)"></button>

+0

Warum die Downvotes? 'window' ist der unterstützte Weg dies in JavaScript zu tun. – Toastrackenigma

+0

[Globale Variablen sind schlechte Nachrichten.] (Http://wiki.c2.com/?GlobalVariablesAreBad) Nur weil Sie _can_, bedeutet nicht Sie _should_. –

Verwandte Themen