iframe跨域POST提交
說到跨域,就不得不提起瀏覽器的同源策略。
同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。
源
如果協議,端口(如果指定了一個)和主機對于兩個頁面是相同的,那么這兩個頁面就具有相同的源。
從這個定義可以看出,如果兩個頁面的協議,端口,主機三個只要有一個不一樣,就是不同的源,想要相互之間進行交互,就需要進行跨域。
iframe跨域POST無刷新提交
跨域的方法有很多,像JSONP、iframe、CORS、postMessage等等,由于項目中用到了iframe進行POST跨域,所以本文主要總結一下如何利用iframe進行POST無刷新提交。
我們知道一般提交使用form表單進行提交,但是這種提交會導致頁面跳轉,所以交互效果不是友好,為了實現無刷新提交,我們會使用Ajax,但是此時可能會出現一個問題----跨域,那么如何解決這個問題呢,可以使用一個隱藏的iframe,我們將要提交的數據提交到這個隱藏的iframe,然后讓這個iframe去跳轉,這樣就可以在視覺上實現頁面無跳轉刷新(實際上頁面還是跳轉了,只是iframe被隱藏,我們看不到)。
在提交后我們還要獲取到后臺給我們返回回來的數據,所以需要在iframe中進行數據的交互同時拿到返回回來的data。
- 為了讓數據可以順利的進行數據交互,我們通常使用
document.domain將域設置到頂級域。 - 為了拿到返回回來的
data,需要使用一個函數,函數名后臺已經告知。
所以整個實現代碼如下:
<form action="You POST Link" method="post" target="target" id="J_commenting">
<select name="category" class="select J_filter" id="J_typeFilter">
<option value="0" selected="selected">Select Category</option>
<option value="1">Life</option>
<option value="2">People</option>
<option value="3">Landscape</option>
<option value="4">Tech</option>
<option value="5">Others</option>
</select>
<input name="title" type="text" class="misstion-title J_misstion-title">
<textarea name="desc" class="misstion-description J_description" maxlength="200"></textarea>
<button class="button J_button" type="submit">Submit</button>
</form>
<iframe name="target" style="display:none;"></iframe>
var $button = $('.J_button');
var $commenting = $('#J_commenting');
var $filter = $('.J_filter');
var $misstionTitle = $('.J_misstion-title');
var $description = $('.J_description');
$button.on('click', function () {
var filterValue = $filter.val();
var misstionTitleValue = $misstionTitle.val();
var descriptionValue = $description.val();
if (filterValue === '0' || misstionTitleValue === '' || descriptionValue === '') {
alert('Check if you filled out all the fields required');
} else {
$commenting.submit();
}
});
$commenting.on('submit', function () {
document.domain = 'aa.com';
window.addData = function (data) {
var dataCode = data.code;
var dataMsg = data.message;
if (dataCode === 0) {
alert('submit success!');
} else {
alert('submit failed!');
}
}
});
點擊提交后,后臺返回的數據:
document.domain = "aa.com";
var data = {"code":-2,"info":"please login first","message":"please login first"};
if( typeof(parent.window['addData']) == "function"){
parent.window['addData'](data);
}else if( typeof(window.top['addData']) == "function"){
window.top['addData'](data);
}
原文鏈接:iframe跨域POST提交


浙公網安備 33010602011771號