2011-12-24 71 views
18

我使用的是从PHP Letter的ajax文件上传插件,我正在使用jQuery 1.6.2。文件上传正确,但无法用户从PHP脚本返回的JSON数据,当我检查JavaScript错误consolse是我迎接这个错误,Ajax上传插件抛出jQuery.handleError not found

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

在Chrome和

"jQuery.handleError is not a function"

在Firefox

有没有人有类似的经历?

回答

46

这是当你试图将这与最新版本的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(),它将无法正常工作,所以我使用正常形式提交ajxfileupload。如果有人能以同样的方式提供帮助,请告诉我。

+0

我添加了你的代码,但我仍然得到相同的错误 – Uahmed 2013-04-04 12:06:45

+1

你可能在添加代码时做错了什么。 – 2013-04-04 12:24:06

+2

是Govind你是对的我错过了“,”之前handleError,抱歉,我是新来的:)谢谢它的作品 – Uahmed 2013-04-04 12:49:07

0

我发现了一个类似的插件,并改装它适合我的需要,感谢抬头关于删除$ .handleError(的)

3

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

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

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

这个上传者脚本很小,很高雅,很不错。不过,它已经很老了,从那以后,jQuery就完全重新设计了ajax。下一次,我会尝试使用具有进度条和拖放支持的现代复杂脚本:http://valums.com/ajax-upload/

否则,对于遗留代码或简单性原因,您会发现此修复程序为ajaxfileupload.js(Version 2.1)useful: 请注意,全局“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]); 
          */ 
     } 
    }) 

0

本文将AJAX上传应用得很好,并解释了它对于codeigniter。它为我做的工作只是我不得不更换

数据类型:由

的dataType 'JSON'

: 'HTML'

似乎有json的一些问题

也相对网址没有为我工作,所以我把绝对的网址。

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

,而不是obviosly foreget你需要写handlError功能在ajaxupload.js文件进行到底。 http://www.kovloq.com/2011/10/23/ajax-upload-using-codeigniter/

2

我也使用这个插件,并且与新版本的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; 
} 
});