Не удается загрузить Google JSPAI, но только для клиентов
Мой веб-сайт должен использовать плагин Google Планета Земля немного дольше (я знаю, API устарел, но я застрял с ним еще несколько месяцев). Я загружаю его, включая google.com/jsapi, затем звоню google.load
вот так:
...
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("earth", "1", {"other_params": "sensor=false"});
google.setOnLoadCallback(function () {
// call some JavaScript to begin initializing the GE plugin
});
</script>
</body>
</html>
Это хорошо работает с нескольких компьютеров и с несколькими браузерами внутри брандмауэра нашей компании. Он хорошо работает с моего домашнего компьютера и с домашних компьютеров моих коллег. Однако, когда мой клиент пытается загрузить его, он получает сообщение об ошибке, что Google не определен в строке, которая начинается google.load(
,
Конечно, глобальная переменная google определяется в начале файла www.google.com/jsapi, поэтому, предположительно, этот файл не загружается. Сначала я предположил, что ее корпоративный брандмауэр блокирует этот файл, но когда я попросил ее вставить " https://www.google.com/jsapi" в адресную строку своего браузера, она сказала, что сразу загрузил страницу JavaScript.
Весь вывод на консоль браузера:
Invalid URI. Load of media resource failed. main.html
ReferenceError: google is not defined main.html:484
И я считаю, что бизнес Invalid URI только потому, что у нас нет файла favicon.ico.
Она использует Firefox 35.0.1, хотя и говорит, что та же ошибка произошла с IE (она не упомянула версию IE).
Если не попросить ее установить Firebug, что, я думаю, не осуществимо, как я могу устранить эту проблему?
4 ответа
Я действительно не уверен с этим предположением, но: может ли быть так, что ваш первый скрипт загружается асинхронно? Тогда для медленных соединений (ваш клиент) эта проблема возникнет (я знаю, что вы не используете асинхронный тег - но, возможно, источник может инициировать загрузку асинхронного).
Лучше всего убедиться, что используемый вами код Google sync
вид и перераспределение.
Также https://bugsnag.com/ может быть действительно интересным инструментом для вас. Просто внедрите js, и вы сможете отслеживать каждую ошибку, которую получает ваш клиент.
Повторно разверните ваш код следующим образом:
<script type="text/javascript">
try {
google.load("earth", "1", {"other_params": "sensor=false"});
google.setOnLoadCallback(function () {
// call some JavaScript to begin initializing the GE plugin
});
} catch (e) {
$.post('http://<your-remote-debug-script-or-service>',e)
}
</script>
Затем, когда ваш клиент обнаружит ошибку, полная информация будет отправлена непосредственно на ваш сервер, и вы сможете устранить неполадки при необходимости.
Можете ли вы попробовать внешний скрипт, который загружает Google jsapi, а затем поместить свой код в обратный вызов, чтобы убедиться, что он загружен?
<script type="text/javascript">
function loadScript(url, callback){
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState){ //IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" ||
script.readyState == "complete"){
script.onreadystatechange = null;
callback();
}
};
} else { //Others
script.onload = function(){
callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}
loadScript("https://www.google.com/jsapi", function(){
google.load("earth", "1", {"other_params": "sensor=false"});
google.setOnLoadCallback(function () {
// call some JavaScript to begin initializing the GE plugin
});
});
</script>
(Изменено с http://www.nczonline.net/blog/2009/07/28/the-best-way-to-load-external-javascript/)
Вы также можете посмотреть на jsapi Auto-Loading, чтобы минимизировать то, что загружено, но это может быть сложно с более старой библиотекой. https://developers.google.com/loader/
Это может быть что-то столь же простое, поскольку браузер клиента блокирует выполнение JavaScript. Может быть, специально заблокировать ваш домен или что-то в этом роде.