Помогите заставить работать usercript в chrome - PullRequest
0 голосов
/ 24 апреля 2010

Я написал пользовательский скрипт для Gmail: Pimp.my.Gmail и мне бы хотелось, чтобы он был совместим и с Google Chrome.
Теперь я попробовал пару вещей, насколько мне известно в Javascript (что очень слабо), и до некоторой степени был успешным, хотя я не уверен, что это правильный путь.

Вот что я попробовал, чтобы он работал в Chrome:
Самое первое, что я обнаружил, это то, что contentWindow.document не работает в Chrome, поэтому я попробовал contentDocument, который работает.
НО я заметил одну вещь, проверяя сообщения консоли в Firefox и Chrome, я увидел, что скрипт запускается несколько раз в Firefox, тогда как в Chrome он просто выполняется один раз!
Поэтому мне пришлось отказаться от строки window.addEventListener('load', init, false); и заменить ее на window.setTimeout(init, 5000);, и я не уверен, что это хорошая идея.

Еще одна вещь, которую я попробовал, это сохранить строку window.addEventListener('load', init, false); и использовать window.setTimeout(init, 1000); внутри init() на случай, если холст не найден.

Поэтому, пожалуйста, знайте, что будет лучшим способом сделать этот скрипт кросс-браузерным совместимым. Да, и у меня есть все уши, чтобы сделать этот скрипт лучше / эффективнее кода (что, я уверен, возможно)

редактировать: без помощи ...? : '(

редактировать 28 апреля:
я немного переписал код, и теперь он выглядит примерно так:

if(document.location != top.location) return;

(function() {
var interval = window.setInterval(waitforiframe, 3000);
var canvas;
function waitforiframe() {
    console.log("Finding canvas frame");
    canvas = document.getElementById("canvas_frame");
    if (canvas && canvas.contentDocument) {
        console.log("Found canvas frame");
        pimpmygmail();
    }
}
function pimpmygmail() {
    gmail = canvas.contentDocument;
    if(!gmail) return;
    window.clearInterval(interval);
    console.log("Lets PIMP.MY.GMAIL!!!");
    ......rest of the code......
})();

Это отлично работает в Firefox, но в Chrome выдает ошибку top is undefined. Еще одна вещь, которую я заметил, это то, что если я удаляю первую строку if(document.location != top.location) return;, метод waitforiframe() будет вызываться снова и снова. (т.е. я вижу ошибку "Finding canvas frame" в консоли)

может кто-нибудь сказать мне, что делает первая строка? я имею в виду, чего он добивается и почему метод waitforiframe() работает вечно, если я удаляю эту строку ??

1 Ответ

3 голосов
/ 01 мая 2010

БОЛЬШОЕ СПАСИБО ВСЕМ, КТО ПОМОГИЛ! -_- meh

Кстати, это было все, что мне было нужно в начале сценария:

try { if(top.location.href != window.location.href) { return; } }
catch(e) { return; }
...