jQuerify Grease Monkey скрипт не работает для jQuery-зависимых скриптов на странице? - PullRequest
1 голос
/ 20 марта 2012

У меня есть простой $(document).ready(function(){}); на странице, который не может получить доступ к библиотеке jQuery.

Обычно я просто помещаю библиотеку на страницу, но это часть серверной страницы редактирования в CMS.Мне просто нужно, чтобы библиотека jQuery была загружена до запуска остальных сценариев, чтобы я мог внести несколько небольших изменений до воскресенья, когда мы сможем исправить эту проблему правильным способом (удаление этих сценариев сейчас не вариантмой единственный вариант - найти способ заставить обезьянку смазывать jQuerify для работы).Есть идеи?

Уточнение

Мне нужно "jQuerify" страницу, которую я просматриваю, но вместо того, чтобы делать это после загрузки DOM .. Мне это нужнозагрузить, как если бы он был в заголовке страницы, чтобы все зависимые скрипты работали правильно.Возможно ли это?

Надеюсь, это имеет смысл.Спасибо.

1 Ответ

2 голосов
/ 21 марта 2012

Это можно сделать с помощью мета-правила @run-at document-start. Затем сценарий выполняется еще до того, как будет создан корень документа.

Сценарий, приведенный ниже, продолжает работать с интервалом до тех пор, пока не появится document.documentElement (<html>) или document.head (<head>). Затем он внедряет jQuery.

Я подтвердил, что код работает с использованием этой fiddle: http://jsfiddle.net/VuJjT/show/ (когда Userscript не активен, он показывает undefined 2x, в противном случае он показывает function 2x).

// ==UserScript==
// @name           jQuery before everything
// @namespace      Rob W
// @description    Inject jQuery as soon as possible, before start
// @include        *
// @run-at         document-start
// ==/UserScript==


var s = document.createElement('script');
s.onload = function() {
    // Clean-up
    this.parentNode.removeChild(this);
};
s.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js";
var poller = setInterval(function() {
    var insertInto = document.head || document.documentElement;
    if (insertInto) {              // `<html>` or `<head>` exists
        clearInterval(poller);     // Clear poller
        insertInto.appendChild(s); // Inject script.
    };
}, 4); // Every 4 milliseconds. This interval may run a few times.
...