Скрипт работает с Greasemonkey, но не работает с Tampermonkey. Это из-за jQuery $.get?

Я сделал скрипт для Greasemonkey в Firefox, он отлично работает, но в Chrome с Tampermonkey ничего не происходит.

Я знаю, что Chrome ограничивает использование jQuery.

Я особенно нашел этот интересный пост: Как я могу использовать jQuery в сценариях Greasemonkey в Google Chrome?

Я пробовал решения, но все еще не могу запустить свой скрипт в Google 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-*
// @version     1
// ==/UserScript==

dates = document.getElementsByClassName("date");
i=0;

function ddb(j) {
    url = dates[j].getElementsByTagName("a")[0].href;
    $.get(url, function(data) {
        if (data.contains("Signalement déjà fait")) {
            document.getElementsByClassName("date")[j].getElementsByTagName("a")[0].getElementsByTagName("img")[0].src = "http://image.noelshack.com/fichiers/2013/17/1367080939-14agd2.png";
        }
    });
}

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

Единственное, что может быть проблемой, это $.get, не так ли?

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


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


Ответы (1)


Если вы хотите использовать версию jQuery, встроенную в этот веб-сайт, вам необходимо указать ее с помощью unsafeWindow. Другими словами: вам нужно определить $ как unsafeWindow.$ в начале вашего пользовательского скрипта.

Вот фиксированный код:

// ==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-*
// @version     1
// ==/UserScript==


$ = unsafeWindow.$;
dates = document.getElementsByClassName("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) {
            document.getElementsByClassName("date")[j].getElementsByTagName("a")[0].getElementsByTagName("img")[0].src = "http://image.noelshack.com/fichiers/2013/17/1367080939-14agd2.png";
        }
    });
}


while (i<dates.length) {
    ddb(i);
    i++;
}
person ghost    schedule 27.04.2013
comment
Спасибо за интерес к моей проблеме. К сожалению, я уже пробовал это решение, и оно не сработало. Попробовал еще раз, алерт () отображается правильно, а остальное нет. - person Delgan; 28.04.2013
comment
Но функция $.get работает нормально, и это была ваша проблема. Так что именно вы имеете в виду? Что не правильно отображается? Также, пожалуйста, дайте мне пример URL-адреса, где я могу полностью протестировать этот скрипт. - person ghost; 28.04.2013
comment
Извините, это французский сайт: jeuxvideo.com/forums/ Вы должны быть подключены, поэтому попробуйте использовать эти идентификаторы: псевдоним = Vlalprolo и пароль = kourkis87. Если скрипт работает нормально, вы должны увидеть значок ! справа от первого поста синий, а не красный. - person Delgan; 28.04.2013
comment
Я не мог войти с этими данными, но мне удалось найти причину проблемы. Речь идет о методе contains(), который вы использовали. Как вы можете видеть на странице MDN, он поддерживается только в Firefox. Вы можете заменить его методом indexOf(). Я отредактировал свой ответ, вы можете попробовать новый код. - person ghost; 28.04.2013
comment
Да я тупой, забыл что этот ник забанили... При этом смена содержит для IndexOf работает очень хорошо, спасибо! (и если вы хотите быть уверенным, снова используйте идентификатор Unamiegentille с паролем kourkis87) Все эти исследования о несовместимости между jQuery и Chrome… Я действительно смотрел не в том направлении. - person Delgan; 28.04.2013
comment
Иногда самые простые вещи труднее всего найти. Я рад, что смог вам помочь :) - person ghost; 28.04.2013
comment
@Pacerier, я не знаю, как это сегодня, но смысл был в том, чтобы дать вам полный контроль над функциями скриптов веб-сайта, переменными и т. д. Я не помню, можно ли это было сделать просто с помощью window вместо unsafeWindow, но возможно нет. Подробное описание доступно на вики wiki.greasespot.net/UnsafeWindow. - person ghost; 19.04.2015