Я использую плагин для загрузки файла ajax из PHP Letter и использую jQuery 1.6.2. Файлы загружаются должным образом, но я не могу использовать данные JSON, возвращаемые из скрипта php, когда я проверю ошибку javascript, я приветствую эту ошибку ,
"Uncaught TypeError: функция объекта (a, b) {return new e.fn.init (a, b, h)} не имеет метода 'handleError'"
в хром и
"jQuery.handleError не является функцией"
в firefox.
Есть ли у кого-то подобный опыт?
Это было, когда вы пытаетесь использовать это с последней версией jQuery. Функция handleError обесценивается из верхней части библиотеки, а затем V 1.5. Я разрешаю его, просто добавив эту функцию в свой файл ajaxfileupload.js.
handleError: function( s, xhr, status, e ) { // If a local callback was specified, fire it if ( s.error ) { s.error.call( s.context || window, xhr, status, e ); } // Fire the global callback if ( s.global ) { (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); } }
и он отлично работает для меня. Кроме того, если вы попытаетесь использовать любой ajaxSubmit () на той же странице, это не сработает, поэтому я использую обычную форму submit с ajxfileupload. если кто-то может помочь таким же образом, пожалуйста, дайте мне знать.
http://forum.phpletter.com/viewtopic.php?f=8&t=3044
Современные jQuery не имеют метода jQuery.handleError (s, xml, status, e) .
Таким образом, в случае ошибки, загрузчик файлов висит на всех javascripts.
Этот сценарий загрузчика небольшой, элегантный и приятный. Тем не менее, он довольно старый, и с тех пор jQuery полностью переработал ajax-передачу. В следующий раз я попытаюсь использовать современный сложный скрипт с индикатором выполнения и поддержкой перетаскивания: http://valums.com/ajax-upload/
В противном случае, по причинам устаревшего кода или простоты, вы найдете это исправление ajaxfileupload.js (версия 2.1) полезным: обратите внимание, что глобальное событие «ajaxError» не поддерживается.
jQuery.extend ({
createUploadIframe: function (id, uri)
{
// создать фрейм
var frameId = 'jUploadFrame' + id;
var iframeHtml = '';
JQuery (iframeHtml) .appendTo (document.body);
return jQuery ('#' + frameId) .get (0);
},
createUploadForm: function (id, fileElementId, data)
{
// создать форму
var formId = 'jUploadForm' + id;
var fileId = 'jUploadFile' + id;
var form = jQuery ('');
если (данные)
{
для (var i в данных)
{
JQuery ( '') appendTo (форма).
}
}
var oldElement = jQuery ('#' + fileElementId);
var newElement = jQuery (oldElement) .clone ();
jQuery (oldElement) .attr ('id', fileId);
JQuery (oldElement) .before (newElement);
JQuery (oldElement) .appendTo (форма);
// установить атрибуты
jQuery (form) .css ('position', 'absolute');
jQuery (form) .css ('top', '-1200px');
jQuery (form) .css ('left', '-1200px');
JQuery (форма) .appendTo ( 'тело');
форму возврата;
},
ajaxFileUpload: function (s) {
// TODO вводит глобальные настройки, позволяя клиенту изменять их для всех запросов, а не только таймаут
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;
// Следим за новым набором запросов
if (s.global &&! jQuery.active ++)
{
jQuery.event.trigger ("ajaxStart");
}
var requestDone = false;
// Создаем объект запроса
var xml = {}
if (s.global)
jQuery.event.trigger ("ajaxSend", [xml, s]);
// Подождите ответа, чтобы вернуться
var uploadCallback = function (isTimeout)
{
var io = document.getElementById (frameId);
пытаться
{
если (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;
}
} Поймать (е)
{
jQuery.my_handleError (s, xml, null, e);
}
if (xml || isTimeout == "timeout")
{
requestDone = true;
статус var;
пытаться {
status = isTimeout! = "timeout"? «успех»: «ошибка»;
// Удостоверьтесь, что запрос был успешным или немодифицированным
if (status! = "error")
{
// обрабатывать данные (запускает xml через httpData независимо от обратного вызова)
var data = jQuery.uploadHttpData (xml, s.dataType);
// Если был задан локальный обратный вызов, запустите его и передайте ему данные
если (s.success)
s.success (данные, статус);
// Пожар глобального обратного вызова
if (s.global)
jQuery.event.trigger ("ajaxSuccess", [xml, s]);
} else
jQuery.my_handleError (s, xml, status);
} catch (e)
{
status = "error";
jQuery.my_handleError (s, xml, status, e);
}
// Запрос завершен
if (s.global)
jQuery.event.trigger ("ajaxComplete", [xml, s]);
// Обрабатываем глобальный счетчик AJAX
if (s.global &&! --jQuery.active)
jQuery.event.trigger ("ajaxStop");
// Результат процесса
if (s.complete)
s.complete (xml, статус);
JQuery (ИО) .unbind ()
SetTimeout (функция ()
{ пытаться
{
JQuery (ИО) .remove ();
JQuery (форма) .remove ();
} catch (e)
{
jQuery.my_handleError (s, xml, null, e);
}
}, 100)
xml = null
}
}
// Тайм-аут
if (s.timeout> 0)
{
SetTimeout (функция () {
// Проверяем, продолжает ли запрос
if (! requestDone) uploadCallback («таймаут»);
}, s.timeout);
}
пытаться
{
var form = jQuery ('#' + formId);
jQuery (form) .attr ('action', s.url);
jQuery (form) .attr ('method', 'POST');
jQuery (form) .attr ('target', frameId);
если (form.encoding)
{
jQuery (form) .attr ('encoding', 'multipart / form-data');
}
еще
{
jQuery (form) .attr ('enctype', 'multipart / form-data');
}
JQuery (форма) .submit ();
} catch (e)
{
jQuery.my_handleError (s, xml, null, e);
}
jQuery ('#' + frameId) .load (uploadCallback);
return {abort: function () {}};
},
uploadHttpData: function (r, type) {
var data =! type;
data = type == "xml" || данные ? r.responseXML: r.responseText;
// Если тип «скрипт», eval его в глобальном контексте
if (type == "script")
jQuery.globalEval (данные);
// Получить объект JavaScript, если используется JSON.
if (type == "json")
eval ("data =" + data);
// оцениваем скрипты внутри html
if (type == "html")
JQuery ( "") HTML (данные) .evalScripts ().
// alert ($ ('param', data) .each (function () {alert ($ (this) .attr ('value'));}));
возвращать данные;
},
/ * jQuery 1.2 подстановка функции: * /
my_handleError: function (s, xhr, status, e) {
// Если был указан локальный обратный вызов, запустите его
if (s.error) s.error (xhr, status, e);
// Пожар глобального обратного вызова
/ * НЕСОБЛЮДЕНИЕ !!! Современный jQuery 1.5+ ожидает, что xhr станет объектом jqXHR.
if (s.global)
jQuery.event.trigger ("ajaxError", [xhr, s, e]);
* /
}
})
Я также использую этот плагин, и есть некоторая несовместимость с новыми версиями jQuery. Я использую jquery-1.9.1.js в своем проекте.
Плагин используется с jquery-1.2.1.js.
Я нашел решение на китайском веб-сайте: http://chen-h.iteye.com/blog/1769457 Я протестировал эту версию, и она работает. Обратные вызовы теперь в порядке.
Я не говорю по-китайски, но я думаю, что разработчик превратил этот плагин в новую версию JQuery.
jQuery.extend({ 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] ); } }, createUploadIframe: function(id, uri) { var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { if(jQuery.browser.version=="9.0") { 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; }, ajaxUpload:function(s,xml){ //if((fromFiles.nodeType&&!((fileList=fromFiles.files)&&fileList[0].name))) var uid = new Date().getTime(),idIO='jUploadFrame'+uid,_this=this; var jIO=$('<iframe name="'+idIO+'" id="'+idIO+'" style="display:none">').appendTo('body'); var jForm=$('<form action="'+s.url+'" target="'+idIO+'" method="post" enctype="multipart/form-data"></form>').appendTo('body'); var oldElement = $('#'+s.fileElementId); var newElement = $(oldElement).clone(); $(oldElement).attr('id', 'jUploadFile'+uid); $(oldElement).before(newElement); $(oldElement).appendTo(jForm); this.remove=function() { if(_this!==null) { jNewFile.before(jOldFile).remove(); jIO.remove();jForm.remove(); _this=null; } } this.onLoad=function(){ var data=$(jIO[0].contentWindow.document.body).text(); try{ if(data!=undefined){ data = eval('(' + data + ')'); try { if (s.success) s.success(data, status); // Fire the global callback if(s.global) jQuery.event.trigger("ajaxSuccess", [xml, s]); if (s.complete) s.complete(data, status); xml = null; } 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 } }catch(ex){ alert(ex.message); }; } this.start=function(){jForm.submit();jIO.load(_this.onLoad);}; return this; }, createUploadForm: function(id, url,fileElementId, data) { //create form var formId = 'jUploadForm' + id; var fileId = 'jUploadFile' + id; var form = jQuery('<form action="'+url+'" 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); } } var oldElement = jQuery('#' + fileElementId); 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 // Create the request object var xml = {}; s = jQuery.extend({}, jQuery.ajaxSettings, s); if(window.ActiveXObject){ var upload = new jQuery.ajaxUpload(s,xml); upload.start(); }else{ var id = new Date().getTime(); var form = jQuery.createUploadForm(id,s.url, 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; 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); 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]); if (s.complete) s.complete(data, status); } 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 jQuery(io).unbind(); setTimeout(function() { try { jQuery(io).remove(); jQuery(form).remove(); } catch(e) { jQuery.handleError(s, xml, null, e); } }, 100); xml = null; } }; // 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).html() ); } // evaluate scripts within html if ( type == "html" ) jQuery("<div>").html(data).evalScripts(); return data; } });
В примере используется jQuery 1.2.1;
http://www.phpletter.com/javascript/jquery.js
jQuery.handleError() был удален некоторое время назад, я не уверен, когда.
Вам нужно использовать более старую версию jQuery, самостоятельно обновить сценарий или попытаться найти обновленный скрипт. Попробуйте http://valums.com/ajax-upload/ или найдите несколько, но не забудьте проверить их дату последнего обновления!
Я нашел подобный плагин и модифицировал его, чтобы он соответствовал моим потребностям, спасибо за то, что вы решили удалить $ .handleError ()
В этой статье хорошо используется приложение AJAX Upload и объясняется, хотя оно для codeigniter. Это работало для меня, за исключением того, что мне пришлось заменить
dataType: 'json'
от
dataType: 'html'
похоже, есть проблема с json
также относительный url не работал для меня, поэтому я поставил абсолютный URL-адрес.
url :'http://localhost/satyam/LifeBook/places/upload_file',
а не toeget obviosly вам нужно написать функцию handlError в файле ajaxupload.js до конца. http://www.kovloq.com/2011/10/23/ajax-upload-using-codeigniter/