2010-07-18 6 views
7

Ich habe Web-Layout, das mehrere Links enthalten kann. Diese Links werden dynamisch mit AJAX-Funktionen erstellt. Und es funktioniert gut.Wie mit dynamisch erstellten Feldern arbeiten?

Aber ich weiß nicht, wie ich mit diesen "dynamisch erstellten Links" arbeiten kann (dh wie man eine JS oder jQuery Funktion aufruft, wenn ich darauf klicke). Ich schätze, dass der Browser sie nicht erkennen kann, da sie nach dem Laden der Seite erstellt werden.

Gibt es eine Funktion, die meine Seite und Elemente darauf "rendern" kann?

Tnx in adv auf Ihrer Hilfe!

+2

Lesen Sie auf den jQuery "Live" und "Delegate" Einrichtungen. – Pointy

Antwort

6

Sie können die 2 folgenden Methoden jQuery bietet verwenden:

Die erste ist die .live() Verfahren und das andere ist die .delegate() Methode.

Die Nutzung der erste ist sehr einfach:

$(document).ready(function() { 
    $("#dynamicElement").live("click", function() { 
     //do something 
    }); 
} 

Wie Sie das erste Argument ist zu sehen, das Ereignis, das Sie binden möchten, und die zweite ist eine Funktion, die das Ereignis behandelt. Die Art und Weise, wie das funktioniert, ist nicht genau wie ein "Re-Rendering". Die übliche Vorgehensweise ($("#dynamicElement").click(...) oder $("#dynamicElement").bind("click", ...)) funktioniert, indem Sie den Ereignishandler eines bestimmten Ereignisses an das DOM-Element anfügen, wenn das DOM ordnungsgemäß geladen wurde ($(document).ready(...)). Dies funktioniert natürlich nicht mit dynamisch generierten Elementen, da diese beim ersten Laden des DOM nicht vorhanden sind.

Die Art und Weise .live() funktioniert, ist, anstatt die Lüftungs Handler auf das DOM-Element angebracht selbst, sie legt es mit dem document Element, unter Ausnutzung der sprudelnden-up Eigentum von JS & DOM unter (Wenn Sie auf die Schaltfläche dynamisch generiertes Element und es ist kein Event-Handler angehängt, es schaut weiter nach oben, bis es einen findet).

Klingt ziemlich ordentlich, oder? Aber es gibt ein kleines technisches Problem mit dieser Methode, wie gesagt, es fügt den Event-Handler an den Anfang des DOM an. Wenn Sie also auf das Element klicken, muss Ihr Browser den gesamten DOM-Baum durchlaufen, bis er das richtige Ereignis findet Handler. Prozess, der übrigens sehr ineffizient ist. Und hier erscheint die .delegate() Methode.

Lassen Sie uns die folgende HTML ESTRUCTURE annehmen:

<html> 
<head> 
... 
</head> 
<body> 
    <div id="links-container"> 
     <!-- Here's where the dynamically generated content will be --> 
    </div> 
</body> 
</html> 

Also, mit dem .delegate() -Methode, statt den Event-Handler an die Spitze des DOM zu binden, können Sie es zu einem übergeordneten DOM konnte diese anhängen Element. Ein DOM-Element, von dem Sie sicher sind, dass es irgendwo im dynamisch generierten Inhalt der DOM-Struktur liegt. Je näher sie sind, desto besser wird das funktionieren. So soll dies die Magie tun:

$(document).ready(function() { 
    $("#links-container").delegate("#dynamicElement", "click", function() { 
     //do something 
    }); 
} 

Das war ein bisschen eine lange Antwort, aber Ich mag die Theorie dahinter erklären, haha.

EDIT: Sie sollten Ihr Markup korrigieren, es ist ungültig, weil: 1) die Anker die Verwendung eines Wertattributs nicht zulassen, und 2) Sie können nicht 2 oder mehr Tags mit der gleichen ID haben. Versuchen Sie folgendes:

<a class="removeLineItem" id="delete-1">Delete</a> 
<a class="removeLineItem" id="delete-2">Delete</a> 
<a class="removeLineItem" id="delete-3">Delete</a> 

und zu bestimmen, welche der Anker

$(document).ready(function() { 
    $("#links-container").delegate(".removeLineItem", "click", function() { 
     var anchorClicked = $(this).attr("id"), 
      valueClicked = anchorClicked.split("-")[1];  
    }); 
} 

Mit diesem Code geklickt wurde, werden Sie in der anchorClicked Variable die ID der Verbindung gespeichert geklickt haben, und in der valueClicked die Nummer, die dem Anker zugeordnet ist.

+0

gut, tnx an alle! aber auf meiner Form habe ich mehrere Ankerelemente. Wie kann Code erkennen, auf welchen geklickt wurde? – user198003

+0

Können Sie das Markup des Formulars posten? –

+0
0

Wie werden diese Links dynamisch erstellt? Sie können das korrekte selector verwenden, vorausgesetzt, dass sie denselben Klassennamen verwenden oder sich im selben Tag usw. befinden.

-1

Wenn Ihre Links über AJAX eingehen, können Sie die Attribute onclick auf dem Server festlegen. Nur geben die Links in die AJAX wie folgt aus:

<a href="#" onclick="callYourFunctionHere();return false;">Holy crap I'm a link</a> 

Die return false stellt sicher, dass die Verbindung die Seite nicht neu laden.

Hoffe, das hilft!

+1

Das ist wirklich nicht die Art, dies zu tun, wenn Sie jQuery verwenden. – Pointy

+1

Oh mein Gawwwwd, Inline-JavaScript ist böse. Verschiebe es zu click(): http://api.jquery.com/click/ – yclian

3

In Ihrer Seite Initialisierungscode, können Sie Handler wie folgt aufgebaut:

$(function() { 
    $('#myForm input.needsHandler').live('click', function(ev) { 
    // .. handle the click event 
    }); 
}); 

Sie müssen nur in der Lage sein, die Eingabeelemente nach Klasse oder etwas zu identifizieren.

+0

Keine Liebe für 'delegate'? '$ ('# myForm'). delegate (...' – James

+0

Ich bevorzuge "delegate", aber ich konnte mich nicht genau erinnern, was die Syntax war und ich war zu faul zum schauen :-) – Pointy

0

Noramlly, der Browser-Prozess Antwort HTML und fügen Sie DOM-Baum, aber manchmal, aktuelle definierte Ereignisse einfach nicht funktionieren, einfach das Ereignis neu zu initialisieren, wenn u die Ajax-Request aufrufen ..

+0

Das "älteste" Ereignis? – Pointy

+0

ich korrigiere es :) – shox

0

betrachten die HTML-Formular

<form> 
    <input type="text" id="id" name="id"/> 
    <input type="button" id="check" name="check value="check"/> 
</form> 

jquery Skript

$('#check).click(function() { 
    if($('#id).val() == '') { 
     alert('load the data!!!!); 
    } 
}); 

hier auf die Schaltfläche das Skript den Wert der Textbox id null sein überprüfen klicken. Wenn es null wird es eine Alarmmeldung zurückgeben .... i dünn ist dies die Lösung, die Sie suchen .....

einen schönen Tag ..

0

Alles, was Sie tun müssen, arbeiten Bei dynamisch erstellten Elementen erstellen Sie Bezeichner, mit denen Sie sie finden können. Probieren Sie den folgenden Code in der Firebug-Konsole oder den Entwicklertools für Chrome oder IE aus.

$(".everyonelovesstackoverflow").html('<a id="l1" href="http://www.google.com">google</a> <a id="l2" href="http://www.yahoo.com">yahoo</a>'); 
$("#l1").click(function(){alert("google");}); 
$("#l2").click(function(){alert("yahoo");}); 

Sie sollten nun zwei Links, wo die Anzeige normal, die dynamisch erstellt wurden, und als hatte ein Onclick-Handler einen Alarm zu bringen hinzugefügt (ich nicht Standardverhalten blockiert hat, so wird es Sie dazu führen, Verlassen Sie die Seite.)

jQuery's .live ermöglicht es Ihnen, Handler automatisch zu neu erstellten Element hinzuzufügen.