处理服务器响应AJAX

时间:2014-11-13 03:39:43

标签: javascript jquery ajax

在处理一个简单的项目(或者至少我认为很简单)的过程中,用户点击一个按钮,并在上面的文本框中显示从php生成的随机说法。我没有访问php文件,所以我看不到代码,感觉有点迷失。我遇到的问题是我处理来自服务器的响应(handleServerResponse函数)的错误。任何建议将不胜感激。

在尝试调试时,我看到了这样的消息:(我已经更改了网址)

  

XMLHttpRequest无法加载http:somephp.php。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。因此,不允许原点'null'访问。

到目前为止的代码:

var xmlHttp = createXmlHttpRequestObject();

function createXmlHttpRequestObject(){
var xmlHttp;

if(window.ActiveXObject){
    try{
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e){
       xmlHttp = false;
       }
    }else{
    try{
       xmlHttp = new XMLHttpRequest();
    }catch(e){
       xmlHttp = false;
    }
  }

if(!xmlHttp)
    alert("Error 1");
  else
    return xmlHttp;
}


$("#BtnReset").click(function () {
    $("#TBSaying").val("");
})

$("#BtnGetSaying").click(function () {
    process();
})


function process(){
    if(xmlHttp.readyState==0 || xmlHttp.readyState==4){
    xmlHttp.open("GET", "http://somephp.php", true);
    xmlHttp.onreadystatechange = handleServerResponse;
    xmlHttp.send(null);
    }else{
       setTimeout('process()', 1000);
    }
}

function handleServerResponse(){
    if(xmlHttp.readyState==4){
       if(xmlHttp.status==200){
        xmlResponse = xmlHttp.responseXML;
        xmlDocumentElement = xmlResponse.documentElement;
        message = xmlDocumentElement.firstChild.data
        $("#TBSaying").val(message);
       }else{
         alert('error 2');
         }
    }
}

阅读JQuery文档并重新开始,将其上传到php所在的同一台服务器并运行。这是最终的代码:感谢所有建议!

$("#BtnReset").click(function () {
    $("#TBSaying").val("");
})

$("#BtnGetSaying").click(function () {
    process();
})


function process(){
            // AJAX Code To Submit Form.
            $.get("http://somephp.php",function(data){
             $("#TBSaying").val(data);
  });
 }

2 个答案:

答案 0 :(得分:1)

来自浏览器的Ajax调用受到所谓的“相同原始限制”的限制。基本上这意味着,默认情况下,您只能将Ajax调用回到网页来自的同一服务器。这意味着您无法对另一个域,端口或协议上的服务器进行常规Ajax调用。

您可以阅读相同的原始政策here

这种限制有三种方法,但都需要服务器的合作。

  1. CORS。您发出请求的服务器将标头放入其响应中,告诉浏览器是否允许跨源请求,甚至是允许来自哪些域。这为浏览器提供了完成非同一来源的Ajax调用的权限。

  2. JSONP。您可以阅读有关JSONP here的更多信息。基本上,您从目标服务器请求脚本,并且脚本的编码方式使其能够为您提供所需的答案(通常采用JSON数据格式)。

  3. 服务器代理。您可以找到或编码将从其他服务器请求数据的服务器代理。由于服务器到服务器的通信不受相同原始限制的限制,因此您有时可以找到另一个允许对其进行跨源请求的服务器,然后该服务器将为您获取数据,然后将其返回给您。

答案 1 :(得分:0)

你的javascript似乎很糟糕,但唉,错了    "访问控制允许来源"是一个服务器端(php?)错误,抱歉。

告诉服务器人员添加类似

的内容
header("Access-Control-Allow-Origin: *"); 

看看你的javascript是否正确^^

在旁注,

  1. 提醒("错误1");应该使用console.log或者抛出新的Error()而不是..
  2. 为什么将xmlHttp作为全局,可以只使用进程(e){var xhr = e.target; ...}而不是
  3. 不要这样做setTimeout(' process()',1000); ,执行setTimeout(process,1000);