2017-02-14 101 views
0

我有一些javascript发送一个XMLHttpRequest到PHP文件。这个PHP文件发送一个响应,javascript应该创建一个URL并重定向到它,使用响应文本作为参数。在所有其他浏览器中,它可以正常工作,但Firefox不会在URL中包含响应文本。的XMLHttpRequest发送URL作为响应文本,Firefox不重定向

这是JavaScript的例子:

var xhr = new XMLHttpRequest(); 
xhr.open('POST', 'filename.php', true); 
xhr.onreadystatechange = function(e){ 
    var id = e.currentTarget.responseText; 
    var urlWithId = "restofurl?id=" + id; 
    window.location.href = urlWithId; 
} 
xhr.send(fd); 

和filename.php只是一个数字的时刻:

<?php 
    echo "3"; 
?> 

我试图把该URL的其他部分(最多全url)在PHP部分,并且Firefox总是切出那部分。我也试了几次复制应对不同的变量,由角色复制它的性格,把它在刚刚再次返回输入,功能...

这只会是我自己的电脑上,所以我不需要担心任何安全问题,所以我主要是在寻找一种简单的方式来绕过这个问题,而不是专业的方式。有人有什么主意吗?

+1

Onreadystatechange并不一定表示它在触发它时完成了吗? – apokryfos

+0

是否有任何错误或消息弹出在Firefox的开发工具控制台? – k0pernikus

+1

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange似乎表明获得响应文本的另一种方式。 – apokryfos

回答

-1

这是一个基本的例子,你确实有测试readyState状态。如果我记得不错,在发送请求之前设置事件函数也是比较安全的(不太确定)。

xhr = new XMLHttpRequest(); 

xhr.onreadystatechange = function() { 
    if (this.readyState == 4) { 
     //do something with this.responseText 
    } 
}; 
xhr.open("POST", url, true); 
xhr.send(); 

编辑: 这就是为什么我使用的框架,对旧浏览器支持的原因之一,但这不是一个答案。更准确地说,在过去(现在),浏览器用来实现奇特的功能。很长一段时间我没有直接使用XHR对象,上次使用加载栏(canvas)进行文件上传。它向你展示了处理一些东西的基本方法。这是更长,有点老式,但是,它的工作原理。

function customXHR(){ 
    if(window.XMLHttpRequest){ 
     return new window.XMLHttpRequest; 
    }else{ 
     try{ //the weird ones 
      return new ActiveXObject("MSXML2.XMLHTTP.3.0"); 
     } 
     catch(ex){ 
      return null; 
     } 
    } 
} 

var xhr = customXHR(), pleaseStop = false, startDraw = false; 

if(xhr){ 
    xhr.addEventListener('load', function(e){ 
     var jsonRep; 
     if(!pleaseStop){ 
      //did use a JSON response 
      jsonRep = $.parseJSON(e.target.responseText); 
      //do the rest, we finished 
     } 
    }, false); 
    xhr.addEventListener('error', function(e){ 
     //error 
     pleaseStop = true; 
    }, false); 
    xhr.upload.addEventListener('progress', function(e){ 
     //why not let this as an example! 
     //file_size must be retreive separately, i fear 
     if(e.lengthComputable && file_size > 0 && !pleaseStop && startDraw){ draw_progress(e.loaded/file_size); } 
    }, false); 
    xhr.addEventListener('loadstart', function(e){ 
     //can be used too 
    }, false); 
    xhr.addEventListener('readystatechange', function(e){ 
     if(e.target.status == 404 && !pleaseStop){ 
      //error not found 
      pleaseStop = true; 
     } 
     if(e.target.readyState == 2 && e.target.status == 200){ 
      startDraw = true; 
     } 
     /*if(e.target.readyState == 4){ 
      //not used here, actually not exactly the same as 'load' 
     }*/ 
    }, false); 

    xhr.open("POST", url, true); 
    xhr.send(); 
} //else no XHR support 
+0

Aaaaah谢谢!这很有意义,因为readyState会多次更改,并且只有最后一次有实际响应。这也解释了为什么它总是会打印正确的URL,如果我只是让它出现在同一页面上的某个地方而没有重定向... 现在知道其他浏览器为什么不这样做会很有趣。 – LillaAnka

+0

这只是一个基本的例子,它没有最广泛的支持(如果你想复古兼容)。对于浏览器的使用,它总是依赖于浏览器本身的JavaScript实现,甚至可能不是标准的。请注意,此示例不处理错误状态,如果我有时间,我将编辑该示例 – Kaddath

+0

添加了一个示例代码,显示如何使用状态,readyState和事件来处理具有更宽(更长)浏览器支持的响应 – Kaddath