2010-01-28 4 views
3

J'ai JavaScript de cette source dans un commentaire d'un blog: frogsbrainfonction string.format JavaScript ne fonctionne pas dans IE

Il est un formateur de chaîne, et il fonctionne très bien dans Firefox, Google Chrome, Opera et Safari . Seul le problème est dans IE, où le script ne fait aucun remplacement du tout. La sortie dans les deux cas de test dans IE est seulement «bonjour», rien de plus.

S'il vous plaît aidez-moi à faire fonctionner ce script dans IE, car je ne suis pas le gourou Javascript et je ne sais pas par où commencer la recherche du problème.

Je posterai le script ici pour plus de commodité. Tous les crédits vont à Terence Honles pour le script jusqu'à présent.

// usage: 
// 'hello {0}'.format('world'); 
// ==> 'hello world' 
// 'hello {name}, the answer is {answer}.'.format({answer:'42', name:'world'}); 
// ==> 'hello world, the answer is 42.' 
String.prototype.format = function() { 
    var pattern = /({?){([^}]+)}(}?)/g; 
    var args = arguments; 

    if (args.length == 1) { 
     if (typeof args[0] == 'object' && args[0].constructor != String) { 
      args = args[0]; 
     } 
    } 

    var split = this.split(pattern); 
    var sub = new Array(); 

    var i = 0; 
    for (;i < split.length; i+=4) { 
     sub.push(split[i]); 
     if (split.length > i+3) { 
      if (split[i+1] == '{' && split[i+3] == '}') 
       sub.push(split[i+1], split[i+2], split[i+3]); 
      else { 
       sub.push(split[i+1], args[split[i+2]], split[i+3]); 
      } 
     } 
    } 

    return sub.join('') 
} 
+0

J'aime cette réponse (http://stackoverflow.com/questions/1038746/equivalent-of-string-format-in-jquery/1038930#1038930), c'est beaucoup plus concis :) – Mottie

Répondre

3

Je pense que le problème est avec ceci.

var pattern = /({?){([^}]+)}(}?)/g; 
var split = this.split(pattern); 

La fonction de fractionnement de Javascript agit différemment dans IE que dans les autres navigateurs.

S'il vous plaît jeter un oeil mon autre post dans SO

+0

Merci. Cela m'a pointé dans la bonne direction. Bien que le lien dans les commentaires à votre message n'a pas résolu ce problème, j'ai trouvé une solution plus générale ici: http://blog.stevenlevithan.com/archives/cross-browser-split –

1

var = divisé this.split (motif);

string.split(regexp)string.split(regexp) est rompu de nombreuses façons sur IE (JScript) et est généralement mieux évité. En particulier:

  • ne comprend pas les groupes de match dans le tableau de sortie
  • il omet des chaînes vides

    alert ('abbc'.split (/ (b) /)) // a, c

Il semble plus simple à utiliser replace plutôt que split:

String.prototype.format= function(replacements) { 
    return this.replace(String.prototype.format.pattern, function(all, name) { 
     return name in replacements? replacements[name] : all; 
    }); 
} 
String.prototype.format.pattern= /{?{([^{}]+)}}?/g; 
Questions connexes