#javascript #jquery #debugging #cross-browser #greasemonkey
#javascript #jquery #отладка #кросс-браузерный #greasemonkey
Вопрос:
Приведенный ниже код, скрипт Greasemonkey, работает в Firefox и Opera. Также при упаковке для Safari он работает нормально. Однако при запуске в Chrome я получаю неперехваченную ошибку ссылки: initScript не определен. Кажется, что все работает нормально вплоть до вызова initScript(). jQuery успешно загружается, и функции setWide() и setHigh() работают корректно.
Если я перемещу функцию initScript() внутрь preparePage(), то она будет работать нормально. Хотя я не уверен, зачем это необходимо.
У меня есть скрипт, завернутый в анонимную функцию, поэтому я мог бы установить «использовать строгий» один раз для всего скрипта. Я попытался запустить скрипт без «использовать строго», а также без упаковки. Изменений нет.
Любой совет был бы с благодарностью принят.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: я закомментировал весь код в каждой функции и просто поместил в консоль.сообщение журнала в начале каждой функции.
function initScript() {
console.log('initScript');
}
Если я сделаю это для каждой функции, то каждая функция будет выполняться в том порядке, в котором она должна быть. Мне интересно, может ли быть проблема в способе загрузки jQuery.
// ==UserScript==
// @name Testing Userscript
// @namespace http://www.example.com/scripts
// @description Cross browser testing
// @include *://apps.facebook.com/exmaple/*
// @include *://*.example.com/platforms/facebook/game
// @exclude *://apps.facebook.com/example/rubies
// @match *://apps.facebook.com/example/*
// @match *://*.example.com/platforms/facebook/game
// @include *://plus.google.com/games/example*
// @include *://*.googleusercontent.com/gadgets/ifr?url=app://example*
// @match *://plus.google.com/games/example*
// @match *://*.googleusercontent.com/gadgets/ifr?url=app://example*
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js
// @version 0.0.5
// ==/UserScript==
(function () {
"use strict";
function initScript() {
var $J = jQuery.noConflict(), /* Change jQuery alias */
OBJECT = "#swf_object", /* Page and browser specific constants */
GLOBAL_VAR1, /* Global constants from object flashvars (see getFlashvars) */
GLOBAL_VAR2;
function getFlashvars() {
var flashvars = $J(OBJECT " param[name='flashvars']").attr("value").split("amp;"),
keyValue,
rslt = {};
$J.each(flashvars, function () {
keyValue = this.split("=");
rslt[keyValue[0]] = keyValue[1];
});
GLOBAL_VAR1 = rslt.global_var1;
GLOBAL_VAR2 = rslt.global_var2;
alert(GLOBAL_VAR1);
}
getFlashvars();
}
function preparePage() {
var iframe,
$J = jQuery.noConflict(),
object = "#swf_object",
platform;
function setHigh() {
clearTimeout();
if ($J(object).length < 1) {
setTimeout(setHigh, 100);
return;
}
switch (platform) {
case "facebook":
$J("#hd > div").css("display", "none");
break;
case "google":
$J("#pane_hd").css("display", "none");
break;
}
$J("#container").width("760px");
initScript();
}
function setWide() {
clearTimeout();
if ($J(iframe).length < 1) {
setTimeout(setWide, 100);
return;
}
switch (platform) {
case "facebook":
$J("#rightCol").css("display", "none");
break;
}
$J(iframe).parents().width("100%");
}
if (window.location.href.indexOf("facebook") !== -1) {
iframe = "#iframe_canvas";
platform = "facebook";
} else if (window.location.href.indexOf("google") !== -1) {
iframe = "#oz-gadgets-canvas-iframe-example";
platform = "google";
}
if (window.top === window.self) {
setWide();
} else {
setHigh();
}
}
function addLibrary(callback) {
var script = document.createElement("script");
script.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js");
script.addEventListener('load', function () {
var script = document.createElement("script");
script.textContent = "(" callback.toString() ")();";
document.body.appendChild(script);
}, false);
document.body.appendChild(script);
}
if (typeof jQuery === "undefined") {
addLibrary(preparePage);
} else {
preparePage();
}
}());
Ответ №1:
ВОЗМОЖНОЕ РЕШЕНИЕ: удалена анонимная функция. Поместите функции initScript() и preparePage() внутри другой функции, называемой main(). Измените addLibrary(preparePage) на addLibrary (main). Добавлен вызов preparePage() в нижней части функции main(). Похоже, это работает в Chrome. Пока нигде не тестировался. Опубликую исправленный код, если / когда я буду доволен им. Не уверен, что это лучший способ пойти еще. Любой ввод всегда приветствуется 🙂