Скрипт не работает без TamperMonkey

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

Хотел бы я знать, что это было из-за? Что у TamperMonkey больше для запуска моего скрипта?

// ==UserScript==
// @name        Rainbow DDB
// @namespace   Rainbow DDB
// @description Change la couleur du "!" lorsqu'une DDB est en cours.
// @include     http://www.jeuxvideo.com/forums/3-*
// @include     http://www.jeuxvideo.com/forums/1-*
// ==/UserScript==

$ = unsafeWindow.$;
var dates = document.querySelectorAll(".date");
i=0;

function ddb(j) {
url = dates[j].getElementsByTagName("a")[0].href;
   $.get(
   url, 
   function(data) {
   if (data.indexOf("Signalement déjà fait") >= 0) {
   dates[j].querySelector("a img").src = "http://image.noelshack.com/fichiers/2013/17/1367080939-14agd2.png";
   } else if (data.indexOf("Vous êtes à l'origine") >= 0) {
   dates[j].querySelector("a img").src = "http://image.noelshack.com/fichiers/2013/17/1367081255-14aig2.png";
   } else if (data.indexOf("effectué un boost") >= 0) {
   dates[j].querySelector("a img").src = "http://image.noelshack.com/fichiers/2013/17/1367073914-149xe2.png";
   } else if (data.indexOf("Autosignalement déjà effectué") >= 0) {
   dates[j].querySelector("a img").src = "http://image.noelshack.com/fichiers/2013/17/1367082905-14atu2.png";
   }
   });
}


while (i<dates.length) {
   ddb(i);
   i++;
  }

Как видите, это очень простой скрипт. Является ли $.get проблемой? Я пробовал без $ = unsafeWindow.$; но это тоже не работает.


person Delgan    schedule 22.05.2013    source источник


Ответы (1)


Tampermonkey поддерживает правильный unsafeWindow, в то время как пользовательские скрипты Chrome имеют урезанный, в основном бесполезный объект с таким именем. См. "Почему окно (и unsafeWindow) отличается от пользовательского скрипта и тега?".

Я рекомендую просто поддерживать Tampermonkey и не заморачиваться с прямыми пользовательскими скриптами Chrome. Это дает несколько преимуществ:

  1. Почти полная поддержка мощного API Greasemonkey.

  2. Это означает, что почти все скрипты Greasemonkey будут работать как есть в Tampermonkey, и существует множество готовых скриптов< /а>.

  3. Значительно проще устанавливать, создавать, редактировать, обновлять и поддерживать сценарии Tampermonkey. Особенно теперь, когда в Chrome есть функция «Установить из нашего $tore, иначе!» политика для юзерскриптов и полноценных расширений.

  4. Автоматическая и простая синхронизация между компьютерами, если вы используете функции синхронизации Chrome.



Если вы настаиваете на поддержке чистого Chrome, вам придется внедрить код. Вот так:

// ==UserScript==
// @name        Rainbow DDB
// @namespace   Rainbow DDB
// @description Change la couleur du "!" lorsqu'une DDB est en cours.
// @include     http://www.jeuxvideo.com/forums/3-*
// @include     http://www.jeuxvideo.com/forums/1-*
// ==/UserScript==

function GM_scriptMain ($) {
    var dates   = document.querySelectorAll (".date");
    var urlBase = "http://image.noelshack.com/fichiers/2013/17/";

    function ddb (j) {
        var url = dates[j].getElementsByTagName("a")[0].href;
        $.get (
            url, function (data) {
            if (data.indexOf("Signalement déjà fait") >= 0) {
                dates[j].querySelector("a img").src = urlBase + "1367080939-14agd2.png";
            } else if (data.indexOf("Vous êtes à l'origine") >= 0) {
                dates[j].querySelector("a img").src = urlBase + "1367081255-14aig2.png";
            } else if (data.indexOf("effectué un boost") >= 0) {
                dates[j].querySelector("a img").src = urlBase + "1367073914-149xe2.png";
            } else if (data.indexOf("Autosignalement déjà effectué") >= 0) {
                dates[j].querySelector("a img").src = urlBase + "1367082905-14atu2.png";
            }
        } );
    }

    for (var k = 0, L = dates.length;  k < L;  ++k) {
        ddb (k);
    }
}

withPages_jQuery (GM_scriptMain);

function withPages_jQuery (NAMED_FunctionToRun) {
    //--- Use named functions for clarity and debugging...
    var funcText        = NAMED_FunctionToRun.toString ();
    var funcName        = funcText.replace (/^function\s+(\w+)\s*\((.|\n|\r)+$/, "$1");
    var script          = document.createElement ("script");
    script.textContent  = funcText + "\n\n";
    script.textContent += 'jQuery(document).ready(function() {'+funcName+'(jQuery);});';
    document.body.appendChild (script);
};
person Brock Adams    schedule 24.05.2013