测试JavaScript是否已启用和/或正确运行

时间:2011-06-29 08:23:42

标签: javascript jquery greasemonkey

我采用了不同的方法来确定JS是否正确启用/运行。

通常我只是做这样的事情:

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

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

所以,我可以看到我是否不小心禁用了JS,或者我有语法错误而JS没有正确运行而没有咨询firebug。

现在,这需要我修改每一页。使用Greasemonkey我认为这个问题可以解决,而不会干扰网站。但到目前为止,我找不到办法。我试过了:

  • 在开放体后插入右侧
  • 将带有src的脚本标记插入远程服务器

即使由于脚本/语法错误而未执行网站上的JS,这两种方式仍然有效。

现在,我尝试使用Greasemonkey插入一个noscript容器并禁用js,以确定在Greasemonkey不受影响的情况下,站点上的JS是否会作出反应。不,如果没有JS,GM就无法运作:P

似乎GM独立于该网站上的所有其他脚本运行。有人知道解决方案吗?

1 个答案:

答案 0 :(得分:1)

Greasemonkey将运行,即使目标页面已禁用JS,因为GM在其自己的特权沙箱中运行。

您可以通过注入JS函数然后使用GM查看该函数是否实际运行来测试目标页面上的JS是否可用。

这是一个执行该操作的脚本:

// ==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 ();



请注意,两个@include指令分别用于允许和禁止JS的站点(使用NoScript附加组件)。 (脚本测试通过。)