2017-03-28 3 views
1

Zur Laufzeit habe ich Javascript erstellen HTML und ich möchte ein Objekt auf ihnen binden, um für später auf eine Funktion übergeben.Übergabe eines Objekts zur Laufzeit an eine JavaScript-Funktion

Etwas wie folgt aus:

var projects = //(json object) 
projects.forEach(function(p) { 
    $("#container").append("<div onclick=handleClick(p)></div>"); 
}); 

function handleClick(p) { 
    //... 
} 

Es scheint dies zu tun macht [object object] die Zeichenfolge p werden anstelle des tatsächlichen Projektobjekt und mit JQuery integrierten in $ .click Funktion ist die gleiche Sache. Ich weiß, dass ich diese Elemente irgendwie zur Laufzeit an eine Funktion binden muss.

Was ist der richtige Weg, um so etwas ohne übermäßige Suche und DOM-Zugriff zu tun?

+0

können Sie jQuery '.data()' Methode verwenden, um das Objekt gegen das betreffende Element zu speichern. Verwenden Sie dann im Click-Handler '$ (this) .data()', um es abzurufen. Lesen Sie [the '.data()' doco] (http://api.jquery.com/data/) und probieren Sie es aus; komm zurück, wenn du immer noch Probleme hast. – nnnnnn

+0

Behandeln Sie den Klick auf das übergeordnete Element und entscheiden Sie, welches div-Element angeklickt wurde. Wenn Sie eine ID haben, um zu identifizieren, auf welches Projekt geklickt wurde, können Sie das als Datenattribut verwenden, damit Sie –

Antwort

3

Sie können Ihren Inhalt erstellen und den Click-Handler mit JavaScript anstelle von Inline-HTML-Handlern einrichten.

var projects = [{id: 1}, {id:2}, {id:3}]; 
 
projects.forEach(function(p) { 
 
    $("#container").append($("<div>Test </div>").click(function(e){ 
 
     handleClick(p); 
 
    })); 
 
}); 
 

 
function handleClick(p) { 
 
    console.log('Clicked project', p.id); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="container"> 
 
Content here 
 
</div>

Beachten Sie, dass eine bessere Alternative (weil Sie nur einen einzigen Handler benötigen und Sie müssen sich keine Sorgen darüber Handler später hinzugefügt) einen Handler für das übergeordnete gesetzt wäre und Sie könnte ein data-pid-Attribut für jedes div verwenden, das es Ihrem Handler ermöglicht, das richtige Projekt zu finden, basierend auf welchem ​​div geklickt wurde.

$(() => { 
 
    var projects = [{id: 1}, {id: 2}, {id: 3}]; 
 
    projects.forEach(function(p) { 
 
    $("#container").append("<div class=clicky data-pid=" + p.id + ">Project " + p.id + " </div>"); 
 
    }); 
 
    $("#container").click('.clicky', (e) => { 
 
    console.log('Clicked paragraph for ' + $(e.target).data('pid')); 
 
    }) 
 

 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="container"> 
 
    Content 
 
</div>

+0

identifizieren können. Danke! Genau die Lösung, die ich suchte – dukevin

+0

.. obwohl Sie mit Ihrem zweiten Beispiel richtig sind, da Projekte ohne Seitenaktualisierung aktualisiert werden, scheint das Hinzufügen von mehr Handlern später wie eine schlechte Idee. Ich verwende deinen zweiten Ansatz – dukevin

+0

Ich denke über deinen zweiten Ansatz nach, aber meine Objekte sind viel komplexer als deine und sind in mehreren JSON-Layern und -Arrays verschachtelt und ich muss die JSON-Datei nach dem Objekt aus der ID suchen. (http://stackoverflow.com/questions/8163859/how-can-i-get-data-in-json-array-by-id) von dem, was es scheint, was ich vermeiden möchte. Hast du irgendwelche Tipps dafür, oder sollte ich mit dem zweiten Ansatz gehen und erneut binden, wenn neue Projekte im DOM erstellt werden? – dukevin

Verwandte Themen