2016-06-05 8 views
0

Ich habe schon eine Weile nach einer Antwort auf diese Frage gesucht, aber noch keine Lösung gefunden. Ich muss ein Objekt an eine Funktion übergeben, die "onChange" ausgelöst wird, wenn eine Auswahloption von einem Benutzer ausgewählt wird. Der aktuelle Code ist:Übergabe der Objektvariable an onchange-Ereignis JS

selecter.onchange = function(){ 
     var runScript = $("#actionSel option:selected").attr('script'); 
     console.log(runScript); 
     eval("("+runScript+")();"); 
    } 

Die Absicht ist es, eine Funktion innerhalb des „Skript“ speichern attr die Optionen, die dann ausgeführt werden, wenn diese Option ausgewählt ist. Für eine meiner Funktionen muss ich jedoch eine Variable aus dem übergeordneten Bereich übergeben, um mit dem Server über Websockets interagieren zu können.

Die Funktion im „Script“ Attribut gespeichert ist:

function(){ popConfirm("Restore User","Do you really want to restore the selected users? This will un-delete the selected deleted users.",function(r){ if(r)restoreUser(r,io); }); 

Im Wesentlichen überprüft diese mit dem Benutzer, die sie tun wollen, was sie ausgewählt haben, dann übergibt das Ergebnis meiner Benutzerfunktion wiederherzustellen. Es muss auch das Objekt "io" weiterleiten. Allerdings bekomme ich einen Fehler, der besagt, dass io nicht definiert ist.

Alle Ideen wären sehr hilfreich. Vielen Dank!

Wie gewünscht, hier sind einige zusätzliche relative Teile des Codes, die zeigen, wo IO eingeführt wird.

AdminIO = new io(servPath); 
AdminIO.on('send_users',function(rows){ 
    toggleLoad(); 
    appendUsers(rows,AdminIO);  
}); 

Innerhalb appendUsers gibt es eine weitere Funktion, die die Auswahlliste und seine Optionen, dropActions kompiliert(), wobei die selector.onchange und anderes Stück, das ich vor geschrieben werden eingeführt. Die selector.onchange ist Teil der Funktion, die die Dropdown-Liste erstellt. Die Funktion() {popConfirm()} wird als Funktion hinzugefügt, die bei Auswahl dieses Elements ausgeführt wird. Die Funktion zum Erstellen der Liste lautet:

dropActions = function(bActions, lActions, options){ 
    // bActions = {id: myID, text: "this is my action", elem: document.getElementById('getDiv'), action: function(){ /*mycode here */}} 
    // lActions = {text: "select me to run an action", action: function(){ /*mycode here */}} 
    bActions = bActions || null; 
    lActions = lActions || null; 
    options = options || {elem: document.body, id: null}; 
    if(!bActions && !lActions){ console.error("No actions added or available."); return; } 

    var 
     selID = options.id, 
     starter = (selID) ? document.getElementById(selID) : options.elem, 
     optsBar = document.createElement("header"), 
     selecter = document.createElement("select"); 
     starterSel = document.createElement("option"); 
    optsBar.id = "actionSelH"; 
    starterSel.innerText = "More Actions"; 
    starterSel.setAttribute('script','javascript:void(0)'); 
    selecter.id = "actionSel"; 
    selecter.appendChild(starterSel); 
    for(var i= 0; bActions.length > i; i++){ 
     var 
      buttonText = bActions[i].text, 
      buttonID = bActions[i].id || 'ACT'+i, 
      buttonAction = bActions[i].action, 
      button = document.createElement('div'); 
     button.id = buttonID; 
     button.classList.add("actionButton"); 
     button.innerText = buttonText; 
     button.onclick = buttonAction;  
     optsBar.appendChild(button); 
    } 
    for(var i= 0; lActions.length > i; i++){ 
     var selText = lActions[i].text, 
      selScript = lActions[i].action, 
      option = document.createElement('option'); 
     option.innerText = selText; 
     option.setAttribute('script',selScript); 
     selecter.appendChild(option); 
    } 
    selecter.onchange = function(){ 
     var runScript = $("#actionSel option:selected").attr('script'); 
     console.log(runScript); 
     eval("("+runScript+")();"); 
    } 
    optsBar.appendChild(selecter); 
    $(optsBar).insertBefore('#user_list_table'); 
    //$('#user_list_table').after(optsBar); 
    //$(starter).prepend(optsBar); 
}, 

Hoffentlich hilft mehr Kontext!

+0

Ist es Ihnen möglich, die Funktion direkt zu übergeben in JavaScript ohne Verwendung von HTML? – gcampbell

Antwort

0

Statt eval verwenden, könnten Sie die function constructor verwenden und Ihre Parameter direkt an diese Funktion übergeben:

var scriptFunction = new Function(r, io, runScript); 
scriptFunction(r, io); 

Natürlich ist dieser Code annehmen, dass r und io wird immer die Variable die Sie suchen. Wenn dies nicht der Fall ist, müssen Sie Ihre eigene Logik schreiben, um die Variable aus dem übergeordneten Bereich zu übernehmen, und sie dann an die scriptFunction übergeben.

aktualisieren

Wenn Sie in der Lage sind ton das bereitgestellte Skript ändern, können Sie auch versuchen, implizit die Variablen zu deklarieren r und io:

function(r, io){ popConfirm("Restore User","Do you really want to restore the selected users? This will un-delete the selected deleted users.",function(r, io){ if(r)restoreUser(r,io); }); 
+0

Interessanter Gedanke. Leider sieht es so aus, als hätte dies das gleiche Problem. R ist in Ordnung, da es Teil des gesamten Funktionskontexts ist. Aber io befindet sich im übergeordneten Kontext, auf den anscheinend nicht von der Veranstaltung zugegriffen werden kann. Im Prinzip würde ich das gerne so machen, wie das Binden eines Onclicks funktioniert ... Da funktioniert das auch gut mit einem Button. – Ethan

+0

Es wäre hilfreich, den gesamten Kontext zu erhalten. Können Sie Ihren Code aktualisieren, um uns zu zeigen, wie und wann 'io' erklärt wird? –

+0

Ich kann, aber es kann nur mehr verwirrend sein ... Die Auszüge, die ich habe, sind jetzt in Builder-Funktionen, die meine Select-Anweisung erstellen.Ich werde etwas später ein höheres Level veröffentlichen, wenn ich zu einem System komme, auf dem der Code steht. – Ethan