为什么@ require-ing jQuery会在带有@ run-at document-start的脚本中抛出错误?

时间:2012-05-16 21:56:03

标签: javascript jquery dom greasemonkey

使用@run-at document-start指令时遇到问题。我确信这归结为缺乏经验,但对于我的生活,我无法弄清楚这一点。

除了一些其他指令外,这是整个脚本。

// @require https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js  
// @run-at  document-start

FF中的错误

Error: document.documentElement is null  
Source File: file:///C:/Users/---/Test-1/jquery.js  
Line: 4899

我看到并理解了这个问题,我只是不确定要采取哪些措施让我尽可能接近文档启动运行我的脚本,但仍然可以使@required脚本正常运行。 /> 我的第一篇文章有​​点紧张......请轻松一下:)

Firefox 12
Greasemonkey 0.9.20

1 个答案:

答案 0 :(得分:1)

是的,这是使用// @run-at document-start的缺点。尝试操作DOM的@required脚本可能会抛出错误。 (但是很多@required库很好,因为它们只是加载了稍后由代码激活的工具。)

您可以使用@resourceeval()和监控readyState来解决此问题。像这样:

// ==UserScript==
// @name        _Using DOM-manipulating libraries with run-at start
// @include     http://YOUR_SERVER/YOUR_PATH/*
// @run-at      document-start
// @resource    jQ_src https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js
// ==/UserScript==

var jQ_src  = GM_getResourceText ("jQ_src");

window.addEventListener ("readystatechange", FireWhenReady, true);

function FireWhenReady () {
    this.fired  = this.fired || false;

    if (    document.readyState != "uninitialized"
        &&  document.readyState != "loading"
        &&  ! this.fired
    ) {
        this.fired = true;
        eval (jQ_src);
        $(document).ready (DoStuff);
    }
}

function DoStuff () {
    //--- Where this next paragraph appears can give you an idea of the delays involved...
    $("body").append ('<p style="background:yellow;">Hello from quick-start jQuery!</p>');
}

重要!对于像jQuery这样的库,使用@run-at document-start没有太大意义,因为jQuery不会让你做任何事情,直到$(document).ready(),这是当Greasemonkey默认触发时。

提前加载jQuery什么也不买,因为那时你必须明确使用$(document).ready()(或the shortcut forms之一)。您可能有其他原因使用@run-at document-start,然后也想稍后使用jQuery。