-
jQuery:ajaxfileupload.js多文件上传-传值-跨域
网络 2014/10/31 17:27:34在使用jQuery的ajaxfileupload.js插件来处理ajax上传图片功能,但内置的功能有3个问题
不能同时上传多个文件
不能传递参数
主域下的跨域提交问题
以及一个jQuery版本问题handleError
下面说下对于个个问题的处理方式,并在最后放上完整的代码,可以直接复制
同时上传多个文件
12345var
oldElement = jQuery(
'#'
+ fileElementId);
var
newElement = jQuery(oldElement).clone();
jQuery(oldElement).attr(
'id'
, fileId);
jQuery(oldElement).before(newElement);
jQuery(oldElement).appendTo(form);
修改为:
12345678910if
(
typeof
(fileElementId) ==
'string'
){
fileElementId = [fileElementId];
}
for
(
var
i
in
fileElementId){
var
oldElement = jQuery(
'#'
+ fileElementId[i]);
var
newElement = jQuery(oldElement).clone();
jQuery(oldElement).attr(
'id'
, fileId);
jQuery(oldElement).before(newElement);
jQuery(oldElement).appendTo(form);
}
使用:
1234$.ajaxFileUpload({
url:
'/ajax.php'
,
fileElementId:[
'img1'
,
'img2'
]
//原先是fileElementId:’img1’,通过传递数组实现多文件上传
});
传递多个参数
var form = jQuery.createUploadForm(id, s.fileElementId);
修改为:
var form = jQuery.createUploadForm(id, s.fileElementId, (typeof(s.data)=='undefined'?false:s.data));
createUploadForm: function(id, fileElementId)
修改为:
createUploadForm: function(id, fileElementId, data)
并在//single前添加
12345if
(data) {
for
(
var
i
in
data) {
jQuery(
'<input type="hidden" name="'
+ i +
'" value="'
+ data[i] +
'" />'
).appendTo(form);
}
}
使用:
12345$.ajaxFileUpload({
url:
'/ajax.php'
,
fileElementId:[
'img1'
,
'img2'
],
data:{ }
//传递对象结构{name:name1}
});
跨域
这个不是插件本身的问题,我的解决方法也只适用于同一主域名
在url的请求返回中添加<script>document.domain = "xxxx.com";</script>
因为请求是通过读取返回页面的文档内容,在这时候实际返回页面是会执行js脚本的,并且该脚本不会进入后续的文档加载中
所以只需将修改文档域与当前页面一致就行
在调用页面添加:document.domain = "xxxx.com";
不修改插件本身
handleError
jquery在1.4以后不支持handleError所以需要自行添加
1234567891011,
handleError:
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] );
}
}
完整的代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183jQuery.extend({
createUploadIframe:
function
(id, uri){
//create frame
var
frameId =
'jUploadFrame'
+ id;
var
iframeHtml =
'<iframe id="'
+ frameId +
'" name="'
+ frameId +
'" style="position:absolute; top:-9999px; left:-9999px"'
;
if
(window.ActiveXObject){
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;
}
}
}
iframeHtml +=
' />'
;
jQuery(iframeHtml).appendTo(document.body);
return
jQuery(
'#'
+ frameId).get(0);
},
createUploadForm:
function
(id, fileElementId, data){
//create form
var
formId =
'jUploadForm'
+ id;
var
fileId =
'jUploadFile'
+ id;
var
form = jQuery(
'<form action="" method="POST" name="'
+ formId +
'" id="'
+ formId +
'" enctype="multipart/form-data"></form>'
);
if
(data){
for
(
var
i
in
data){
jQuery(
'<input type="hidden" name="'
+ i +
'" value="'
+ data[i] +
'" />'
).appendTo(form);
}
}
//single
if
(
typeof
(fileElementId) ==
'string'
){
fileElementId = [fileElementId];
}
for
(
var
i
in
fileElementId){
var
oldElement = jQuery(
'#'
+ fileElementId[i]);
var
newElement = jQuery(oldElement).clone();
jQuery(oldElement).attr(
'id'
, fileId);
jQuery(oldElement).before(newElement);
jQuery(oldElement).appendTo(form);
}
//set attributes
jQuery(form).css(
'position'
,
'absolute'
);
jQuery(form).css(
'top'
,
'-1200px'
);
jQuery(form).css(
'left'
,
'-1200px'
);
jQuery(form).appendTo(
'body'
);
return
form;
},
ajaxFileUpload:
function
(s) {
// TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
s = jQuery.extend({}, jQuery.ajaxSettings, s);
var
id =
new
Date().getTime()
var
form = jQuery.createUploadForm(id, s.fileElementId, (
typeof
(s.data)==
'undefined'
?
false
:s.data));
var
io = jQuery.createUploadIframe(id, s.secureuri);
var
frameId =
'jUploadFrame'
+ id;
var
formId =
'jUploadForm'
+ id;
// Watch for a new set of requests
if
( s.global && ! jQuery.active++ ){
jQuery.event.trigger(
"ajaxStart"
);
}
var
requestDone =
false
;
// Create the request object
var
xml = {};
if
( s.global )
jQuery.event.trigger(
"ajaxSend"
, [xml, s]);
// Wait for a response to come back
var
uploadCallback =
function
(isTimeout){
var
io = document.getElementById(frameId);
var
execontent =
function
(){
try
{
if
(io.contentWindow)
{
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)
{
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.handleError(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"
)
{
// process the data (runs the xml through httpData regardless of callback)
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.handleError(s, xml, status);
}
catch
(e)
{
status =
"error"
;
jQuery.handleError(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
{
jQuery(io).remove();
jQuery(form).remove();
}
catch
(e){
jQuery.handleError(s, xml,
null
, e);
}
}, 100);
xml =
null
;
}
};
execontent();
}
// Timeout checker
if
( s.timeout > 0 ){
setTimeout(
function
(){
// Check to see if the request is still happening
if
( !requestDone ) uploadCallback(
"timeout"
);
}, s.timeout);
}
try
{
var
form = jQuery(
'#'
+ formId);
jQuery(form).attr(
'action'
, s.url);
jQuery(form).attr(
'method'
,
'POST'
);
jQuery(form).attr(
'target'
, frameId);
if
(form.encoding)
{
jQuery(form).attr(
'encoding'
,
'multipart/form-data'
);
}
else
{
jQuery(form).attr(
'enctype'
,
'multipart/form-data'
);
}
jQuery(form).submit();
}
catch
(e){
jQuery.handleError(s, xml,
null
, e);
}
jQuery(
'#'
+ frameId).load(uploadCallback );
return
{abort:
function
() {}};
},
uploadHttpData:
function
( r, type ) {
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();
return
data;
},
handleError:
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] );
}
}
})
阅读(1932) 分享(0)
上一篇: jQuery插件之ajaxFileUpload实现跨域无刷新上传
下一篇: PHP安全相关的函数