透過表單在iframe內向一個跨域的url提交的時候,如何判斷提交成功了呢?
這個,基本上,很難,因為瀏覽器安全沙箱的限制,我們沒有辦法通過獲得iframe內部不同域頁面的信息。換種思維,如果開始可以獲得iframe內部頁面信息,那麼不能獲得的時候,不就說明表單已經提交了麼~
百度提供給競價用戶使用的商務中心留言本就是採用此方法。
範例:
test.html:
程式碼
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head>
<body style="background:#a7a7a7;">
<iframe id="testiframe" name="testifrae"></ife>
<form method="post" action=" http://www.test.com/testaction.asp " target="testiframe" name="testform">
<input type="text" name="dddd"><input type="submit" value="ddd" name="submitbtn"/>
</form>
</body>
<script>
document.testform.onsubmit = function () {
document.testform.submitbtn.disabled = true;
submitMonitor();
}
function submitMonitor () {
try{
var hash = document.getElementById('testiframe').contentWindow.location.hash;
setTimeout(submitMonitor,100);
} catch (e) {
document.getElementById('testiframe').src = "about:blank";
document.testform.submitbtn.disabled = false;
}
}
</script>
</html>
testaction.asp
程式碼
<%
Function Sleep(n) '單位秒s
Dim StartTime
StartTime = Timer
Do : Loop Until Timer>n+StartTime
End Function
Sleep(5) '延遲5秒
Response.Write Request.Form("dddd")
%>
弊端:
這個弊端還很明顯,如果是404,403,500等錯誤,也會誤認為是成功提交,不過可以在
程式碼
setTimeout(submitMonitor,100);
函數前增加客戶端表單檢查,來盡量避免此問題。
當然,跨域表單提交狀態判斷也可以用伺服器端輸出alert腳本來實現。