2011-09-15 16 views
21

ho questo codice:jQuery figli a href click non funziona

<html> 
<head> 
<title>site</title> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $('#wlink a').click(function() { 
     $('.box:visible').fadeOut('fast', function() { 
      $('#' + (this.id).replace('link', '')).fadeIn('fast'); 
     }); 
     $('#wlink a').removeClass('selected'); 
     $(this).addClass('selected'); 
    }); 
    $('#wlink div').click(function() { 
     var child = $(this).children(); 
     child.click(); 
    }); 
    $('#linkbox1').addClass('selected'); 
    $('#box1').fadeIn('fast'); 
}); 
</script> 
</head> 

<style> 
a { outline: none; cursor: pointer; } 
#wrapper { border:1px solid #cccccc; border:solid 1px #ddd; width:806px; height:255px; overflow: hidden; } 
#wrapperBox { width:6000px; } 
span.text { font-size:100px; color:#aaa; } 
div.box { float:left; width:805px; height:255px; background:#efefef; display: none; } 
#wlink div { width: 200px; text-align:center; display: block; float:left; border: solid 1px #ddd; } 
a.selected { background: #eee; } 
</style> 

<body> 
<div id="wrapper"> 
    <div id="wrapperBox"> 
     <div id="box1" class="box"> 
      <span class="text">Box 1</span> 
     </div> 
     <div id="box2" class="box"> 
      <span class="text">Box 2</span> 
     </div> 
     <div id="box3" class="box"> 
      <span class="text">Box 3</span> 
     </div> 
     <div id="box4" class="box"> 
      <span class="text">Box 4</span> 
     </div> 
    </div> 
</div> 
<div id="wlink"> 
    <div><a id="linkbox1">Box 1</a></div> 
    <div><a id="linkbox2">Box 2</a></div> 
    <div><a id="linkbox3">Box 3</a></div> 
    <div><a id="linkbox4">Box 4</a></div> 
</div> 
</body> 
</html> 

Ora quello che voglio fare è quando il DIV padre della A HREF viene cliccato, voglio simulare un HREF clic. Ma non funziona, e ottengo questo errore:

too much recursion 
[Break On This Error])});return}if(e.nodeType===3||e.nodeTy...nt=="undefined"&&(b=b.ownerDocument|| 

Cosa c'è di sbagliato con il mio codice?

Grazie, J

risposta

30

sillyMunky è corretto in quanto verrà attivato anche il gestore di clic div, creando un ciclo infinito, ma il suo approccio alla risoluzione di questo problema non è la migliore pratica. Quello che vuoi fare è interrompere esplicitamente la propagazione dell'evento con e.stopPropagation() nel tuo gestore di clic e nonreturn false. L'utilizzo di return false farà più del necessario/previsto. Se vuoi anche impedire l'azione di clic predefinita e interrompere il salto della pagina, ti consigliamo di aggiungere e.preventDefault().

$('#wlink a').click(function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); //not part of fixing your issue, but you may want it. 
    $('.box:visible').fadeOut('fast', function() { 
     $('#' + (this.id).replace('link', '')).fadeIn('fast'); 
    }); 
    $('#wlink a').removeClass('selected'); 
    $(this).addClass('selected'); 
}); 

Per maggiori informazioni: Stop (Mis)using Return False

+1

Ho pensato che volesse interromperePropagazione e impedireDefault, il modo più efficiente per farlo è solo restituire falso. Inoltre, ho personalmente riscontrato problemi di compatibilità del browser con queste due funzioni, ma mai con l'utilizzo di return false. Non sono d'accordo sul fatto che l'utilizzo di return false sia una cattiva pratica, qualcuno che decida di dire che la sua migliore pratica sul proprio blog non mi taglierà alcuna senape. Se avesse avuto bisogno dell'azione di default, ma non dei ribollimenti, la risposta corretta sarebbe stata utilizzare e.stopPropagation. Preferisco la mia risposta più elegante. – sillyMunky

+0

Indicando queste cose nel collegamento e fornendo un'alternativa è una buona chiamata, forse l'OP non li ha incontrati prima. Ma penso che affermare che esiste una "best practice" per questo, che è la lunga strada, non è così utile. – sillyMunky

+1

Hai dato per scontato che lo volesse senza dirlo esplicitamente, il che credo sia il cattivo servizio.I neofiti devono capire * cosa * fa il loro codice e * perché * dovrebbero scriverlo in un modo o nell'altro. Se l'OP voleva "restituire false" pur comprendendo le sue implicazioni, bene. Quello che è un disservizio è dire "basta restituire false per impedire la propagazione", quando non è tutto che restituisce false e potrebbe avere altri impatti negativi. Sto dicendo "Questo è il codice che fa ciò che hai chiesto, ed ecco cosa restituisce il falso in realtà. Usare saggiamente". Davvero, non è un grosso problema. –

15

E 'sufficiente aggiungere return false; alla fine del gestore click del ancoraggio. Il problema sembra essere che il gestore di clic che viene sparato sta quindi ribollendo verso il div che lo contiene facendo un ciclo ricorsivo infinito. L'aggiunta di false false impedirà sia la propagazione dell'evento (il raggiungimento della gerarchia agli elementi padre) e l'azione predefinita eseguita (seguendo il collegamento se è stato fatto clic).

Si potrebbe fare ciò utilizzando le singole funzioni dell'oggetto evento (e.stopPropagation ed e.preventDefault rispettivamente) se si preferisce, tuttavia è più probabile (nella mia esperienza) avere problemi nei browser di destinazione facendo questo rispetto eseguendo entrambi contemporaneamente con la tecnica return false;.

$('#wlink a').click(function() { 
    $('.box:visible').fadeOut('fast', function() { 
     $('#' + (this.id).replace('link', '')).fadeIn('fast'); 
    }); 
    $('#wlink a').removeClass('selected'); 
    $(this).addClass('selected'); 
    return false; 
}) 
+0

Quando faccio clic sulla casella 2 o casella 3 Il riquadro 1 mostra – Tech4Wilco

0

Credo che il problema consiste nel fatto che si sono vincolanti un evento click sia al div e l'ancora (che è avvolto dalla stessa div). Quindi, quando qualcuno fa clic sul div o su qualsiasi link al suo interno, entrambi gli eventi click verranno attivati.

29

@ Adamo Terlson ha una buona soluzione se non si desidera modificare il codice. Ecco la mia soluzione:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>site</title> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
$('#wlink a').click(function() { 
    var l = (this.id).replace('link', ''); 
    $('.box:visible').fadeOut('fast', function() { 
     $('#' + l).fadeIn('fast'); 
    }); 
    $('#wlink a').removeClass('selected'); 
    $(this).addClass('selected'); 
}); 
$('#linkbox1').addClass('selected'); 
$('#box1').fadeIn('fast'); 
}); 
</script> 

</head> 

<style> 
a { outline: none; } 
#wrapper { border:1px solid #cccccc; border:solid 1px #ddd; width:806px; height:255px; overflow: hidden; } 
#wrapperBox { width:6000px; } 
span.text { font-size:100px; color:#aaa; } 
div.box { float:left; width:805px; height:255px; background:#efefef; display: none; } 
a.linkBox { cursor: pointer; width: 200px; text-align:center; display: block; float:left; border: solid 1px #ddd; } 
a.selected { background: #eee; } 
</style> 

<body> 

<div id="wrapper"> 
    <div id="wrapperBox"> 
     <div id="box1" class="box"> 
      <span class="text">Box 1</span> 
     </div> 
     <div id="box2" class="box"> 
      <span class="text">Box 2</span> 
     </div> 
     <div id="box3" class="box"> 
      <span class="text">Box 3</span> 
     </div> 
     <div id="box4" class="box"> 
      <span class="text">Box 4</span> 
     </div> 
    </div> 
</div> 
<div id="wlink"> 
    <a class="linkBox" id="linkbox1">Box 1</a> 
    <a class="linkBox" id="linkbox2">Box 2</a> 
    <a class="linkBox" id="linkbox3">Box 3</a> 
    <a class="linkBox" id="linkbox4">Box 4</a> 
</div> 

</body> 
</html> 

Non invocato alcuna delle precedenti HREF risposto ma piuttosto usare senza DIV e utilizzare i CSS per fare la magia. In questo modo, non è necessario selezionare i bambini, i genitori ecc ...

+0

Penso che sia più facile da capire ma ho troppo codice che devo cambiare. Grazie – Tech4Wilco