greasemonkey, jquery и $ быть неопределенным - совместимо с Chrome - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь написать оболочку jquery, которая позволит новым пользовательским скриптам работать вместе со старыми, как в chrome, так и в firefox, и запускать jquery. Мои прежние пользовательские скрипты использовали метод Джоан Пьедры (http://joanpiedra.com/jquery/greasemonkey/), но это не работает в Chrome, потому что Chrome не поддерживает unsafewindow.

Итак, я нашел метод Эрика Волда для запуска jQuery в Chrome (http://erikvold.com/blog/index.cfm/2010/6/14/using-jquery-with-a-user-script),, однако он не работает вообще в Firefox вместе с существующими пользовательскими скриптами.

Я решил попытаться адаптировать сценарий Эрика, чтобы сначала искать jquery, а затем вставлять тег сценария, только если jquery не определен. Если jquery существует, он не вставляет тег сценария jquery, а просто запускает обратный вызов jquery (в режиме без конфликтов, потому что я ожидаю, что он будет работать и на странице с scriptaculous.)

Моя проблема (первая из многих, я уверен, учитывая количество требований, которые у меня есть) связана с оператором if / else в addJQuery: в части else оператора (где объект jquery не должен быть 'undefined) ') объект jquery все еще фактически не определен, поэтому я получаю сообщение об ошибке, что $ не определено при выполнении обратного вызова.

Оригинальный код Эрика прикрепил прослушиватель событий к загрузке скрипта jquery, но я не знаю, как это сделать в случае, если jquery уже существует, но не обязательно загружен (я пытался прикрепить прослушиватели событий к окну, документ, document.head и document.body и ничего не работает.)

Я также пытался использовать window.setTimeout, но не смог повторить его более одного раза с одинаковыми результатами ($ не определено).

Я также упомяну, что в случае, когда я знаю, что jQuery не существует, сценарий успешно добавляет тег сценария, и я прикрепил прослушиватель событий к сценарию, и я все еще получаю ошибку что $ не определено.

Так что я сейчас в полном недоумении. Я не могу обнаружить jQuery, даже когда мне кажется, что я не могу запустить код, и даже когда кажется, что он есть, он все равно ломается.

function addJQuery(callback) {
if(typeof jQuery == 'undefined'){
    var libsrc = "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js";
    var dochead = head = document.getElementsByTagName('head')[0];
    var jqscript = document.createElement("script");
    jqscript.setAttribute("type","text/javascript");    
    jqscript.setAttribute("src", libsrc);

    // append script tag as first element in the head 
    dochead.insertBefore(jqscript, head.childNodes[0]);

    jqscript.addEventListener('load', function(){
        var runscript = document.createElement("script");

        // force no conflict mode allowing $
        runscript.textContent = "jQuery.noConflict(); (function($) {   $(function() {" + callback.toString() +  "}); })(jQuery);";
        document.getElementsByTagName('head')[0].appendChild(runscript);
        callback();
    }, false);
}
else{
    // jquery is still undefined?!?!?!?!
    var runscript = document.createElement("script");
    runscript.setAttribute("type", "text/javascript");  

    // force no conflict mode allowing $
    runscript.textContent = "jQuery.noConflict(); (function($) {       $(function() {" + callback.toString() +  "}); })(jQuery);";
    document.getElementsByTagName('head')[0].appendChild(runscript);
    callback();

}

}

function main() {
 alert($); // check if the dollar (jquery) function works
 alert($().jquery); // check jQuery version
}

// load jQuery and execute the main function
addJQuery(main);

Ответы [ 2 ]

0 голосов
/ 07 декабря 2013

Я добавил строку $ = jQ.noConflict(true); в сценарий Эрика Волда. Это работает для меня!

// ==UserScript==
// @name         jQuery For Chrome (A Cross Browser Example)
// @namespace    jQueryForChromeExample
// @include      *
// @author       Erik Vergobbi Vold & Tyler G. Hicks-Wright (modified)
// @description  This userscript is meant to be an example on how to use jQuery in a userscript on Google Chrome.
// ==/UserScript==

// loads jQuery with a callback when jQuery has loaded
function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "$=jQuery.noConflict(true);(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

function main() {
    // rest of code goes here
}

// load jQuery and execute the main function
addJQuery(main);
0 голосов
/ 11 мая 2011

Чтобы решить проблему $ неопределено, вы можете сделать это, прежде чем весь ваш код:

function esperar() {

        if (typeof unsafeWindow.jQuery == 'undefined') {

            // Si aún no se ha cargado, esperar un poco más

            window.setTimeout(esperar, 100);



        } 

        else {

            $ = unsafeWindow.jQuery.noConflict(true);

        }

    }
...