2011-06-29 6 views
1

J'ai essayé différentes approches pour savoir si JS est activé/fonctionne correctement.Test si JavaScript est activé et/ou fonctionne correctement

Habituellement je fais quelque chose comme ceci:

$('.jstest').html('JavaScript works.'); 

<p class='jstest'></p> 

Alors, je peux voir si je accidentellement JS handicapées, ou j'ai une erreur de syntaxe et JS ne fonctionne pas correctement sans consulter Firebug. Maintenant, cela m'oblige à modifier chaque page individuellement. Avec Greasemonkey, j'ai pensé que ce problème pouvait être résolu, sans interférer avec le site. Mais jusqu'à présent, je ne pouvais pas trouver un moyen. J'ai essayé:

  • l'insertion d'un droit après que le corps d'ouverture
  • insérer une balise de script avec un src à un serveur distant

Les deux méthodes fonctionnent toujours, même si la JS sur le site n'est pas exécuté en raison d'erreurs de script/syntaxe.

Maintenant, j'ai essayé d'insérer un conteneur de noscript avec Greasemonkey et désactiver js pour savoir si le JS sur le site réagit pendant que Greasemonkey n'est pas affecté. Non, GM ne fonctionne pas sans JS: P

Il semble que GM fonctionne indépendamment de tous les autres scripts de ce site. Quelqu'un sait-il une solution?

Répondre

1

Greasemonkey s'exécutera, même si JS est désactivé sur la page cible, car GM s'exécute dans son propre sandbox privilégié.

Vous pouvez tester si JS est disponible sur la page cible en injectant une fonction JS, puis en utilisant GM pour voir si cette fonction a bien fonctionné.

Voici un script qui fait que:

// ==UserScript== 
// @name   _JS active test 
// @include   http://stackoverflow.com/questions/* 
// @include   http://www.nextdaypets.com/* 
// ==/UserScript== 

if (window.top != window.self) //-- Don't run on frames or iframes (normally). 
    return; 

//--- This function will be injected to see if JS is active on the target page. 
function TestPagesJS() { 
    var testNode  = document.createElement ("span"); 
    testNode.setAttribute ("style", "display: none;"); 
    testNode.setAttribute ('id', 'SpecialNodeToTestIfPageJS_IsActive'); 
    document.body.appendChild (testNode); 
} 

//--- Inject the test JS and try to run it. 
var scriptNode   = document.createElement ("script"); 
scriptNode.textContent = TestPagesJS.toString() + '\nTestPagesJS();'; 
document.body.appendChild (scriptNode); 

/*--- Do not call this function from within a timer. If you do, and the page's JS 
    is disabled (NoScript, etc.), the alerts will not fire. 
*/ 
function CheckIsNodePresent() { 
    var testNode  = document.getElementById ("SpecialNodeToTestIfPageJS_IsActive"); 
    if (testNode) 
     alert ('Javascript works fine on the target page.'); 
    else 
     alert ('Oops! Javascript is off or broken on the target page.'); 
} 

CheckIsNodePresent(); 



Notez que les deux @include directives sont un site où je laisse et DISALLOW JS, respectivement (en utilisant le module complémentaire NoScript) . (Les tests de script passent.)

+0

Wow, c'est une excellente solution. De plus, le contrôle des cadres est génial! – Chrisissorry

+0

Je suis content que tu aimes, Chris. A-t-il répondu à la question pour vous? –

+0

Certainement fait. J'ai essayé de traduire cela en jQuery, mais je n'ai pas réussi à le faire fonctionner. Lisez quelque part que jQuery n'est pas capable d'insérer correctement les balises de script ... – Chrisissorry

Questions connexes