標籤:png image _id dom adf timeout input src roc
關於非同步上傳檔案而且帶上參數,網上有非常多關於這種外掛程式。而我最喜歡用的外掛程式是ajaxfileupload.js。該外掛程式的代碼例如以下:
/* 131108-xxj-ajaxFileUpload.js 無重新整理上傳圖片 jquery 外掛程式。支援 ie6-ie10 依賴:jquery-1.6.1.min.js 主方法:ajaxFileUpload 接受 json 對象參數 參數說明: fileElementId:必選,上傳檔案域ID url:必選,發送請求的URL字串 fileFilter:可選,限定上傳檔案的格式(.jpg,.bmp,.gif,.png) fileSize:可選,0 為無限制(IE瀏覽器不相容) data:可選,將和檔案域一同post的參數(json對象) 其他:$.ajax 的參數均為可選參數 註:如遇到‘無法訪問’的指令碼錯誤提示則須要在響應流中加一段腳塊一同輸出:<script ...>document.domain = 'xxx.com';</script>*/jQuery.extend({ //建立 iframe 元素,接受提交及響應 createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if (window.ActiveXObject) { //fix ie9 and ie 10------------- if (jQuery.browser.version == "9.0" || jQuery.browser.version == "10.0") { var io = document.createElement('iframe'); io.id = frameId; io.name = frameId; } else if (jQuery.browser.version == "6.0" || jQuery.browser.version == "7.0" || jQuery.browser.version == "8.0") { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />'); if (typeof uri == 'boolean') { io.src = 'javascript:false'; } else if (typeof uri == 'string') { io.src = uri; } } } else { var io = document.createElement('iframe'); io.id = frameId; io.name = frameId; } io.style.position = 'absolute'; io.style.top = '-1000px'; io.style.left = '-1000px'; document.body.appendChild(io); return io; }, //建立 from 元素。用於提交的表單 createUploadForm: function(id, fileElementId, postData) { //create form<span style="white-space:pre"></span> var formId = 'jUploadForm' + id; var fileId = 'jUploadFile' + id; var form = $('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>'); var oldElement = $('#' + fileElementId); var newElement = $(oldElement).clone(); $(oldElement).attr('id', fileId); $(oldElement).before(newElement); $(oldElement).appendTo(form); //加入自己定義參數 if (postData) { //遞迴遍曆JSON全部索引值 function recurJson(json) { for (var i in json) { //alert(i+"="+json[i]) $("<input name='" + i + "' id='" + i + "' value='" + json[i] + "' />").appendTo(form); if (typeof json[i] == "object") { recurJson(json[i]); } } } recurJson(postData); } //set attributes $(form).css('position', 'absolute'); $(form).css('top', '-1200px'); $(form).css('left', '-1200px'); $(form).appendTo('body'); return form; }, //上傳檔案 //s 參數:json對象 ajaxFileUpload: function(s) { s = jQuery.extend({fileFilter:"",fileSize:0}, jQuery.ajaxSettings, s); //檔案篩選 var fielName = $('#' + s.fileElementId).val(); var extention = fielName.substring(fielName.lastIndexOf(".") + 1).toLowerCase(); if (s.fileFilter && s.fileFilter.indexOf(extention) < 0) { alert("僅支援 (" + s.fileFilter + ") 為尾碼名的檔案!"); return; } //檔案限制大小 if (s.fileSize > 0) { var fs = 0; try { if (window.ActiveXObject) { //IE瀏覽器 var image = new Image(); image.dynsrc = fielName; fs = image.fileSize; } else { fs = $('#' + s.fileElementId)[0].files[0].size; } } catch(e) { } if (fs > s.fileSize) { alert("當前檔案大小 (" + fs + ") 超過同意的限制值 (" + s.fileSize +")!"); return; } } var id = new Date().getTime(); //建立 form 表單元素 var form = jQuery.createUploadForm(id, s.fileElementId, s.data); //建立 iframe 貞元素 var io = jQuery.createUploadIframe(id, s.secureuri); var frameId = 'jUploadFrame' + id; var formId = 'jUploadForm' + id; //監測是否有新的請求 if (s.global && !jQuery.active++) { jQuery.event.trigger("ajaxStart"); //觸發 AJAX 請求開始時執行函數。
Ajax 事件。
} var requestDone = false; //建立請求對象 var xml = {}; if (s.global) jQuery.event.trigger("ajaxSend", [xml, s]); //觸發 AJAX 請求發送前事件 //上傳完畢的回呼函數 var uploadCallback = function(isTimeout) { var io = document.getElementById(frameId); try { //存在跨域指令碼訪問問題。如遇到‘無法訪問’提示則須要在響應流中加一段腳塊:<script ...>document.domain = 'xxx.com';</script> if (io.contentWindow) { //相容各個瀏覽器。可取得子表單的 window 對象 xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null; xml.responseXML = io.contentWindow.document.XMLDocument ?
io.contentWindow.document.XMLDocument : io.contentWindow.document; } else if (io.contentDocument) { //contentDocument Firefox 支援,> ie8 的ie支援。
可取得子表單的 document 對象。 xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null; xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document; } } catch(e) { jQuery.handleErrorExt(s, xml, null, e); } if (xml || isTimeout == "timeout") { requestDone = true; var status; try { status = isTimeout != "timeout" ?
"success" : "error"; // Make sure that the request was successful or notmodified if (status != "error") { //處理資料(執行XML通過httpData無論回調) var data = jQuery.uploadHttpData(xml, s.dataType); // If a local callback was specified, fire it and pass it the data if (s.success) s.success(data, status); // Fire the global callback if (s.global) jQuery.event.trigger("ajaxSuccess", [xml, s]); } else jQuery.handleErrorExt(s, xml, status); } catch(e) { status = "error"; jQuery.handleErrorExt(s, xml, status, e); } // The request was completed if (s.global) jQuery.event.trigger("ajaxComplete", [xml, s]); // Handle the global AJAX counter if (s.global && !--jQuery.active) jQuery.event.trigger("ajaxStop"); // Process result if (s.complete) s.complete(xml, status); jQuery(io).unbind(); setTimeout(function() { try { $(io).remove(); $(form).remove(); } catch(e) { jQuery.handleErrorExt(s, xml, null, e); } }, 100); xml = null; } }; //逾時檢查。s.timeout 毫秒後調用 uploadCallback 回呼函數提示請求逾時 if (s.timeout > 0) { setTimeout(function() { // Check to see if the request is still happening if (!requestDone) uploadCallback("timeout"); }, s.timeout); } try { //設定動態 form 表單的提交參數 // var io = $('#' + frameId); var form = $('#' + formId); $(form).attr('action', s.url); $(form).attr('method', 'POST'); $(form).attr('target', frameId); if (form.encoding) { form.encoding = 'multipart/form-data'; } else { form.enctype = 'multipart/form-data'; } $(form).submit(); } catch(e) { jQuery.handleErrorExt(s, xml, null, e); } //向動態表單的頁面載入事件中注冊回呼函數 if (window.attachEvent) { document.getElementById(frameId).attachEvent('onload', uploadCallback); } else { document.getElementById(frameId).addEventListener('load', uploadCallback, false); } return { abort: function() { } }; }, //上傳檔案 uploadHttpData: function(r, type) { //alert("type=" + type + ";uploadHttpData" + JSON.stringify(r)) var data = !type; data = type == "xml" || data ?
r.responseXML : r.responseText; // If the type is "script", eval it in global context if (type == "script") jQuery.globalEval(data); // Get the JavaScript object, if JSON is used. if (type == "json") eval("data = " + data); // evaluate scripts within html if (type == "html") jQuery("<div>").html(data).evalScripts(); //alert($('param', data).each(function(){alert($(this).attr('value'));})); return data; }, handleErrorExt: function(s, xhr, status, e) { // If a local callback was specified, fire it if (s.error) { s.error.call(s.context || s, xhr, status, e); } // Fire the global callback if (s.global) { (s.context ? jQuery(s.context) : jQuery.event).trigger("ajaxError", [xhr, s, e]); } }});
以上外掛程式須要jquery支援
還須要下面代碼
$.ajaxFileUpload ({ url :url, secureuri:false, fileElementId:img, dataType:'text', data:{imge:im}, success : function (data, status){ if(data!=""){ imsrc.attr('src',data); hide.val(data); } } });
url 是服務端的地址
fileElementId 是檔案域的id 為了上傳成功 檔案域的name 與id要一致
dateType 是上傳檔案的資訊發送到服務端的格式,text是文本
data 是傳送檔案能夠帶上參數,是可選的。
非同步無重新整理上傳檔案而且上傳檔案能夠帶上參數