2011-12-24 54 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; 
} 
});