2010-07-18 12 views
7

J'ai une mise en page web, qui peut contenir plusieurs liens dessus. Ces liens sont créés dynamiquement, en utilisant les fonctions AJAX. Et ça fonctionne bien. Mais, je ne sais pas comment puis-je travailler avec ces "liens créés dynamiquement" (c'est-à-dire, comment appeler une fonction JS ou jQuery si je clique dessus?). Je suppose que ce navigateur ne peut pas les reconnaître, car il est créé après le chargement de la page.Comment travailler avec des champs créés dynamiquement?

Y a-t-il une fonction qui peut "rendre" ma page et ses éléments?

Tnx dans l'adv sur votre aide!

+2

Lisez les fonctionnalités jQuery "live" et "delegate". – Pointy

Répondre

6

Vous pouvez utiliser les 2 méthodes suivantes jQuery fournit:

Le premier, est la méthode .live(), et l'autre est la méthode .delegate().

L'utilisation du premier est très simple:

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

Comme vous pouvez le voir, le premier argument est l'événement que vous voulez lier, et la seconde est une fonction qui gère l'événement. La façon dont cela fonctionne n'est pas exactement comme un "re-rendu". Le moyen commun de le faire ($("#dynamicElement").click(...) ou $("#dynamicElement").bind("click", ...)) fonctionne en attachant le gestionnaire d'événements d'un événement déterminé à l'élément DOM lorsque le DOM a correctement chargé ($(document).ready(...)). Maintenant, évidemment, cela ne fonctionnera pas avec les éléments générés dynamiquement, car ils ne sont pas présents lors du premier chargement du DOM.

Le .live() la manière dont fonctionne est, au lieu d'attacher le gestionnaire d'évent à l'élément DOM lui-même, il l'attache avec l'élément document, en profitant de la propriété bouillonnement de JS & DOM (Lorsque vous cliquez sur élément généré dynamiquement et aucun gestionnaire d'événements n'est attaché, il continue de chercher en haut jusqu'à ce qu'il en trouve un).

Cela semble très bien, non? Mais il y a un petit problème technique avec cette méthode, comme je l'ai dit, il attache le gestionnaire d'événements au sommet du DOM, donc quand vous cliquez sur l'élément, votre navigateur doit traverser tout l'arbre DOM, jusqu'à ce qu'il trouve l'événement approprié gestionnaire. Un processus qui est très inefficace, d'ailleurs. Et voici où apparaît la méthode .delegate().

Supposons que le estructure HTML suivant:

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

Ainsi, la méthode .delegate(), au lieu de lier le gestionnaire d'événements au sommet du DOM, vous venez pouvez l'attacher à un DOM parent Élément. Un élément DOM, vous êtes sûr qu'il va être quelque part du contenu généré dynamiquement dans l'arborescence DOM. Le plus proche d'eux, le mieux cela va fonctionner. Donc, cela devrait faire la magie:

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

C'était un peu une longue réponse, mais je tiens à expliquer la théorie derrière haha. Vous devez corriger votre balisage, car: 1) Les ancres n'autorisent pas l'utilisation d'un attribut de valeur, et 2) Vous ne pouvez pas avoir deux balises ou plus ayant le même ID. Essayez ceci:

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

Et pour déterminer lequel des points d'ancrage a été cliquée

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

Avec ce code, vous avez enregistré dans la variable anchorClicked l'identifiant du lien cliqué, et dans le valueClicked le numéro associé à l'ancre.

+0

bon, tnx à tous! mais, sur ma forme j'ai plusieurs éléments d'ancrage. comment le code peut-il reconnaître sur lequel on a cliqué? – user198003

+0

Pouvez-vous poster le balisage du formulaire? –

0

Comment ces liens sont-ils créés dynamiquement? Vous pouvez utiliser la bonne selector, étant donné qu'ils utilisent le même nom de classe ou réside dans le même tag, etc.

-1

Si vos liens arrivent via AJAX, vous pouvez définir les attributs onclick sur le serveur. sortie seulement les liens dans l'AJAX comme celui-ci:

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

Le return false fait que le lien ne se recharge pas la page.

Espérons que cela aide!

+1

Ce n'est vraiment pas la façon de le faire lorsque vous utilisez jQuery. – Pointy

+1

Oh mon gawwwwd, JavaScript en ligne EST mauvais. Déplacez le sur click(): http://api.jquery.com/click/ – yclian

3

Dans votre page code d'initialisation, vous pouvez configurer les gestionnaires comme ceci:

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

Vous avez juste besoin d'être en mesure d'identifier les éléments d'entrée par classe ou quelque chose.

+0

Pas d'amour pour 'delegate'? '$ ('# myForm'). delegate (...' – James

+0

Je préfère "déléguer" mais je ne me rappelais pas exactement quelle était la syntaxe et j'étais trop paresseux pour regarder :-) – Pointy

0

noramlly, la réponse du processus de navigateur HTML et l'ajouter à l'arbre DOM, mais parfois, les événements définis en cours tout simplement pas, ré-initialiser simplement l'événement lorsque u appeler la demande ajax ..

+0

Le "plus ancien" événement? – Pointy

+0

je le corrige :) – shox

0

considèrent la forme html

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

script jquery

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

ici cliquant sur le bouton du script vérifier la valeur de l'identifiant de zone de texte pour être nul. si son nul, il retournera un message d'alerte .... i ce mince est la solution que vous cherchez .....

ont une belle journée ..

0

Tout ce que vous devez faire pour travailler Avec les éléments créés dynamiquement, créez des identifiants avec lesquels vous pouvez les localiser. Essayez le code suivant dans la console de Firebug ou les outils de développement pour Chrome ou 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");}); 

Vous devriez maintenant avoir deux liens où l'annonce est normalement qui ont été créées de manière dynamique, et que ce qui avait un gestionnaire onclick ajouté pour afficher une alerte (je ne l'ai pas bloquer le comportement par défaut, il vous fera quittez la page.)

Le fichier .live de jQuery vous permettra d'ajouter automatiquement des gestionnaires aux éléments nouvellement créés.