我是否必须继续检查XMLHttpRequest对象是否存在?

时间:2011-02-06 02:58:28

标签: javascript ajax xmlhttprequest

我曾经是程序员,但现在定期执行“脚本编写”。我正在尝试创建一个基于Ajax的游戏。

我有一个带有以下javascript的.php文件:

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 个答案:

答案 0 :(得分:1)

您的IF的结构方式,逻辑上有一些潜力可供您不创建任何内容。基本上你正在寻找window.XMLHttpRequest是否存在或者是IF window.ActiveXObject存在,你创建你的请求对象。但如果这些实例都不存在,那么你什么也得不到。

所以,或许更好的检查是事后检查以提醒用户“嘿,我似乎找不到任何类型的XMLHttpRequestObject,所以我从这里做不了多少。”。< / p>

什么时候会发生这种情况?打败我,但简单的事实是你的逻辑布局方式,它可能会发生。

答案 1 :(得分:1)

刚开始就在这里:使用jQuery它会将糟糕的跨浏览器兼容性抽象为糟糕的东西。

第一个代码块用于特征检测,因为IE处理XMLHttpRequest与其他浏览器不同,您需要找出要使用的对象。

检查是否存在兼容性代码(if (window.XMLHttpRequest) {...内容)错过案例的可能性,否则您将收到令人讨厌的错误。

我会重复自己,因为这非常重要,请使用jQuery。它是那里最强大的JavaScript库。例如,您要执行的请求是

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

它可以透明地处理所有跨浏览器的内容并且正常工作。 (如果你需要它们,jQuery上还有更多深入的功能)

答案 2 :(得分:0)

这两种情况都可能是错误的。

但是如果你正在创建一个基于ajax的游戏,我真的鼓励你查看jquery或其他js框架......

实际上,几年前我做的完全一样。我开始使用原始javascript从头开始构建一个ajax游戏。然后我发现了jQuery ......它的学习速度非常快。

答案 3 :(得分:0)

如果存在,您希望如何追赶它?你确定它会100%创建吗?检查所有浏览器?检查所有可能性?

答案 4 :(得分:0)

这可能会有所帮助。您检查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!";
        }