php 找不到 Ajax 上传插件抛出 jQuery.handleError

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8627201/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 05:07:25  来源:igfitidea点击:

Ajax upload plugin throwing jQuery.handleError not found

phpjqueryajax

提问by MrFoh

Am using the ajax file upload plugin from PHP Letterand am using jQuery 1.6.2.The files upload properly, but am unable to user the JSON data returned from the php script, when i check the javascript error consolse am i greeted with this error,

正在使用PHP Letter 中的 ajax 文件上传插件,并使用 jQuery 1.6.2。文件上传正确,但无法使用从 php 脚本返回的 JSON 数据,当我检查 javascript 错误时,我是否遇到了此错误,

"Uncaught TypeError: Object function (a,b){return new e.fn.init(a,b,h)} has no method 'handleError'"

“未捕获的类型错误:对象函数 (a,b){return new e.fn.init(a,b,h)} 没有方法 'handleError'”

in chrome and

在铬和

"jQuery.handleError is not a function"

“jQuery.handleError 不是函数”

in firefox.

在火狐。

Does any one have a similar experience?

有没有人有类似的经历?

回答by Govind Totla

It was when you are trying to use this with latest version of jQuery. handleError function is depreciated from library upper then V 1.5. I resolve it by just adding this function in my ajaxfileupload.js file.

当您尝试将其与最新版本的 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] );
    }
}

and it works fine for me. Also, if you try to use any ajaxSubmit() on same page it will wont work, so i use normal form submit with ajxfileupload. if any one can help in same way please let me know.

它对我来说很好用。此外,如果您尝试在同一页面上使用任何 ajaxSubmit() 它将不起作用,因此我使用带有 ajxfileupload 的普通表单提交。如果有人能以同样的方式提供帮助,请告诉我。

回答by Nikolay

http://forum.phpletter.com/viewtopic.php?f=8&t=3044

http://forum.phpletter.com/viewtopic.php?f=8&t=3044

Modern jQuery's do not have the jQuery.handleError(s, xml, status, e)method.

现代 jQuery 没有jQuery.handleError(s, xml, status, e)方法。

Therefore, in case of an error, the file uploader hangs all javascripts.

因此,如果出现错误,文件上传器会挂起所有 javascript。

This uploader script is small, elegant and nice. However, it's rather old and jQuery has completely redesigned ajax handing since then. Next time, I'll try to use a modern complex script with a progress bar and drag-and-drop support: http://valums.com/ajax-upload/

这个上传器脚本小巧、优雅、漂亮。然而,它已经很老了,从那时起 jQuery 已经完全重新设计了 ajax 处理。下一次,我将尝试使用带有进度条和拖放支持的现代复杂脚本:http: //valums.com/ajax-upload/

Otherwise, for legacy code or simplicity reasons, you'll find this fix of ajaxfileupload.js(Version 2.1) useful: Note that global "ajaxError" event is not supported.

否则,出于遗留代码或简单性原因,您会发现ajaxfileupload.js(2.1 版)的此修复程序很有用:请注意,不支持全局“ajaxError”事件。

    jQuery.extend({


        createUploadIframe: function(id, uri)
       {
             //create frame
                var frameId = 'jUploadFrame' + id;
                var 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('');   
          if(data)
          {
             for(var i in data)
             {
                jQuery('').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      
            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);
                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.my_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.my_handleError(s, xml, status);
                    } catch(e)
                {
                        status = "error";
                        jQuery.my_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.my_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.my_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("").html(data).evalScripts();
             //alert($('param', data).each(function(){alert($(this).attr('value'));}));
            return data;
        },

        /* jQuery 1.2 function substitution: */
        my_handleError: function( s, xhr, status, e ) {
          // If a local callback was specified, fire it
          if ( s.error ) s.error( xhr, status, e );

          // Fire the global callback
                    /* INCOMPATIBLE!!! Modern jQuery 1.5+ expects xhr to be an jqXHR object.
          if ( s.global )
             jQuery.event.trigger( "ajaxError", [xhr, s, e] );
                            */
       }
    })

回答by kmas

I also use this plugin and there is some incompability with new versions of jQuery. I use jquery-1.9.1.js on my project.

我也使用这个插件,但与新版本的 jQuery 有一些不兼容。我在我的项目中使用 jquery-1.9.1.js。

The plugin is used with jquery-1.2.1.js .

该插件与 jquery-1.2.1.js 一起使用。

I have found a solution on a Chinese website : http://chen-h.iteye.com/blog/1769457I have tested this version and it works. Callbacks are now okay.

我在一个中文网站上找到了一个解决方案:http: //chen-h.iteye.com/blog/1769457我已经测试了这个版本并且它有效。回调现在可以了。

I don't speak Chinese but I imagine the developer has converted this plugin for new version of Jquery.

我不会说中文,但我想开发人员已经将这个插件转换为新版本的 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;
}
});

回答by Savid

The example uses jQuery 1.2.1;

该示例使用 jQuery 1.2.1;

http://www.phpletter.com/javascript/jquery.js

http://www.phpletter.com/javascript/jquery.js

the jQuery.handleError()was removed a while back, I'm not sure when.

不久前jQuery.handleError()被删除了,我不确定什么时候。

You need to use an older jQuery version, update the script yourself or try to find an up to date script. Try http://valums.com/ajax-upload/or have a search for a few but just remember to check their last update date!

您需要使用较旧的 jQuery 版本,自己更新脚本或尝试找到最新的脚本。尝试http://valums.com/ajax-upload/或搜索一些,但请记住检查它们的上次更新日期!

回答by MrFoh

I found a similar plugin and modded it to fit my needs, thanks for the heads up about the removal of the $.handleError()

我找到了一个类似的插件并对其进行了修改以满足我的需要,感谢您对 $.handleError() 删除的提醒

回答by Anupam Rekha

This article applies the AJAX Upload well and explains although its for codeigniter. It did work for me except that I had to replace

这篇文章很好地应用了 AJAX 上传并解释了它的代码点火器。它确实对我有用,只是我必须更换

dataType : 'json'

数据类型:'json'

by

经过

dataType : 'html'

数据类型:'html'

seems has some issue with json

json 似乎有问题

also relative url didn't work for me so i put an absolute url.

相对网址对我也不起作用,所以我放了一个绝对网址。

 url         :'http://localhost/satyam/LifeBook/places/upload_file',

and not to foreget obviosly you need to write the handlError function in the ajaxupload.js file to the end. http://www.kovloq.com/2011/10/23/ajax-upload-using-codeigniter/

并且不要忘记,你需要在 ajaxupload.js 文件中编写handlError函数到最后。 http://www.kovloq.com/2011/10/23/ajax-upload-using-codeigniter/