Я написал пользовательский скрипт для 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()
на случай, если холст не будет найден.
Поэтому, пожалуйста, дайте мне знать, как лучше всего сделать этот скрипт кроссбраузерным. О, и я прислушиваюсь к тому, чтобы сделать этот скрипт лучше/эффективнее с точки зрения кода (что, я уверен, возможно)
редактировать: нет помощи...? :'(
edit 28-Apr:
я немного переписал код, и теперь он выглядит примерно так:
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()
работает вечно, если я удалю эту строку ??