Я использую плагин для загрузки файла 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/