Pourquoi l'utilisation de target = "_ blank" provoque-t-elle que Javascript échoue?

J'ai un tas de liens qui utilisent un attribut target = "_ blank" pour ouvrir dans une nouvelle fenêtre. Je souhaite attacher le suivi des objectifs de Google Analytics aux clics de ces liens.

Pour ce faire, j'ai essayé de joindre un attribut onclick = "pageTracker._trackPageview ('/ event / outgoing')" aux liens.

Mais j'ai découvert que pour les liens avec un attribut target = "_ blank", l'événement Javascript onclick est ignoré. Donc, le but n'est pas enregistré. En d'autres termes, ce lien enregistre avec succès l'objectif:

<a href="http://www.yahoo.com" onclick="pageTracker._trackPageview('/event/outgoing')">Click me</a> 

Mais ce n'est pas le cas:

 <a href="http://www.yahoo.com" target="_blank" onclick="pageTracker._trackPageview('/event/outgoing')">Click me</a> 

Est-ce que quelqu'un sait pourquoi cela pourrait se produire? En supposant qu'il n'y ait pas de solution facile, je suppose que je devrais utiliser Javascript pour résoudre le problème. Le code suivant enregistre avec succès un but (mais n'ouvre pas le lien):

 function attach_goal_tracking() { var links = document.getElementsByClassName("buyTicketsLink"); for(var i=0; i<links.length; i++) { links[i].onclick = record_goal; } } function record_goal(e) { e.stop(); pageTracker._trackPageview('/event/outgoing'); } 

Mais lorsque j'ajoute à la fonction record_goal pour ouvrir le lien …

 function record_goal(e) { e.stop(); pageTracker._trackPageview('/event/outgoing'); var newWindow = window.open(this.getAttribute('href'), '_blank'); newWindow.focus(); } 

… alors il ne parvient pas à suivre le but.

Quelqu'un peut-il me dire pourquoi cela pourrait et ce que je devrais faire pour contourner ce problème? FYI J'utilise Prototype pour Javascript.

Il pourrait y avoir un problème avec les bloqueurs de popup (je pense Googlebar) en empêchant la fenêtre d'ouvrir et (avec la présence d' onclick ) empêchant le code onclick de s'exécuter. Par exemple, voir cela et les problèmes de son similaire que d'autres personnes ont.

Ou il se pourrait simplement que le code du gestionnaire de clics lance une erreur qui empêche alors la fin du code. Voir mon commentaire à votre question sur la façon dont vous liez les événements. e.stop() peut être défaillant dans IE.

Votre hypothèse est cependant fausse. target="_blank" et onclick="..." travaillent ensemble très bien.

Testcase point: http://jsbin.com/anahe (ajouter /edit à l'url pour éditer le code). Vous devrez peut-être éteindre votre (vos) bloqueur (s) de popup :

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Sandbox</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <script>var clickCount= 0;</script> </head> <body> <a href="http://www.google.com" target="_blank" onclick="document.getElementById('dbg').innerHTML = ++clickCount"> open new </a> <div id="dbg"></div> </body> </html> 

En cliquant sur le lien ouvre une nouvelle fenêtre et met à jour le div avec le nombre de fois où le lien a été cliqué. Testé ceci dans IE6, IE7, FF2, FF3.5, Chrome 2, Chrome 3, Opera 9.

Il est possible, victor est juste, e.stop () est sans contrat, je peux confirmer que le code suivant ouvre avec succès un nouvel onglet, et alerte de manière asynchrone sur l'ancien onglet (ce qui fait que l'on retrouve la mise au point).

 <a href="" target="_blank">reload</a> <script> var as = document.getElementsByTagName('a'); for (var i = 0; i < as.length; i++) { var a = as[i]; a.onclick = function(e) { setTimeout(function() { alert('hi hi'); }, 1000); } } </script> 

La meilleure chose suivante est d'avoir une page de suivi des liens et d'acheminer tous vos liens externes à travers cette page.