2010-04-05 4 views
0

J'écris une application WWW, elle doit fonctionner sous IE. J'ai le problème avec le code qui fonctionne sous FF, mais je ne peux pas l'exécuter sous IE.le type d'entrée text et onKeyDown ne fonctionne pas sous IE

// Code JS

function test() 
{ 
    if (window.event.keyCode == 13) 
     window.location.assign("myPage.php"); 
} 

J'ai essayé des moyens similaires autour window.location et location.href, également document.location. J'ai lu que IE a des problèmes avec cela, alors je demande une solution.

Le but est, cette page se recharge après avoir tapé du texte dans <input type='text' name='item_code' onKeyDown='test()'> et cliquez sur Entrée. Le résultat est similaire à appuyer sur le bouton de type de soumission en dessous de la saisie de texte.

Dans IE, il recharge la même page et rien ne se passe. En FF il fonctionne correctement.

UPDATE 1:

solution Essayé donnée par bobince.

<input type='text' name='item_code'> 

<script type='text/javascript' > 

document.getElementsByName('item_code')[0].onkeydown = function(event) 
{ 
    if (event == undefined) { event = window.event; } 
    if (event.keyCode == 13) { window.location = 'myPage.php'; } 

    alert('1'); 
} 

</script>"; 

Le problème est que s'il y a alert('1'); ligne, page d'alerte et réoriente, s'il n'y a pas alert('1'); ligne, page, se recharge. Je ne sais pas quel est le problème ici?

MISE À JOUR 2:

I'am coller ce qui fonctionne enfin pour moi.

<form action='mainPage.php' method='POST'> 
    <input type='text' name='item_code'> 
</form> 

<script type='text/javascript' > 
    document.getElementsByName('item_code')[0].onkeydown= function(event) 
    { 
     if (event == undefined) 
     {  
      event = window.event; 
     } 

     if (event.keyCode == 13) 
     { 
      var js_item_code = document.getElementsByName('item_code')[0].value; 
      window.location = 'myPage.php?item_code='+js_item_code; 
      return false; 
     } 
    }; 
</script> 
+0

Que diriez-vous 'window.location.href = "mapage.php";' –

+0

'window.location.href' n'a pas de méthode' assign' (c'est le cas de 'window.location'). Cependant, je ne pense pas que ce soit votre problème parce que la même chose est vraie (et va jeter une erreur) dans Firefox. Vous avez également d'autres fautes de frappe dans votre code (que j'ai corrigé, mais vous les avez édité dans :-)) –

+0

oh, je ne sais pas, pls les éditer à nouveau si vous le pouvez, appréciez votre entrée – qlf00n

Répondre

5

C'est étrange, parce que votre utilisation de window.event devrait assurer votre fonction ne fonctionne jamais dans IE. C'est certainement ce qui se passe pour moi quand j'essaye ton code. Je soupçonne qu'il y a plus que tu ne nous montres pas.

La manière habituelle de gérer les événements de manière cross-browser avec gestionnaire d'événements en ligne attributs serait:

<input type="text" name="item_code" onkeydown="test(event)"> 

function test(event) { 
    if (event.keyCode===13) 
     window.location.href= 'myPage.php'; 
} 

Cela fonctionne parce que event dans l'attribut fait référence à la window.event globale dans IE, où dans tous les autres le navigateur fait référence à un argument local nommé event transmis à la fonction d'attribut du gestionnaire d'événements.

Cependant, il est généralement préférable d'éviter les attributs du gestionnaire d'événements et d'affecter des gestionnaires de JavaScript lui-même.Dans ce cas, vous avez besoin d'un chèque pour voir lequel utiliser:

<input type="text" name="item_code"> 

// in a script block after the input, or in document-ready code 
// 
document.getElementsByName('item_code')[0].onkeydown= function(event) { 
    if (event===undefined) event= window.event; // fix IE 
    if (event.keyCode===13) 
     window.location.href= 'myPage.php'; 
}; 

En général, je n'essayer de piéger Enter pour reproduire les pressions de touche/modifier le comportement de soumission de formulaire par défaut en dernier recours; mieux si vous pouvez laisser le formulaire se soumettre à l'endroit où vous voulez qu'il aille.

+0

Ok. J'ai essayé votre solution et cela semble fonctionner. Avoir un problème subtil cependant. Cela fonctionne seulement quand 'alert ('sth');' est après le 2ème si block: la page affiche une alerte et redirige. Si je supprime cette ligne d'alerte, la page se recharge en elle-même .. – qlf00n

+0

Si vous êtes dans un élément '

' réel, vous devrez ajouter 'return false' au gestionnaire d'événements, sinon le formulaire continuera à être soumis comme d'habitude pour appuyer sur le bouton Entrée, et finit à l'attribut 'action' du formulaire (par défaut à l'URL actuelle si omis, bien que l'omettre soit invalide). Si vous avez un formulaire et que vous voulez intercepter la soumission (via Entrée ou tout autre moyen), il vaut mieux utiliser l'événement 'onsubmit' plutôt que de recréer un comportement de manipulation de touches spécifique au navigateur. – bobince

+0

Bien sûr, il vaut mieux que la forme fonctionne simplement sans piratage JavaScript. Si ce n'est pas possible pour une raison quelconque, il est préférable d'omettre le '' et d'inclure simplement les éléments nus '' de sorte qu'il n'y ait pas de soumission indésirable. – bobince

0

Essayez ceci. ça a marché pour moi plus tôt.

<input type="text" onKeyPress="KeyCheck"/> 

function KeyCheck(e) { 
    var KeyID = (window.event) ? event.keyCode : e.keyCode; 
    if (KeyID == 13) { 
     alert('key pressed!!); 
    } 
    } 
+1

Cela ne fonctionnera pas. 'onKeyPress' est maintenant une fonction qui fait référence à la fonction' KeyCheck' et ne fait rien avec. KeyCheck ne sera jamais appelé. – bobince

0

Cela devrait fonctionner en général. Deux problèmes potentiels vous avez peut-être rencontré:

  1. IE est connu pour faire des choses bizarres lors de l'utilisation de liens relatifs dans location.href. Avez-vous essayé de mettre quelque chose comme http://stackoverflow.com là?
  2. Les paramètres de sécurité dans IE peuvent empêcher la bonne chose de se produire si, par exemple, vous testez un fichier local plutôt qu'un serveur Web.
0

jQuery fixer

document.onkeydown = function (e) { 
    var event = jQuery.event.fix(e || window.event); 
    var keycode = event.which; 
    var isControl = event.ctrlKey; 
} 
0

Il y a une façon de le faire fonctionner sans utiliser la balise <form> sur votre code html.

C'est la solution la plus simple, j'ai trouvé qui fonctionne avec IE, Chrome et Firefox au moins:

$(function() { 
 
    $("input#q").on('keydown', function(event) { 
 
    if (event.which == 13) { 
 
     document.location.assign("page.aspx?q=" + $("#q").val()); 
 
     return false; 
 
    } 
 
    }); 
 
});
<input name="q" type="text" />