Подтвердить что ты не робот

Не удается загрузить конечные точки Google Cloud в Internet Explorer 10

Я работаю над веб-сайтом, который использует Клиентскую библиотеку Google JavaScript, чтобы загрузить некоторые API, которые отображаются через Виртуальные конечные точки Google. Конечные точки были разработаны на Python, но я не уверен, что это фактор. Все работает отлично в Chrome, Firefox и Safari, но в Internet Explorer 10 я получаю эту ошибку:

SCRIPT5007: Unable to get property 'value' of undefined or null reference 
proxy.html, line 7 character 51

Я загружаю клиентскую библиотеку, используя код, похожий на этот предложенный Google в своей документации:

<script type="text/javascript">
    Oversee.Init();
    function init() {
        console.log("starting to load endpoints");
        gapi.client.load("marketplace", "1", function() {
            console.log("finished loading endpoints");
        }, "//" + window.location.host + "/_ah/api");
    }
</script>
<script type="text/javascript" src="https://apis.google.com/js/client.js?onload=init"></script>

На консоли выводится следующее:

starting to load endpoints 
SCRIPT5007: Unable to get property 'value' of undefined or null reference 
proxy.html, line 7 character 51

Обратите внимание, что строка "конечные конечные точки загрузки" никогда не выводится.

После довольно-печатной обработки этот код в proxy.html выглядит так, в частности, document.getElementById('root').value, поскольку document.getElementById('root') имеет значение null или undefined.

gapi.load('googleapis.proxy', {
    callback: function () {
        return window['googleapis']['server']['initWithPath']
            .call(this, document.getElementById('root').value);
    },
    config: {
        // snipped
    }
});

Я заметил, что если я перезагружу страницу, api загрузится успешно, со следующим выходом в консоли:

starting to load endpoints 
finished loading endpoints 

Все вышеизложенное происходит как при использовании локального сервера разработки, так и при использовании приложения, размещенного в экземплярах приложений Google App Engine.

Удалось ли кому-либо успешно позвонить в Google Cloud Endpoints из Internet Explorer 10? Если да, то что мне не хватает в моем коде?

РЕДАКТИРОВАТЬ: Проблема также происходит с примером Google для веб-приложений Cloud Endpoints. Я разместил его здесь: https://cloud-endpoints-demo.appspot.com, и такая же ошибка возникает при запуске в Internet Explorer 10.

РЕДАКТИРОВАТЬ 2: Я создал проблему здесь: https://code.google.com/p/googleappengine/issues/detail?id=10700

РЕДАКТИРОВАТЬ 3: Проблема также встречается в примере Google TicTacToe для облачных конечных точек. Я разместил его здесь: https://cloud-endpoints-tictactoe.appspot.com; как и в случае с другим демо, он отлично работает на Chrome и Safari, но с Internet Explorer 10 не работает.

EDIT 4:. Я более подробно рассмотрел прокси .html, который Google обслуживает. Ниже тега script, который вызывает ошибку, есть это тело, которое включает текстовое поле с идентификатором "root":

<body>
    <textarea id="root" style="display:none">/_ah/api</textarea>
    <div id="lcsclient" style="position:absolute;left:-10000px;"></div>
</body>

Итак, похоже, Google должен внести некоторые изменения в proxy.html, чтобы гарантировать, что документ загрузился до того, как javascript будет выполняться в Internet Explorer. Правильно ли я?

4b9b3361

Ответ 1

У меня были аналогичные проблемы с загрузкой API Google для плагина Google Планета Земля в IE 10 и 11. Единственное разрешение, которое мы нашли (кроме Google, это исправление) - заставить IE 10 работать в режиме IE 9. Каждая версия IE включает в себя механизмы рендеринга из предыдущих основных версий. Вы можете протестировать это руководство, зайдя в инструменты разработчика в IE и установите, какой движок рендеринга IE вы хотите использовать.

Вы можете заставить IE отображать в определенном режиме, добавив этот метатег в ваш html файл:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>

Он должен быть первым метатег в HTML файле, иначе IE будет проигнорирован. Этот метатег будет игнорироваться другими браузерами. Это, однако, сделает всю вашу страницу рендерингом с движком IE 9, чтобы вы потеряли возможности, присутствующие в IE 10 и 11. Если вам нужны функции IE 10, это решение не будет работать для вас. Если совместимость с IE 9 является частью ваших требований, это может быть проблемой для этой проблемы.

Эта ссылка содержит дополнительную информацию о режимах совместимости IE

Ответ 2

Это должна быть проблема JavaScript IE10. Согласованный нуль должен исходить от document.getElementById('root'), как вы указали. Ваша страница обычно не содержит такой элемент, и имя не является отличительным. Я подозреваю, что элемент "root" должен быть создан другой частью JavaScript, родом из Google, и это значит, что другой код JavaScript, который (молча), не удался. Используйте свой значительный Debug-Fu, чтобы посмотреть в этом направлении. Извините, я хотел бы помочь больше, но это нарушит условия и условия Microsoft (те, о которых я не плачу за каждый экземпляр, мне запрещено запускать их программное обеспечение).

EDIT: поскольку proxy.html содержит как код JavaScript, нарушающий JavaScript, так и элемент "root", Google может исправить его, изменив порядок элементов. Разумеется, многие авторы рекомендуют находить JavaScript непосредственно перед дном тела html. Если вы можете ссылаться на свою собственную копию proxy.html, вы можете попробовать исправить себя, прежде чем обманывать Google.

Ответ 3

Надеюсь, что это поможет:


var executeRequest = function(path, data, callback, method){
    var url = ‘YOUR_API_LINK' + path;
    $.ajax({
        url: url,
        type: method,
        dataType: 'json',
        data: data?data:null,
        success: function(data, status, xhr) {
        },
        error: function(xhr, status, error) {
        },
        complete: function(xhr, status) {
            var data = null;
            console.log('Request ' + url + ' completed');
            if (xhr.responseText && xhr.responseText.length > 0) {
                data = $.parseJSON(xhr.responseText);
            }
            if (callback)
                callback(data);
        }
    });
};

---------------

Simple call example of this function made in the same file :

---------------

var simpleGetUser = function(userKey, callback){
    this.executeRequest(
    '/user/v1/user/' + userKey,
    {/* If you got any parameters, put them here */},
    function (res) {
        if (callback)
            callback(res);
    }, 'GET');
};

Удачи!