2014-03-25 34 views
0

我創建了一個系統,其中一個Javascript腳本提取數據從一個鼠尾草提取物,並將其存儲在一個Javascript對象(我想)。然後我需要通過PHP將數據上傳到SQL數據庫。Javascript動態與PHP通信

我曾想過使用Iframe,通過將src更改爲PHP頁面URL,然後通過url將GET變量傳遞給頁面。我想知道我是否也可以使用標籤來做到這一點?通過創建新圖像並將src設置爲PHP頁面URL(再次,將GET變量傳遞給它),那麼PHP頁面可以完成剩下的工作?我知道圖像不會顯示任何東西,它不需要。我只需要一種將數據傳遞到PHP頁面的方法。

最佳做法?

+0

1.您可以使用「」和_GET URI_將數據傳遞給服務器嗎?是的,但是讓服務器回話可能需要編碼/解碼像素的很多努力。 2.最佳實踐? [_XMLHttpRequest_](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest)。您可能需要考慮_Origin_。 –

+0

我不需要從PHP頁面獲取任何數據。我不能等待圖像「加載」嗎?這將保證PHP腳本處理數據,因爲它是服務器端? –

+0

您應該查找_error_以及_load_。我仍然認爲_XMLHttpRequest_是更好的選擇,現在就寫一個答案.. –

回答

2

現代的使用方式JavaScript與服務器通信是XMLHttpRequest。默認情況下,它是異步的,並且可以讓您選擇更改此選項,儘管同步請求可能被認爲是不正確的做法。

這是一個基本的例子

function sendObject(object, uri, callback) { 
    var xhr = new XMLHttpRequest(), 
     data = new FormData(); 
    data.append('object', JSON.stringify(object)); 
    if (callback) xhr.addEventListener('load', callback); 
    xhr.open('POST', uri); 
    xhr.send(data); 
} 
// ex. usage 
sendObject(
    {foo: "bar"}, 
    "/somepage.php", 
    function() {console.log('completed with code:', this.status)} 
); 

使用FormData節省您的時間了。如果你不能指望它是可用的,根本就

postData = encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&' + etc; 
+0

我忘了提及,我把它寫成了_POST_,因爲_GET_不適合發送_JSON_,它更多的是標記/原始數據。 –

+0

這是一個很好的答案,但如果我們完全誠實的話,AJAX是我真正說jQuery使用jQuery的少數幾個地方之一。它使AJAX變得更加簡單和強大。 –

0

至於其他兩個答案都表示,對於JavaScript的HTML頁面與服務器進行通信,一個PHP頁面,您將需要使用XMLHttpRequest ,又名AJAX。 Paul S.的答案是關於如何直接在Javascript中使用XMLHttpRequest的最佳答案。

但是,有一點要記住的是,如果您必須支持舊版本的瀏覽器,尤其是Internet Explorer 9或更低版本,那麼您會遇到一些怪癖,建議爲此使用一個庫。對於通用庫,不僅包括AJAX方法,還包括在請求之前,期間和之後形成數據處理和操作DOM,最好的辦法是使用jQuery。例如,對於一個AJAX請求從表單發送數據:

$.ajax({ 
    url: 'http://www.example.com/data.php', 
    data: $(form).serialize(), 
    dataType: 'JSON', // JSON will be returned if possible 
    type: 'POST' 
}).then(function(data) { 
    ... 
}); 

jQuery是偉大的,但它也是一個很大的圖書館,如果你只有真正想要或需要的AJAX請求,最好是找到一個小圖書館或use a function that's known to work cross browser。同樣重要的是要注意,jQuery對promise的處理很奇怪,這是函數會說它會返回一個值但不是馬上的方式。如果您將AJAX函數鏈接在一起而不使您的代碼包含許多嵌套函數,則這些承諾是必需的。兩個最知名的承諾庫是rsvp.jsq