Skip to content

Commit

Permalink
validate option, can return status in regular response body if using …
Browse files Browse the repository at this point in the history
…json
  • Loading branch information
DubFriend committed Feb 26, 2014
1 parent 1a0782f commit e940e96
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 135 deletions.
Empty file modified .gitignore
100644 → 100755
Empty file.
Empty file modified LICENSE.md
100644 → 100755
Empty file.
10 changes: 9 additions & 1 deletion README.md
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ $('#file-ajax-form').fileAjax({
// optional: url defaults to the form's action attribute
url: 'respond.php',

// optional: if validate is present and returns false then the submission
// will be cancelled.
validate: function () {
return isValid() ? true : false;
}

// optional: getData populates the request with the returned data, along
// with the targeted forms file inputs. Defaults to the targeted form's
// named input values (sends the forms data in the same format it would be
Expand Down Expand Up @@ -43,11 +49,13 @@ $('#file-ajax-form').fileAjax({
// the error callback instead. (Note that for some browsers that use the
// iframe fallback, a response with an actual http response code that is of
// type error will not be processed at all)
// You may optionally provide the status in the reponse instead of metaData
// if using dataType "json".
success: function (response, metaData) {
console.log('success', response, metaData);
},

// optional: called if metaData.status not absent, and metaData.status is
// optional: called if status not absent, and status is
// between 200 and 299.
error: function (response, metaData) {
console.log('error', response, metaData);
Expand Down
4 changes: 4 additions & 0 deletions index.html
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@
// },

dataType: 'json',

validate: function () {
return true;
},
onprogress: function (e) {
if(e.lengthComputable) {
$('.percent-complete').html(e.loaded / e.total);
Expand Down
Empty file modified jquery-1.11.0.js
100644 → 100755
Empty file.
278 changes: 146 additions & 132 deletions jquery.file-ajax.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -238,78 +238,84 @@
console.log('ajax2');
e.preventDefault();

var formData = new FormData();
if(!fig.validate || fig.validate()) {

foreach(getData(), function (value, key) {
formData.append(key, value);
});
var formData = new FormData();

foreach(getFileElements(), function ($file, name) {
var file = $file[0];
if(file.files.length > 0) {
if(file.files.length === 0) {
formData.append(name, file.files[0]);
}
else {
foreach(file.files, function (file, index) {
formData.append(name + '[' + index + ']', file);
});
}
}
});
foreach(getData(), function (value, key) {
formData.append(key, value);
});

$.ajax(excludedSet(union(fig, {
processData : false,
contentType: false,
data: null,
dataType: 'text',
beforeSend : function(xhr, settings) {
settings.xhr = function () {
var xhr = new window.XMLHttpRequest();
xhr.upload.onprogress = bind(this, fig.onprogress);
xhr.upload.onload = bind(this, fig.onload);
xhr.upload.onerror = bind(this, fig.onerror);
xhr.upload.onabort = bind(this, fig.onabort);
return xhr;
};
settings.data = formData;
if(fig.beforeSend) {
fig.beforeSend();
}
},
success: function (response, textStatus, jqXHR) {
var metaData = extractMetaDataFromResonse(response);
response = extractBodyFromResponse(response);
if(fig.dataType.toLowerCase() === 'json') {
response = $.parseJSON(response);
foreach(getFileElements(), function ($file, name) {
var file = $file[0];
if(file.files.length > 0) {
if(file.files.length === 0) {
formData.append(name, file.files[0]);
}
else {
foreach(file.files, function (file, index) {
formData.append(name + '[' + index + ']', file);
});
}
}
});

if(!metaData || metaData && metaData.status >= 200 && metaData.status < 300) {
if(fig.success) {
fig.success(response, metaData);
$.ajax(excludedSet(union(fig, {
processData : false,
contentType: false,
data: null,
dataType: 'text',
beforeSend : function(xhr, settings) {
settings.xhr = function () {
var xhr = new window.XMLHttpRequest();
xhr.upload.onprogress = bind(this, fig.onprogress);
xhr.upload.onload = bind(this, fig.onload);
xhr.upload.onerror = bind(this, fig.onerror);
xhr.upload.onabort = bind(this, fig.onabort);
return xhr;
};
settings.data = formData;
if(fig.beforeSend) {
fig.beforeSend();
}
},
success: function (response, textStatus, jqXHR) {
var metaData = extractMetaDataFromResonse(response);
response = extractBodyFromResponse(response);
if(fig.dataType.toLowerCase() === 'json') {
response = $.parseJSON(response);
}
}
else if(fig.error) {
fig.error(response, metaData);
}
},
error: function (jqXHR) {
var metaData = extractMetaDataFromResonse(jqXHR.responseText);
var response = extractBodyFromResponse(jqXHR.responseText);
if(fig.dataType.toLowerCase() === 'json') {
response = $.parseJSON(response);
}

if(fig.error) {
fig.error(response, metaData);
}
},
complete: function () {
if(fig.complete) {
fig.complete();
var status = metaData && metaData.status || response.status;

if(!status || status >= 200 && status < 300) {
if(fig.success) {
fig.success(response, metaData);
}
}
else if(fig.error) {
fig.error(response, metaData);
}
},
error: function (jqXHR) {
var metaData = extractMetaDataFromResonse(jqXHR.responseText);
var response = extractBodyFromResponse(jqXHR.responseText);
if(fig.dataType.toLowerCase() === 'json') {
response = $.parseJSON(response);
}

if(fig.error) {
fig.error(response, metaData);
}
},
complete: function () {
if(fig.complete) {
fig.complete();
}
}
}
})), ['$files', 'getData']);
})), ['$files', 'getData']);

}
});
};

Expand All @@ -318,88 +324,96 @@
console.log('iframeAjax');
e.stopPropagation();

var iframeID = 'file-ajax-id-' + (new Date()).getTime();
if(!fig.validate || fig.validate()) {

$('body').prepend(
'<iframe width="0" height="0" style="display:none;" ' +
'name="' + iframeID + '" id="' + iframeID + '"/>'
);
var iframeID = 'file-ajax-id-' + (new Date()).getTime();

var nonFileElements = {};
getNonFileInputs().each(function () {
var name = $(this).attr('name');
if(name) {
nonFileElements[name] = $(this);
}
});
$('body').prepend(
'<iframe width="0" height="0" style="display:none;" ' +
'name="' + iframeID + '" id="' + iframeID + '"/>'
);

var removeNonFileInputsNames = function () {
foreach(nonFileElements, function ($el) {
$el.removeAttr('name');
var nonFileElements = {};
getNonFileInputs().each(function () {
var name = $(this).attr('name');
if(name) {
nonFileElements[name] = $(this);
}
});
};

var restoreNonFileInputsNames = function () {
foreach(nonFileElements, function ($el, name) {
$el.attr('name', name);
});
};
var removeNonFileInputsNames = function () {
foreach(nonFileElements, function ($el) {
$el.removeAttr('name');
});
};

var $iframe = $('#' + iframeID);
var restoreNonFileInputsNames = function () {
foreach(nonFileElements, function ($el, name) {
$el.attr('name', name);
});
};

$iframe.on('load', function(e) {
var responseText = $iframe.contents().find('body').html();
var metaData = extractMetaDataFromResonse(responseText);
var response = extractBodyFromResponse(responseText);
var $iframe = $('#' + iframeID);

response = fig.dataType && fig.dataType.toLowerCase() === 'json' ?
$.parseJSON(response) : response;
$iframe.on('load', function(e) {
var responseText = $iframe.contents().find('body').html();
var metaData = extractMetaDataFromResonse(responseText);
var response = extractBodyFromResponse(responseText);

if(metaData && metaData.status >= 200 && metaData.status < 300) {
if(fig.success) {
fig.success(response, metaData);
}
}
else if(fig.error) {
fig.error(response, metaData);
}
response = fig.dataType && fig.dataType.toLowerCase() === 'json' ?
$.parseJSON(response) : response;

restoreNonFileInputsNames();
removeHiddenInputs();
$iframe.remove();
if(fig.complete) {
fig.complete();
}
});
var status = metaData && metaData.status || response.status;

// need getData before removeNonFileInputsNames
var data = getData();
// remove names of existing inputs so they are not sent to the
// server and send the data given by getData instead.
removeNonFileInputsNames();
var hiddenInputs = [];
foreach(data, function (value, name) {
var $hidden = $(
'<input type="hidden" ' +
'name="' + name + '" ' +
'value="' + value + '"/>'
);
$form.append($hidden);
hiddenInputs.push($hidden);
});
if(!status || status >= 200 && status < 300) {
if(fig.success) {
fig.success(response, metaData);
}
}
else if(fig.error) {
fig.error(response, metaData);
}

var removeHiddenInputs = function () {
foreach(hiddenInputs, function ($el) {
$el.remove();
restoreNonFileInputsNames();
removeHiddenInputs();
$iframe.remove();
if(fig.complete) {
fig.complete();
}
});
};

$form.attr({
target: iframeID,
action: fig.url,
method: 'POST',
enctype: 'multipart/form-data'
});
// need getData before removeNonFileInputsNames
var data = getData();
// remove names of existing inputs so they are not sent to the
// server and send the data given by getData instead.
removeNonFileInputsNames();
var hiddenInputs = [];
foreach(data, function (value, name) {
var $hidden = $(
'<input type="hidden" ' +
'name="' + name + '" ' +
'value="' + value + '"/>'
);
$form.append($hidden);
hiddenInputs.push($hidden);
});

var removeHiddenInputs = function () {
foreach(hiddenInputs, function ($el) {
$el.remove();
});
};

$form.attr({
target: iframeID,
action: fig.url,
method: 'POST',
enctype: 'multipart/form-data'
});
}
else {
e.preventDefault();
}
});
};

Expand Down
5 changes: 3 additions & 2 deletions respond.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ function uploadFile ($file) {

echo setJqueryFileAjaxResponseCode(json_encode(array_merge(
array('FILES' => $response),
array('POST' => $_POST)
)), 200);
array('POST' => $_POST),
array('status' => 200)
)), 400);
?>

0 comments on commit e940e96

Please sign in to comment.