非同步跨域提交form表單 分兩步提交頁面用戶輸入的數據:第一步,利用form上傳文件和一部分數據,第二步,上傳文件成功得到文件id,再一次連同文件id和頁面其他信息一同提交後臺(也就是先上傳一個文件,然後再利用文件id綁定到具體的“用戶”上)。 首先form應該這樣寫 <form method="" ...
分兩步提交頁面用戶輸入的數據:第一步,利用form上傳文件和一部分數據,第二步,上傳文件成功得到文件id,再一次連同文件id和頁面其他信息一同提交後臺(也就是先上傳一個文件,然後再利用文件id綁定到具體的“用戶”上)。
首先form應該這樣寫
<form method="" action="" enctype="multipart/form-data" target="iframeName"></form>
再創建一個隱藏的iframe在此就叫iframe1吧
以上form中的屬性都必須有,其中enctype是form上傳文件是的格式,target的值就是隱藏iframe的name屬性的值。直接submit就可以提交form表單,此時後臺返回的數據會在這個隱藏的iframe1中,此時問題來了,文件上傳成功後後臺返回的文件id是在iframe1中的 ,然而iframe1和主頁面是不同域下的所以就牽扯到了跨域問題。
解決跨域問題的辦法就是在首先寫好一個中間頁面tem.html,此中間頁面就是完成文件和具體“用戶”綁定操作(提交相關數據給後臺)。將這個中間頁面放在和iframe1同一個域下。
tem.html中主要是 var body = parent.window.patchIframe.document.body; 來獲得iframe1中的內容,具體寫法視情況而定,此時就可以在tem.html中得到文件的id。
用js動態生成一個隱藏的iframe2,併在iframe2中載入這個中間頁面tem.html,請求tem.html時將需要和文件id綁定的“用戶數據拼到url中”。這一步主要就是訪問tem.html讓他運行讀取,此時tem.html中就可以得到具體“用戶”的數據,也能得到文件id,然後直接發給指定的介面。執行的此其實非同步提交form已經成功了,但是主頁面是沒有反應的,用戶體驗不好。
最有一步就是iframe2和主頁面之間的通信,告訴主頁面操作成功。使用到的辦法就是postMessage方法,詳見http://www.cnblogs.com/dolphinX/p/3464056.html
主頁面得到數據就可以做用戶友好的反饋。