4 votes

Est-il possible pour un JavaScript de se réécrire lui-même ?

Je suis en train de développer un site web AJAX. J'ai rencontré des différences entre le JavaScript standard et le dialecte JavaScript de Microsoft.

Par exemple, .textContent (standard) et .text (microsoft). Je pourrais créer deux fichiers, l'un pour les navigateurs standard et l'autre pour les navigateurs microsoft, mais si je fais un changement, je dois le faire deux fois, ce n'est donc pas une option idéale. Mettre des instructions if à chaque fois que je rencontre un .textContent ne semble pas non plus être une solution optimale.

J'ai donc réfléchi à une solution basée sur un script, et j'ai trouvé quelque chose comme ceci :

function translate_to_msie_dialect(){
    var s = document.getElementsByTagName("script");
    var l = s.length;
    var i;
    for ( i = 0 ; i < l ; i ++ ) {
        var src = s[i].text;
        s[i].text = src.replace(/.textContent/g, ".text");
    }
  }

J'ai testé ce code sur Internet Explorer version 8, et il semble que faire son travail. (la traduction de ie à standard ne semble pas fonctionner, les navigateurs standards semblent exécuter le code non modifié à la place)

Le problème est que cela ne fonctionne que pour les scripts en ligne, et pas pour le fichier source js. scripts. Est-il possible de faire cette conversion scripts pour les fichiers javascript côté client ?

Je pourrais faire une vérification sur l'agent utilisateur (côté serveur), mais je préférerais faire mais je préférerais vérifier le dialecte lui-même, car certains navigateurs supportent une fonction et s'ils s'identifient en tant que ie, ils pourraient se retrouver dans un dialecte qu'ils ne comprennent pas.

2voto

Josh Stodola Points 42410

Pourquoi ne pas profiter des maux de tête déjà vécus par d'autres ? Vous n'êtes pas le premier à rencontrer ces bizarreries inter-navigateurs. Veuillez utiliser une bibliothèque comme jQuery qui corrige ce problème pour vous. Vous pourrez alors vous concentrer sur des choses plus importantes :)

2voto

galambalazs Points 24393

Il y a deux façons d'aborder ce problème :

1. Définir une fonction getter

function getText(el) {
  return el.textContent || el.innerText;
}

utilisation

var text = getText(el);

2. Test fictif (exécuté une seule fois)

var textContent = (function() { 
  var dummy = document.createElement("span");
  dummy.innerHTML = "full <span>support</span>";
  if (dummy.textContent === "full support") {
     return "textContent";
  } else {
     return "innerText";
  }
})();

utilisation

var text = el[textContent];

Je peux vous assurer qu'aucune de ces méthodes ne vous causera de problèmes de performance. De plus, les deux méthodes peuvent être combinées en une seule, de sorte que la propriété correcte soit décidée une fois et que la fonction la renvoie toujours.

Notez également que la deuxième méthode n'est pas seulement plus performante, elle est aussi plus sûre, car elle vérifie la fonctionnalité correcte au lieu de l'existence de la propriété.

1voto

SLaks Points 391154

Au lieu de cela, vous pouvez faire un getText et affecter la fonction dans un if à une implémentation spécifique au navigateur.

Par exemple :

if (typeof document.body.textContent === 'undefined')
    getText = function(element) { return element.innerText; }
else
    getText = function(element) { return element.textContent; }

Sinon, vous pouvez utiliser une bibliothèque Javascript multi-navigateurs telle que jQuery qui s'occupe de tout cela pour vous.

1voto

MooGoo Points 11094

Utilisons Javascript à son plein potentiel, ce qui est difficile à faire avec IE, mais pas avec les autres navigateurs.

if (typeof HTMLElement != 'undefined')
  HTMLElement.prototype.__defineGetter__('innerText', function() {
    return this.textContent;
  });

Avec cela, vous pouvez utiliser innerText dans les navigateurs non-IE avec des résultats cohérents.

Une autre méthode à envisager. Je dirai que certains mettent en garde contre les méfaits de la modification des prototypes d'armes à feu. hébergé sur objets (j'attends les downvotes). Je ne suis toutefois pas d'accord, puisqu'il s'agit d'une cale de compatibilité destinée aux navigateurs autres que IE, qui se comportent tous correctement à cet égard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X