Проверьте, включен ли JavaScript и / или работает ли он правильно - PullRequest
1 голос
/ 29 июня 2011

Я использовал разные подходы, чтобы выяснить, включен ли JS / работает ли он правильно.

Обычно я просто делаю что-то вроде этого:

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

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

Итак, я могу видеть, случайно ли я отключил JS, или у меня есть ошибка синтаксиса, и JS работает неправильно без консультации с firebug.

Теперь, это требует, чтобы я изменил каждую страницу.С Greasemonkey я думал, что эту проблему можно решить, не мешая сайту.Но пока я не мог найти способ.Я пытался:

  • вставка сразу после открывающего тела
  • вставка тега сценария с помощью src на удаленный сервер

Оба способа все ещеработать, даже если JS на сайте не выполняется из-за ошибок скрипта / синтаксиса.

Теперь я попытался вставить контейнер noscript с помощью Greasemonkey и отключить js, чтобы выяснить, есть ли JS на сайтереагирует, пока Greasemonkey не затронут.Нет, GM не работает без JS: P

Кажется, что GM работает независимо от всех других сценариев на этом сайте.Кто-нибудь знает решение?

1 Ответ

1 голос
/ 29 июня 2011

Greasemonkey будет работать, даже если на целевой странице отключен JS, потому что GM работает в своей собственной привилегированной песочнице.

Вы можете проверить, доступен ли JS на целевой странице, введя функцию JS и затем используя GM, чтобы проверить, действительно ли эта функция выполнялась.

Вот скрипт, который делает это:

// ==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). (Скрипт тестов пройден.)

...