Я написал пользовательский скрипт для 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()
работает вечно, если я удаляю эту строку ??