5

我有一个小的 JS 函数,它为我执行 Ajax,另一个类似的函数将 POST 数据添加到请求中。Ajax 是一个如此大的话题,有很多关于它的库,我的函数中缺少什么,它是不安全的还是其他令人担忧的东西?

function loadPage(pagePath, displayElement)
{
    var xmlHttp;

    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            try
            {
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e)
            {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }

    xmlHttp.onreadystatechange=function()
    {
        if(xmlHttp.readyState==4)
        {
            document.getElementById(displayElement).innerHTML = xmlHttp.responseText;
        }
    }

    xmlHttp.open("GET", pagePath, true);
    xmlHttp.send(null);
}
4

6 回答 6

13

我强烈建议您不要编写自己的 Ajax 代码。相反,请使用 Prototype、Dojo 或任何其他框架。他们已经处理好所有你没有处理的 ReadyStates(2 表示它已发送,3 表示它正在处理中,等等),他们应该逃避你得到的响应,这样你就不会插入潜在的不安全状态javascript或其他东西进入您的页面。

更健壮的框架将为您提供的另一件事是能够做更多的事情,而不仅仅是使用 innerHTML 来替换 DOM 中的项目。您在此处的函数只能用于将一个元素替换为来自 ajax 调用的响应。您可以使用 Ajax 做更多的事情。

于 2008-08-29T16:03:11.933 回答
6

我会删除这条线。

alert("Your browser does not support AJAX!")

用他可能听不懂的语言对用户大喊比失败更糟糕。:-)

于 2008-08-29T16:03:13.870 回答
3

我从来都不喜欢嵌套的 try/catch 块,所以我会这样做:

var xmlHttp;
if (window.XMLHttpRequest) {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
} else if (window.ActiveXObject) {
  try {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
}

if (xmlHttp) {
  // No errors, do whatever you need.
}

我认为这会奏效。但正如之前提到的 - 为什么要重新发明轮子,使用库。更好的是 - 了解他们是如何做到的。

于 2008-08-29T16:51:04.050 回答
1

jQuery 可能是最轻量级的流行库之一。

于 2008-08-29T16:22:27.927 回答
1

原型中的相同内容:

function loadPage(pagePath, displayElement) {
    new Ajax.Updater(displayElement, pagePath);
}

原型 API 中的 Ajax.Updater

于 2008-09-02T12:31:25.950 回答
0

如果你真的想看看你缺少什么,请阅读他们的 ajax 例程的 jQuery 或 Prototype 源代码。如果评论中有错误编号,请同时查找。

于 2011-07-20T11:22:25.657 回答