2010-07-18 12 views
7

Ho un layout web, che può contenere diversi collegamenti su di esso. Questi collegamenti vengono creati dinamicamente, utilizzando le funzioni AJAX. E funziona bene.Come lavorare con i campi creati dinamicamente?

Ma, non so come posso lavorare con quei "collegamenti creati dinamicamente" (ad esempio come chiamare una funzione JS o jQuery se faccio clic su di essi). Immagino che il browser non li riconosca, dal momento che vengono creati dopo che la pagina è stata caricata.

C'è qualche funzione, che può "re-renderizzare" la mia pagina e gli elementi su di esso?

Tnx in adv sul vostro aiuto!

+2

Leggere le strutture "live" e "delegato" di jQuery. – Pointy

risposta

6

È possibile utilizzare i seguenti 2 metodi jQuery fornisce:

Il primo, è il metodo .live(), e l'altro è il metodo .delegate().

L'uso del primo è molto semplice:

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

Come si può vedere, il primo argomento è l'evento che si desidera associare, e il secondo è una funzione che gestisce l'evento. Il modo in cui funziona non è esattamente come un "re-rendering". Il modo comune per farlo ($("#dynamicElement").click(...) o $("#dynamicElement").bind("click", ...)) funziona collegando il gestore di eventi di un determinato evento all'elemento DOM quando il DOM è stato caricato correttamente ($(document).ready(...)). Ora, ovviamente, questo non funzionerà con elementi generati dinamicamente, perché non sono presenti quando il DOM viene caricato per la prima volta.

Il modo .Live() funziona è, invece di attaccare il gestore sfogo al DOM elemento stesso, attacca con l'elemento document, approfittando della proprietà ribollimento-up di JS & DOM (Quando si fa clic l'elemento generato dinamicamente e nessun gestore di eventi è collegato, continua a guardare in alto finché non ne trova uno).

Suoni abbastanza accurati, giusto? Ma c'è un piccolo problema tecnico con questo metodo, come ho detto, allega il gestore di eventi alla parte superiore del DOM, quindi quando fai clic sull'elemento, il tuo browser deve attraversare tutto l'albero DOM, fino a trovare l'evento appropriato handler. Processo che è molto inefficiente, a proposito. Ed ecco dove appare il metodo .delegate().

Supponiamo la seguente estructure HTML:

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

Così, con il metodo .delegate(), invece di legare il gestore di eventi per la parte superiore del DOM, basta potrebbe allegarlo a un DOM genitore Elemento. Un elemento DOM sei sicuro che si troverà da qualche parte sopra il contenuto generato dinamicamente nell'albero DOM. Più vicino a loro, meglio funzionerà. Quindi, questo dovrebbe fare la magia:

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

Questa era una specie di lunga risposta, ma mi piace per spiegare la teoria dietro di esso haha.

MODIFICA: È necessario correggere il markup, non valido perché: 1) Gli ancoraggi non consentono l'uso di un attributo valore e 2) Non è possibile avere 2 o più tag con lo stesso ID. Prova questo:

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

E per determinare quale uno degli ancoraggi stato cliccato

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

Con questo codice, avrete memorizzato nella variabile anchorClicked l'id del collegamento cliccato, e nel valueClicked il numero associato all'ancora.

+0

buono, grazie a tutti! ma, sul mio modulo ho diversi elementi di ancoraggio. come può il codice riconoscere su quale è stato cliccato? – user198003

+0

Puoi pubblicare il markup del modulo? –

+0
0

Come vengono creati dinamicamente questi collegamenti? È possibile utilizzare il selector corretto, dato che stanno utilizzando lo stesso nome di classe o risiede nello stesso tag, ecc.

-1

Se i collegamenti arrivano tramite AJAX, è possibile impostare gli attributi onclick sul server. uscita solo i collegamenti nel AJAX come questo:

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

Il return false si assicura che il link non ricaricare la pagina.

Spero che questo aiuti!

+1

Questo non è il modo giusto per farlo quando usi jQuery. – Pointy

+1

Oh mio gaWwwwwd, inline JavaScript È malvagio. Spostalo su click(): http://api.jquery.com/click/ – yclian

3

Nella pagina codice di inizializzazione, è possibile impostare i gestori in questo modo:

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

Hai solo bisogno di essere in grado di individuare gli elementi di input per classe o qualcosa del genere.

+0

Nessun amore per "delegato"? '$ ('# myForm'). delegate (...' – James

+0

Preferisco "delegato" ma non riuscivo a ricordare esattamente quale fosse la sintassi ed ero troppo pigro per guardare :-) – Pointy

0

Noramlly, la risposta del processo del browser HTML e aggiungerlo al DOM albero, ma gli eventi a volte, corrente definito non solo di lavoro, semplicemente reinizializzare l'evento quando u chiamata la richiesta Ajax ..

+0

L'evento "più vecchio"? – Pointy

+0

lo correggo :) – shox

0

considerano il form html

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

jquery sceneggiatura

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

qui clic sul pulsante lo script controllare il valore della casella di testo per id essere nullo. se nulla verrà restituito un messaggio di avviso .... I sottili questa è la soluzione che cerchi .....

hanno una bella giornata ..

0

Tutto quello che devi fare per lavorare con gli elementi creati dinamicamente è possibile creare identificatori con i quali è possibile individuarli. Prova il seguente codice nella console di Firebug o gli strumenti di sviluppo per Chrome o IE.

$(".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");}); 

Si dovrebbe ora avere due link dove l'annuncio di solito è che sono stati creati in modo dinamico, e che ha avuto un gestore onclick aggiunto per far apparire un avviso (non ho bloccare il comportamento di default, in modo che vi farà lasciare la pagina.)

jQuery's .live consente di aggiungere automaticamente gestori all'elemento appena creato.

Problemi correlati