J'ai un ensemble de balises d'ancrage générées dynamiquement dans une boucle for comme suit:
<div id = "solTitle"> <a href = "#" id = "' + tagId + '" onClick = "openSolution();"> ' + solTitle + '</a></div> <br>';
Une fois ce code exécuté, la sortie html de l’un des cas ressemblerait à ceci:
<div id = "solTitle"> <a href = "#" id = "solution0" onClick = "openSolution();">Solution0 </a></div> <br>
<div id = "solTitle"> <a href = "#" id = "solution1" onClick = "openSolution();">Solution1 </a></div> <br>
Maintenant, je veux afficher différents textes en cliquant sur les liens ci-dessus. openSolution () ressemble à ceci:
function openSolution() {
alert('here');
$('#solTitle a').click(function(evt) {
evt.preventDefault();
alert('here in');
var divId = 'summary' + $(this).attr('id');
document.getElementById(divId).className = '';
});
}
Lorsque je l'exécute et que je clique sur l'un des liens, le flux ne vient pas à l'intérieur du gestionnaire de clics jQuery. Je l'ai vérifié par les alertes ci-dessus utilisées. Il affiche uniquement l'alerte - 'ici' et non l'alerte - 'ici dans'. En cliquant sur le lien une deuxième fois, tout fonctionne parfaitement avec la valeur correcte de divId.
La première fois que vous cliquez sur le lien, la fonction openSolution
est exécutée. Cette fonction lie le gestionnaire d'événements click
au lien, mais ne l'exécutera pas. La deuxième fois que vous cliquez sur le lien, le gestionnaire d'événements click
sera exécuté.
Ce que vous faites semble en quelque sorte faire échec à l’utilisation de jQuery en premier lieu. Pourquoi ne pas simplement lier l'événement click aux éléments en premier lieu:
$(document).ready(function() {
$("#solTitle a").click(function() {
//Do stuff when clicked
});
});
De cette façon, vous n'avez pas besoin d'attributs onClick
sur vos éléments.
Il semble également que vous ayez plusieurs éléments avec la même valeur id
("solTitle"), qui n'est pas valide. Vous auriez besoin de trouver une autre caractéristique commune (class
est généralement une bonne option). Si vous modifiez toutes les occurrences de id="solTitle"
en class="solTitle"
, vous pouvez alors utiliser un sélecteur de classe:
$(".solTitle a")
Dupliquer les valeurs id
non valides, le code ne fonctionnera pas comme prévu si vous faites face à plusieurs copies du même id
. Ce qui a tendance à se produire est que la première occurrence de l'élément avec cette variable id
est utilisée et que toutes les autres sont ignorées.
Prenons une balise anchor avec un événement onclick, qui appelle une fonction Javascript.
<a href="#" onClick="showDiv(1);">1</a>
Maintenant, en javascript, écrivez le code ci-dessous
function showDiv(pageid)
{
alert(pageid);
}
Cela vous montrera une alerte de "1" ....
Le HTML devrait ressembler à:
<div class="solTitle"> <a href="#" id="solution0">Solution0 </a></div>
<div class="solTitle"> <a href="#" id="solution1">Solution1 </a></div>
<div id="summary_solution0" style="display:none" class="summary">Summary solution0</div>
<div id="summary_solution1" style="display:none" class="summary">Summary solution1</div>
Et le javascript:
$(document).ready(function(){
$(".solTitle a").live('click',function(e){
var contentId = "summary_" + $(this).attr('id');
$(".summary").hide();
$("#" + contentId).show();
});
});
Voir l'exemple: http://jsfiddle.net/kmendes/4G9UF/
<div class = "solTitle"> <a href = "#" id = "solution0" onClick = "openSolution();">Solution0 </a></div> <br>
<div class= "solTitle"> <a href = "#" id = "solution1" onClick = "openSolution();">Solution1 </a></div> <br>
$(document).ready(function(){
$('.solTitle a').click(function(e) {
e.preventDefault();
alert('here in');
var divId = 'summary' +$(this).attr('id');
document.getElementById(divId).className = ''; /* or $('#'+divid).removeAttr('class'); */
});
});
J'ai changé peu de choses:
Vous ne pouvez pas avoir plusieurs fois le même ID pour des éléments. C'est censé être unique.
Utilisez une classe et rendez vos identifiants uniques:
<div class="solTitle" id="solTitle1"> <a href = "#" id = "solution0" onClick = "openSolution();">Solution0 </a></div>
Et utilisez le sélecteur de classe:
$('.solTitle a').click(function(evt) {
evt.preventDefault();
alert('here in');
var divId = 'summary' + this.id.substring(0, this.id.length-1);
document.getElementById(divId).className = '';
});
Vous affectez un événement onclick
à l'intérieur d'une fonction. Cela signifie qu'une fois que la fonction a été exécutée une fois, le deuxième événement onclick
est également affecté à l'élément.
Attribuez la fonction
onclick
ou utilisez jqueryclick()
.
Il n'y a pas besoin d'avoir les deux