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

И я считаю, что дело с неверным URI связано только с тем, что у нас нет файла favicon.ico.

Она использует Firefox 35.0.1, хотя она говорит, что та же ошибка произошла с IE (она не упомянула версию IE).

Если не считать того, что я попрошу ее установить Firebug, что, по моему мнению, вряд ли будет осуществимо, как я могу решить эту проблему?


person dgvid    schedule 30.01.2015    source источник
comment
Она отправила вам JS, который появился, когда она зашла на jsapi? Если да, то соответствует ли это тому, что вы получаете?   -  person Dancrumb    schedule 30.01.2015
comment
Кроме того, я бы посоветовал ей отправить вам исходный HTML-код, который она получает в своем браузере... неизвестно, какие устройства находятся на сетевом пути, и некоторые из них могут изменить ваш контент.   -  person Dancrumb    schedule 30.01.2015
comment
Исходный HTML-код, который получает ее браузер, идентичен тому, что отправляет мой сервер. Файл jsapi, который получает ее браузер, имеет некоторые тривиальные отличия: ее город и штат — Данн-Лоринг и Вирджиния, тогда как мои — Вашингтон и округ Колумбия; некоторые из ее библиотек загрузчика и номера версий находятся в другом порядке, чем у меня, например, у меня есть куча файлов веб-шрифтов, перечисленных перед ext-core. У нее ext-core указан перед webfont. Однако ссылки на землю идентичны.   -  person dgvid    schedule 04.02.2015


Ответы (4)


Я действительно не уверен в этом предположении, но: может быть, ваш первый скрипт загружается асинхронно? Тогда для медленных соединений (ваш клиент) эта проблема может возникнуть (я знаю, что вы не используете асинхронный тег, но, возможно, источник может запускать асинхронную загрузку).

Здесь лучше всего убедиться, что код Google, который вы используете, относится к типу sync, и повторно развернуть его.

Также https://bugsnag.com/ может быть для вас действительно интересным инструментом. Просто внедрите js, и вы сможете отслеживать каждую ошибку, которую получает ваш клиент.

person Fabian Lurz    schedule 04.02.2015
comment
Предложение асинхронности соответствует этим непоследовательным сбоям - person Code Whisperer; 04.02.2015
comment
Итак, я наивен, думая, что <script type="text/javascript" src="foo"></script> гарантированно загружается синхронно? То есть, что async=false не по умолчанию? - person dgvid; 11.02.2015
comment
Обычно он должен загружаться синхронно. Как я уже сказал, это предположение, но у меня была проблема в рамках проекта! Так что вам стоит попробовать. - person Fabian Lurz; 11.02.2015
comment
Кстати. - вы тестировали bugsnag? Даже если ваш клиент предоставил вам отчет об ошибке, в консоли может быть больше ошибок (или ваш клиент также является разработчиком, поэтому вы можете быть уверены, что сообщается о каждой ошибке?). - person Fabian Lurz; 11.02.2015

Повторно разверните свой код следующим образом:

<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>

Затем, когда ваш клиент столкнется с ошибкой, полная информация будет отправлена ​​​​прямо на ваш сервер, и вы сможете устранить ее при необходимости.

person Code Whisperer    schedule 04.02.2015
comment
Это отличная техника. Хотя в данном конкретном случае я уже знаю, что исключением является ReferenceError: google is notdefined main.html:484. - person dgvid; 04.02.2015

Это может быть что-то столь же простое, как браузер клиента, который блокирует выполнение javascript. Может быть, специально заблокировать ваш домен или что-то в этом роде.

person lifeIsGood    schedule 09.02.2015

Можете ли вы попробовать внешний скрипт, который загружает 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, чтобы свести к минимуму то, что загружается, но это может быть сложно со старой библиотекой. https://developers.google.com/loader/

person jlee-tessik    schedule 11.02.2015