表單跨域提交

利用form表單跨域post

? ? ? 現在ajax應用這么廣泛,一般的應用都是直接通過異步調用就可以了,但是有些東西必須要使用post,而且是跨域的時候,ajax異步調用的方式就無能為力了。當然現在也有很多種辦法,比如通過flash中轉去post,可以post到任何域中,或者是通過嵌入iframe來實現,flash的方式雖然好,但是用戶還得下載個swf文件,而且as開發我也就略知皮毛,所以這里我就是要使用嵌入iframe的方式來實現。

? ? ? 我的需求是將部分內容post到server中,因為服務器是c++寫的cgi,所以沒辦法通過代理頁的方式來實現,只好在本頁面來實現。


?

在這里,我通過將需要post的內容寫入content的input中,然后點擊提交,將form的action設置為目標服務器的url,target設置為iframe的名稱,這樣就可以實現無刷新的跨域post了,但是由于瀏覽器防止重復提交的功能,所以如果直接提交到iframe的話,后面你刷新頁面的話,瀏覽器就會提示是否要重復提交,所以這里我們監聽iframe的onload事件,當iframe成功load之后,就將iframe的src指向空白頁,從而瀏覽器認為已經跳轉到新頁面了,刷新也就不會提示重復提交的彈出框了。
這里我們還可以在iframe?load成功的時候,通過contenWindow屬性來獲取服務器的響應,從而可以判斷post是否成功。因為這里要先判斷post是否成功,所以在取得了服務器返回的數據之后再設置iframe的src為空白頁面,并且將iframe的onload事件取消,否則iframe每次src設置為about:blank都會觸發onload事件。

?

這里看到有人說ie6中會有iframe的onload事件調用時頁面仍未載入完成,或是不觸發onload事件,則需要通過監聽iframe的readyState來實現得到服務器響應完成的功能。我貌似還沒碰到,等碰到了的話再來解決。最近做的東西還要改as代碼,恩,可以學學as了

?

<html>
<head>
<title>ddd</title>
</head>
<body>
<script type="text/javascript">
function check()
{var btn = document.getElementById("test_submit");var frm = document.forms["test_form"];var ifm = document.getElementById("test_iframe");frm.action = "http://xxx.xxx.xxx/post.php";frm.target = "test_iframe";frm.submit();btn.disabled = "disabled";ifm.onload = function(){btn.disabled = "";var str = ifm.contentWindow;alert(str.document.body.innerHTML);ifm.src = "about:blank"; ifm.onload = null; }     return false; }</script>
<form id="test_form" name="test_form" ><input type="hidden" name="content" value="xxx" /><input type="submit" name="test_submit" id="test_submit" />
</form>
<iframe id="test_iframe" name="test_iframe" width="1" height="1" style="display:none"></iframe>
</body>
</html>

?

好吧,果然在ie下iframe不會觸發onload事件,于是改為了?Nicholas C.Zakas提供的方法,通過attachEvent來添加onload事件。

    ifm.onload = function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.onload = null; }//改為if(ifm.attachEvent){ifm.attachEvent("onload", function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.detachEvent("onload", arguments.callee); }}else{ifm.onload = function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.onload = null; }}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276731.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Asp.net(C#)-顯示所有緩存 清除所有緩存

//清除所有緩存protectedvoidRemoveAllCache() { System.Web.Caching.Cache _cache HttpRuntime.Cache; IDictionaryEnumerator CacheEnum _cache.GetEnumerator(); ArrayList al new ArrayList(); while (CacheEnum.MoveNext()) { …

mysql數據庫三大引擎優缺點

1.MyISAM 特性&#xff1a; ①不支持事務。 ②表級鎖定&#xff0c;并發性能大大降低。 ③讀寫互相阻塞。 適用場景&#xff1a; ①不支持事務。 ②并發相對較低&#xff0c;表鎖定。 ③執行大量select語句操作的表。 ④count(*)操作較快。 ⑤不支持外鍵。 注&#xff1a;查詢速…

Python--day60--一個簡單(不完整)的web框架

轉載于:https://www.cnblogs.com/xudj/p/10091775.html

activemq 發兩條只收到一條_淺談ActiveMQ與使用

更多大數據架構、實戰經驗&#xff0c;歡迎關注【大數據每日嗶嗶】&#xff0c;期待與你一起成長&#xff01;本文將介紹一下 ActiveMQ 的安裝、原理和簡單實戰。一、什么是消息中間件消息中間件顧名思義實現的就是在兩個系統或兩個客戶端之間進行消息傳送二、什么是ActiveMQAc…

php發送get、post請求的幾種方法

方法1: 用file_get_contents 以get方式獲取內容 <?php $urlhttp://www.domain.com/; $html file_get_contents($url); echo $html; ?>方法2: 用fopen打開url, 以get方式獲取內容<?php $fp fopen($url, r); stream_get_meta_data($fp); while(!feof($fp)) { $res…

ZZ:深入理解new

new的過程當我們使用關鍵字new在堆上動態創建一個對象時&#xff0c;它實際上做了三件事&#xff1a;獲得一塊內存空間、調用構造函數、返回正確的指針。當然&#xff0c;如果我們創建的是簡單類型的變量&#xff0c;那么第二步會被省略。假如我們定義了如下一個類A&#xff1a…

mysql數據庫的優缺點

優點1. 通常存儲過程 標題有助于提高應用程序的性能。因為當你創建他的時候就已經編譯了&#xff0c;只不過是按需編譯的。2.存儲過程有助于減少應用程序和數據庫服務器之間的流量&#xff0c;因為應用程序不必發送多個冗長的SQL語句&#xff0c;而只能發送存儲過程的名稱和參數…

大數據小白系列——HDFS(1)

【注1&#xff1a;結尾有大福利&#xff01;】 【注2&#xff1a;想寫一個大數據小白系列&#xff0c;介紹大數據生態系統中的主要成員&#xff0c;理解其原理&#xff0c;明白其用途&#xff0c;萬一有用呢&#xff0c;對不對。】 大數據是什么&#xff1f;拋開那些高大上但籠…

PHP檢測遠端文件是否存在

簡單解釋一下上面的代碼。get_headers的作用就是訪問一個遠程地址&#xff0c;把服務器發送的HTTP頭以數組形式返回。而$header[0]則是服務器返回的狀態碼&#xff08;如果不出意外的話狀態碼應該都是第一個返回的&#xff09;。 要確定一個文件在遠端服務器上存在&#xff0c…

C#中使用DTS來導入數據及相關問題

向Sql 中導入Excel數據時&#xff0c;使用MS SQL的DTS功能 可以很方便的導入&#xff0c;同時引用Dll文件&#xff0c;可以在程序中對導入過程進行控制。 創建DTS包的過程如下&#xff1a; &#xff11;。在&#xff33;&#xff31;&#xff2c;企業管理器中&#xff0c;工具菜…

html select選擇事件_一道搜狗面試題:IO多路復用中select、poll、epoll之間的區別...

(1)select>時間復雜度O(n)它僅僅知道了&#xff0c;有I/O事件發生了&#xff0c;卻并不知道是哪那幾個流(可能有一個&#xff0c;多個&#xff0c;甚至全部)&#xff0c;我們只能無差別輪詢所有流&#xff0c;找出能讀出數據&#xff0c;或者寫入數據的流&#xff0c;對他們…

【MySQL】redo log --- 刷入磁盤過程

1、redo log基本概念 redo log的相關概念這里就不再過多闡述&#xff0c;網上有非常多的好的資料&#xff0c;可以看下縹緲大神的文章&#xff1a;https://www.cnblogs.com/cuisi/p/6525077.html&#xff0c;個人感覺介紹的非常詳細。 2、數據更改過程簡述 MySQL 在更新數據的時…

WPF DataGrid根據內容設置行顏色

轉&#xff1a; https://code.4noobz.net/wpf-change-color-of-a-row-in-a-datagrid-depending-on-the-value/ 轉載于:https://www.cnblogs.com/Mindy-hym/p/11475024.html

QQ web api

QQ的很多功能和信息可以通過web方式獲得&#xff5e;以下鏈接&#xff0c;星號應換成你要查詢的QQ號一、Activities Previewhttp://labs.qq.com/ie8/preview/?uin******二、QQ空間訪問次數查詢&#xff08;需權限&#xff09;http://g.qzone.qq.com/fcg-bin/cgi_emotion_list.…

delphi tclientsocket接收不到返回數據_RS—485中教你主站發送報文結構、從站返回報文結構?系列11...

作者&#xff1a;馬樂1.主站發送報文結構大家可以看到我之前寫的文章中的程序都是沒有什么具體功能的&#xff0c;都是兩個站點之間互相傳遞數據&#xff0c;這些數據我們只是看看是否可以正常接收發送&#xff0c;數據本身是沒有任何含義的。很明顯在實際使用過程中我們是不會…

MybatisPlus 通用枚舉無法正確取值

正常使用mybatisplus <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.4</version></dependency> 使用后發現項目中原先對枚舉值的轉換存在異常&#xff1a; ER…

零基礎學習 Python 之條件語句

寫在之前 我們寫程序&#xff0c;就好比學生時代寫作文一樣&#xff0c;由 “字” 到 “詞” 到 “句” 最后到 “文章” 。此前我們學會了一些詞語&#xff08;對象類型&#xff09;&#xff0c;我們接下來就是學如何造句&#xff0c;而在編程語言里&#xff0c;句子被叫做語句…

python input 文件名_Python播放音頻與錄音

這一講主要介紹些音頻基本處理方式&#xff0c;為接下來的語音識別打基礎。三種播放音頻的方式使用 python 播放音頻有以下幾種方式&#xff1a;os.system()os.system(file) 調用系統應用來打開文件&#xff0c;file 可為圖片或者音頻文件。缺點&#xff1a;要打開具體的應用&a…

jQuery選擇器和方法的等價關系

層級選擇器 1、ancestor descendant &#xff08;后代選擇器&#xff09; 在給定的祖先元素下匹配所有的后代元素 $(“form input”) $(.div span)選取<div>里的所有的<span>元素 2、parent child &#xff08;子選擇器&#xff09;在給定的父元素下匹配所有…

ActionScript 3.0 Step By Step系列(四):來自面向對象開發之前的吶喊:“學會寫可重用的代碼”...

增強代碼的可重用能力&#xff0c;從創建可重用的代碼開始&#xff0c;可重用的代碼則是通過從現有代碼中重構加以封裝,使其成為功能單一的可復用代碼塊。這句話籠統點說便是“封裝”或“抽象”。 在實際的編程開發中&#xff0c;要實現代碼重用&#xff0c;而不是每次都去Copy…