2017-02-14 49 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