除了此功能,Ajax还需要什么?

时间:2020-03-05 18:44:59  来源:igfitidea点击:

我有一个小的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);
}

解决方案

回答

我强烈建议我们不要滚动自己的Ajax代码。而是使用Prototype,Dojo或者其他任何框架。他们已经处理了所有我们未处理的ReadyState(2表示已发送,3表示正在处理,等等),并且应该避免收到响应,因此我们不会插入可能不安全的信息javascript或者其他内容。

更健壮的框架将为我们提供的另一件事是,我们不仅可以使用innerHTML替换DOM中的项目,还可以做更多的事情。函数只能用ajax调用的响应替换一个元素。我们可以使用Ajax做更多的事情。

回答

我将删除此行。

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

用用户可能不理解的语言向用户大喊大叫比失败还糟。 :-)

回答

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

回答

我从来都不喜欢嵌套的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.
}

我认为那行得通。但是正如前面提到的,为什么要重新发明轮子,请使用库。甚至更好地了解他们是如何做到的。

回答

原型中的相同之处:

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

原型API中的Ajax.Updater