Нужно ли проверять, существует ли объект XMLHttpRequest? - PullRequest
3 голосов
/ 06 февраля 2011

Раньше я был программистом, но теперь периодически выполняю сценарии. Я пытаюсь создать игру на основе Ajax.

У меня есть файл .php со следующим javascript:

if (window.XMLHttpRequest) {
 XMLHttpRequestObject = new XMLHttpRequest();
} else if ( window.ActiveXObject ) {
 XMLHttpRequestObject = new ActiveXObject("Microsoft.SML.HTTP");
}

Тогда всякий раз, когда я хочу использовать мой запрос, например:

if ( XMLHttpRequestObject ) {
 XMLHttpRequestObject.open("GET","gameinfo.php?cmd=setgame&game=" + arg);
 XMLHttpRequestObject.onreadystatechange = function() {
  // handler  ...
 }
 XMLHttpRequestObject.send(null);
}                

Я не понимаю, почему мне нужно всегда быть уверенным, что объект XMLHttpRequest существует, прежде чем ссылаться на него Разве я не создал это? Как это могло не существовать? Это просто хорошая практика кодирования или есть какой-то реальный риск?

ОК, я убежден попробовать jQuery. Но если бы я придерживался чистого JavaScript, это было бы безопасно?

if (window.XMLHttpRequest) {
 XMLHttpRequestObject = new XMLHttpRequest();
} else if ( window.ActiveXObject ) {
 XMLHttpRequestObject = new ActiveXObject("Microsoft.SML.HTTP");
} else {
 alert("Sorry but it looks like this game won't work in your browser.");
}

Тогда всякий раз, когда я хочу использовать запрос, который у меня есть, например:

XMLHttpRequestObject.open("GET","gameinfo.php?cmd=setgame&game=" + arg);
XMLHttpRequestObject.onreadystatechange = function() {
 // handler  ...
}
XMLHttpRequestObject.send(null);

Ответы [ 5 ]

1 голос
/ 06 февраля 2011

Просто, чтобы начать здесь: используйте jQuery , это отвлекает грязные вещи с плохой кросс-браузерной совместимостью.

Этот первый блок кода предназначен для обнаружения функций, поскольку IE обрабатывает XMLHttpRequest s, в отличие от других браузеров, вам нужно выяснить, какой объект использовать.

При проверке существует вероятность того, что код совместимости (материал if (window.XMLHttpRequest) {...) пропустил регистр, в противном случаевы получите неприятные ошибки.

Я повторюсь, потому что это очень важно, используйте jQuery.Это самая мощная библиотека javascript.Например, запрос, который вы хотите сделать, это

$.get("gameinfo.php", 
    {cmd: "setgame", game: arg}, 
    function () { 
       //Success function
    }
);

И он обрабатывает все кросс-браузерные вещи прозрачно и просто работает.(В jQuery есть более глубокие функции, если они вам нужны)

1 голос
/ 06 февраля 2011

То, как ваши IF структурированы, логично, что вы можете ничего не создавать.В основном вы ищете, существует ли window.XMLHttpRequest ИЛИ ЕСЛИ window.ActiveXObject существует, вы создаете объект запроса.Но если ни один из этих экземпляров не существует, вы ничего не получите.

Итак, что может быть лучше проверить, потом поставить проверку, чтобы предупредить пользователя: «Эй, я не могу найти какой-либоXMLHttpRequestObject, поэтому я ничего не могу сделать отсюда. ".

Когда это может произойти?Бьет меня, но простой факт заключается в том, что, как вы изложили свою логику, это ПОТЕНЦИАЛЬНО может произойти.

0 голосов
/ 15 октября 2018

Это может помочь.Вы проверяете, существует ли XMLHttpRequest, чтобы вы могли использовать что-то более старое, которое подключается к серверу для данных.Примечание: я заметил, что JQuery AJAX работает более согласованно, если вы вызываете их много.Если вы активируете его много раз, он случайно начнет срабатывать.

        var xmlHttp = null;
        if (window.XMLHttpRequest) { //typeof XMLHttpRequest !== 'undefined'
            xmlHttp = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            var versions = [
                "MSXML2.XmlHttp.6.0",
                "MSXML2.XmlHttp.5.0",
                "MSXML2.XmlHttp.4.0",
                "MSXML2.XmlHttp.3.0",
                "MSXML2.XmlHttp.2.0",
                "Microsoft.XmlHttp"];
            var xhr;
            for (var i = 0; i < versions.length; i++) {
                try {
                    xmlHttp = new ActiveXObject(versions[i]);
                    break;
                } catch (e) {
                }
            }
        }
        if (xmlHttp != null) {
            xmlHttp.onreadystatechange = function () {
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    var data = JSON.parse(xmlHttp.responseText);
                    s_DateNow = data;
                    dt_Now = new Date(data);
                }
            }
            xmlHttp.onerror = function () {
            }
            xmlHttp.open("POST", "/Home/ServerDate/", true);
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttp.send('__RequestVerificationToken=' + sToken);
        }
        else {
            document.getElementById("spParkingTracker").innerHTML = "Browser not supported!";
        }
0 голосов
/ 06 февраля 2011

Как вы хотите догнать его, если он существует?Вы уверены, что он будет создан на 100%?Проверял все браузеры?Проверены все возможности?

0 голосов
/ 06 февраля 2011

Возможно, что оба условия неверны.

Но если вы создаете игру на основе ajax, я настоятельно рекомендую вам проверить jquery или другой js framework ...

На самом деле, я сделал то же самое несколько лет назад.Я начал создавать ajax-игру с нуля, используя сырой javascript.Потом я обнаружил jQuery ... Это действительно быстро учиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...