IE suit le lien, même après onclick = "return false;"

link_to une application Rails 2.3.8 et link_to le link_to helper standard. J'ai un nombre raisonnable de liens que les méthodes utilisateur autres que GET, donc je passe a :method => :whatever option de link_to , et il génère un lien avec un gestionnaire onclick comme (indentation ajoutée pour la lisibilité):

 <a onclick=" var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', '31M3q8SJkRz7f0R80l42Z2W7O2N7ZrzufhWQYql/Zd8='); f.appendChild(s); f.submit(); return false;" href="/transactions/1015/transcribe" > Enter Data </a> 

Maintenant, pour une raison quelconque, IE (à la fois 7 et 8 – les deux que j'ai testé) a décidé que le return false; À la fin, il n'y a pas assez pour l'empêcher de suivre le lien, et je finis par obtenir deux requêtes sur mon serveur: la demande POST du gestionnaire onclick, que je veux, et la demande GET du lien lui-même, que je Ne le faites pas. En fait, cette route n'existe pas autrement qu'une demande POST, alors, lorsque le navigateur suit la requête GET, l'utilisateur est déversé sur un écran d'erreur «URL incorrecte». Pas bon.

Quelqu'un at-il déjà vu cela, et peut me dire ce qui l'a causé? Ou, mieux encore, est-ce que quelqu'un connaît une bonne solution de contournement?

PS: je préfère ne pas

  1. Monkey-patch link-to , ou
  2. Ecrivez ma propre version de link_to

Mais si c'est ce qu'il faut, c'est ce qu'il faut. Et j'emploie jQuery 1.5.something, si cela aide.

Pour éviter la soumission de formulaire dans JQuery, nous utilisons souvent

 event.preventDefault(); 

Donc, dans votre exemple, vous pouvez utiliser cela (comme cela a été mentionné dans les commentaires):

 $('a[onclick]').click(function(e) {e.preventDefault();}); 

J'espère que cela pourra aider!

En général, lorsque IE décide de "ignorer" un return false; À partir d'un onclick de l' onclick , c'est parce que l'une des lignes avant le return false; A jeté une exception. Cela entraînera une défaillance silencieuse du onclick , et le navigateur tentera alors d'accéder au lien href . Cela s'applique à tous les navigateurs, pas seulement à IE, mais il arrive souvent que IE jette des exceptions dans les cas où d'autres navigateurs ne le feront pas, donc pourquoi il semble que seul IE ignore le return false; .

Un correctif rapide pour cela consiste à définir href="#" , qui gardera le navigateur sur la page même si le onclick échoue. La manière appropriée de le débarrasser, cependant, est d'envelopper votre code onclick dans quelque chose comme try { ... } catch (ex) { alert(ex); } try { ... } catch (ex) { alert(ex); } Pour voir quelle est l'exception, puis réparez le code onclick afin qu'il ne lance plus l'exception.

J'ai eu ce problème avec IE avant et j'ai constaté qu'une solution fonctionne (ce qui, selon moi, est ce que jQuery's event.preventDefault () fait sous les couvertures), c'est faire tous deux return false; Pour les navigateurs normaux, mais aussi event.returnValue = false; (Avant le return réel, évidemment) pour IE. IE respectera cela.

Malheureusement, je ne sais pas comment glisser ça dans le link_to helper sans le pirater. C'est en fait ce que je suis venu ici à la recherche. 🙂

Je crois que le problème que vous soumettez à votre nouveau formulaire:

 f.submit(); 

Et vous le soumettez directement à votre lien href

 f.action = this.href; 

Donc, vous suivez cette adresse. Votre lien renvoie un formulaire faux mais le formulaire vous mène vers cet emplacement.

Donc votre link_to est ok. Le problème est à l'intérieur de votre javascript étrange.