2013-09-04 3 views
3

Je vais tester le caractère inséré si elle est rtl ou ltr et moi ce code:expression régulière ne fonctionne pas dans IE8

function checkRTL(s) { 
    var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800- 
    \u1FFF' + '\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF', 
      rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC', 

      rtlDirCheck = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']'); 

    return rtlDirCheck.test(s); 
} 
; 
function checkSpecialChars(s) { 
    var sChars = '0-9`[email protected]#$%^&*()_+\\-=\\|\\[\\]{};\'":,.<>/', 
      checkChar = new RegExp('^[' + sChars + ']+'); 
    return checkChar.test(s); 
} 
var input = $('#password').on('keypress', keypress); 

function keypress(e) { 
    setTimeout(function() { 
     var isRTL = checkRTL(String.fromCharCode(e.charCode)); 
     var isSpecial = checkSpecialChars(String.fromCharCode(e.charCode)); 

     var dir = isRTL ? 'RTL' : 'LTR'; 
     if(dir=='RTL'){ 
      document.getElementById("langDir").innerHTML="<img src='../img 
     /signup_images/att.png'>Hello!"; 
     $("#langDir").css("display","block"); 
     } 
     else 
     { 
      document.getElementById("langDir").innerHTML=""; 
     $("#langDir").css("display","none"); 
     } 
    }, 100); 
} 

Ce code fonctionne parfaitement dans IE 9, 10, Chrome et Firefox . Mais il ne fonctionne pas dans IE8 Après un certain débogage que j'ai trouvé que cette ligne:

rtlDirCheck = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']'); 

    return rtlDirCheck.test(s); 

retourne toujours Faux. Qu'est-ce qui ne va pas avec ça?

+0

* "J'ai découvert que cette ligne ..." * c'est deux lignes. Lequel est «faux», le «nouveau RegExp» ou «retour ...»? En outre, des erreurs dans votre console? – Phil

+0

aucune erreur, la deuxième ligne –

Répondre

1

Tout d'abord, je ne peux détecter aucun problème avec votre regex. Aussi avec le html suivant IE 7 à 10 me dit toujours le résultat est vrai (j'utilise IE 10.0 dans les modes de rétrocompatibilité).

<html> 
<body> 
<script> 
var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' + '\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF',  
rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC', 
rtlDirCheck = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']'); 

alert("result = "+ rtlDirCheck.test('\u0591')); 
</script> 
</body> 
</html> 

Le problème n'est donc pas cette fonction. Il est très probablement son entrée:

String.fromCharCode(e.charCode) 

IE ne définit pas e.charCode, mais utilisé e.keyCode. En fait, e.charCode est uniquement utilisé par les navigateurs webkit. Jetez un oeil au chapitre 3 de cet excellent breakdown de toutes les différences entre les événements de clavier dans un navigateur différent. Je suggère d'utiliser:

String.fromCharCode(e.which || e.keyCode) 
+0

Exactement, Ce que je cherchais. Merci! –

Questions connexes