«документ» не определен в Greasemonkey - PullRequest
4 голосов
/ 27 января 2011

Не более десяти минут назад я решил написать свой первый скрипт для Greasemonkey.У меня ноль опыта с этим.Кроме того, мой JavaScript немного ржавый, так как я давно писал в нем код.Но я не могу понять, почему Greasemonkey выдает мне эту ошибку:

Line: 9 
Char: 2 
Error: 'document' is undefined 
Code: 800A1391 
Source: Microsoft JScript runtime error

Вот мой сценарий:

// ==UserScript==
// @name           Easier WatchSeries
// @namespace      n/a
// @include        http://www.watch-series.com/episode/*
// ==/UserScript==

function thing()
{
    document.body.setAttribute('onload', show_links(document.getElementById('idepisod').value));
}
thing();

Все, что я хочу сделать, это добавить атрибут onLoad в телотег.Я получаю эту ошибку, когда захожу в «Управление новыми пользовательскими сценариями» -> «Редактировать».Кроме этого скрипт ничего не делает, так что явно что-то не так.

Я использую Firefox 3.6.13.

1 Ответ

5 голосов
/ 27 января 2011

Несколько вещей:

  1. Было обнаружено, что это загадочное сообщение об ошибке возникает, когда Greasemonkey не имеет надлежащего редактора, настроенного .

    1. Откройте about: config в вашем браузере.
    2. Фильтр на greasemonkey.editor .
    3. Введите действительный путь к действительному редактору. Мне нравится TextPad , но c:\Windows\System32\notepad.exe должно работать на большинстве систем Windows.
    4. Вам может необходимо перезапустить Firefox.

  2. Слушатели событий не могут быть добавлены таким образом из-за песочницы / безопасности Greasemonkey. См. Подводные камни GM, обработчики событий .

  3. Вам необходимо использовать unsafeWindow для вызова функций JS страницы , например show_links().

  4. При использовании сложных ajax-функций, которые часто не работают, рекомендуется заключить их в блоки try - catch.

  5. Эта страница переключается между www.watch-series.com и watch-series.com , поэтому обе должны быть в директивах @include. *


Сложив все это вместе, ваш скрипт станет:

// ==UserScript==
// @name           Easier WatchSeries
// @namespace      n/a
// @include        http://www.watch-series.com/episode/*
// @include        http://watch-series.com/episode/*
// ==/UserScript==

function my_func()
{
    try
    {
        unsafeWindow.show_links(document.getElementById('idepisod').value);
    }
    catch (zError)
    {
        alert (zError); //-- Use console.log() in place of alert(), if running Firebug.

    }
}

window.addEventListener ("load", my_func, false);
...