2009-07-23 20 views
0

Ich denke, das ist eine ziemlich grundlegende Frage, aber ich habe mit diesem Problem zu kämpfen.jQuery dynamische Ereignisbindung

Auf meinem Formular habe ich eine Option zum dynamischen Hinzufügen einer neuen Zeile zur Tabelle, die einfach genug ist, um mit jQuery zu tun. Auf einem der Elemente muss ich ein Ereignis binden, auch relativ einfach. Der Teil, mit dem ich Probleme habe, ist das Ereignis, das gebunden werden muss, um einen Parameter zu nehmen. So haben Sie den Code ich habe:

$(newrow).find("select").each(function() { 
     var ochange = function(handle){ 
       var thisselect = "select" + handle; 
       var thislink = "link" + handle; 
       var thiscollate = "collate" + handle; 
       if(document.getElementById(thisselect).value == 4){ 
        document.getElementById(thislink).style.visibility = 'visible'; 
       } 
       else{ 
        document.getElementById(thislink).style.visibility = 'hidden'; 
        document.getElementById(thiscollate).value = ""; 
       } 
     }; 
     $(this).change(ochange); 
     $(this).attr("name", "select" + numfields); 
     $(this).attr("id", "select" + numfields); 
    }); 

Die Veranstaltung bindet wie erwartet, aber der „Griff“ Variable nicht registrieren (natürlich, weil ich bin ziemlich sicher, das ist falsch Syntax). Außerdem ist diese Funktion, die ich an das dynamische Formularelement binden möchte, tatsächlich bereits definiert. Wenn es also einen Weg gibt, eine bereits definierte Funktion (die einen Parameter benötigt) aufzurufen, würde ich gerne davon erfahren.

Antwort

0

In Ihrem Code ist die Variable 'handle' ein jQuery-Objekt, das ein Ereignis für das Ändern des 'Select'-Widgets darstellt. Wenn Sie ein DOM-Objekt abrufen möchten, das dieses Ereignis ausgelöst hat, verwenden Sie das Attribut handle.target. Um beispielsweise seinen Namen zu erhalten, verwenden Sie das Attribut handle.target. Um jQuery-Objekt für Ziel zu erhalten - $ (handle.target).

Voll Referenz für Ereignisobjekte ist here

0

Der erste Parameter von einem Event-Handler-Funktion die event object ist.

Wenn ich richtig verstehe, im Grunde möchten Sie einen Wert an die ochange Funktion übergeben.

Sie konnten die Variable handle im Rahmen des jeder Callback-Funktion, und verwenden Sie seinen Wert auf der ochange Funktion deklarieren, da Sie jQuery haben, können Sie es in dieser Funktion verwenden können, und die getElementById vermeiden ruft:

$(newrow).find("select").each(function() { 

    var handle = "someValue"; // this variable will be accessible inside ochange 

    var ochange = function(){ 
    var thisselect = "select" + handle; 
    var thislink = "link" + handle; 
    var thiscollate = "collate" + handle; 
    if($(thisselect).val() == 4){ 
     $(thislink).css('visibility', 'visible'); 
    } 
    else{ 
     $(thislink).css('visibility', 'hidden'); 
     $(thiscollate).val(''); 
    } 
    }; 

    $(this).change(ochange); 
    $(this).attr("name", "select" + numfields); 
    $(this).attr("id", "select" + numfields); 
}); 
0

Sie könnten eine „Helfer“ Funktion liefern:

$(this).change(function (evt) { 
    ochange('someVal') 
    }); 

eine weitere Möglichkeit, die Art von komplexen, aber einfach zugleich ist die jquery.hitch Plugin (das etwas Derartiges wird in jQuery 1.3.3?)

Mit ihm kann man so etwas tun:

var obj = { 
    attr: "blah", 
    myFunc: function(arg){ 
     console.log(this.attr + " " + arg); 
    } 
    } 
    $(this).change($.hitch(obj, "myFunc", "wheee"))