Question Le label "javascript:" peut-il poser problème?


JSLint et JSHint émettent des avertissements lorsqu'ils rencontrent une instruction étiquetée dont l'identificateur correspond à l'expression régulière suivante:

/^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i

Par exemple, l'extrait de code suivant génère un avertissement "JavaScript URL" de JSLint et un avertissement "Label" javascript "ressemble à une URL javascript" de JSHint (le wrapper de fonction n'est pas nécessaire, mais JSLint n'aime pas les instructions étiquetées non fonctionnelles -scope et déclenche un avertissement différent):

function example(x, y) {
javascript:
    while (x) {
        while (y) {
            break javascript;
        }
    }
}

Autant que je sache, aucun navigateur ne s'en soucie, même s'il apparaît immédiatement après le protocole "javascript:" dans un bookmarklet. Par exemple, les éléments suivants semblent toujours fonctionner (il suffit de coller dans la barre d'adresse comme n'importe quel bookmarklet):

javascript:(function () { javascript:for(var i = 0; i < 2; i++) { alert(i); break javascript; } }());

javascript:javascript:for(var i = 0; i < 2; i++) { alert(i); break javascript; }

L'identifiant de l'étiquette "javascript:" (ou toute autre chaîne qui correspondrait à cette expression régulière) aurait-il déjà causé des problèmes (certains anciens navigateurs peut-être?) Qui justifieraient les avertissements générés? Pourquoi ces avertissements sont-ils générés?


12
2018-04-12 08:18


origine


Réponses:


Je devine surtout ici, mais considère que:

  • javascript: n'est pas un protocole réel;
  • il n'est pas nécessaire ailleurs que dans les bookmarklets (sinon, il est supposé être un label);
  • l'avertissement le dit "ressemble à une URL javascript ".

Je pense que JSLint suggère que le javascript: le pseudo-protocole est mauvais, et tout ce qui lui ressemble ou pourrait être confondu avec lui. Pourrait-il causer des problèmes? À proprement parler, peut-être sur IE (peut-être oldIE uniquement). Mais, comme je l'ai dit, un javascript: l'étiquette pourrait être confus avec le pseudo-protocole, et JSLint n'aime rien de potentiellement déroutant. Donc, cela pourrait être une explication.


4
2018-04-13 01:20



Ce que dit bfavaretto est probablement vrai, surtout le dernier point, mais notez aussi que javascript: le pseudo-protocole est annulé.

Le MDN mentionne ceci: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void#JavaScript_URIs

"Notez cependant que le javascript: le pseudo-protocole est déconseillé par rapport à d’autres alternatives, telles que les gestionnaires d’événements discrets. "

Un article sur pourquoi: http://into-the-zen.blogspot.com/2010/04/dont-use-javascript-pseudo-protocol.html

"IE6 produit des effets secondaires ..."


1
2018-04-13 04:08