2011-10-23 91 views
4

我有jQuery腳本,它應該發送迴應我的文件。如果一切順利,我會得到成功,但如果錯了,我應該得到錯誤函數,但我得到jQuery.handleError is not a function jQuery.handleError(s, xml, status, e);我該如何改變handleError?

如何將此handleError更改爲其他函數?或者我能做什麼?

jQuery.extend({ 

createUploadIframe: function(id, uri) 
{ 
     //create frame 
     var frameId = 'jUploadFrame' + id; 
     var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="position:absolute; top:-9999px; left:-9999px"'; 
     if(window.ActiveXObject) 
     { 
      if(typeof uri== 'boolean'){ 
       iframeHtml += ' src="' + 'javascript:false' + '"'; 

      } 
      else if(typeof uri== 'string'){ 
       iframeHtml += ' src="' + uri + '"'; 

      } 
     } 
     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('<form action="" 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   
    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.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.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 
      if (s.complete) 
       s.complete(xml, status); 

      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); 
    // evaluate scripts within html 
    if (type == "html") 
     jQuery("<div>").html(data).evalScripts(); 

    return data; 
} 
}) 

回答

1

您使用的是哪個版本的jQuery?看起來,多個插件存在像你所面臨的問題。例如,參見this thread

在某些情況下,更新到最新版本的jQuery和插件都可以做到。

無論哪種方式,它不工作,當你嵌入早期版本的jQuery會發生什麼,它解決了這個問題嗎?因爲這將意味着問題不在您的腳本中,而是在插件本身內。

+0

在jQuery的1.2.1運行良好,但在v1.5.1中顯示錯誤。我使用這個http://www.phpletter.com/Our-Projects/AjaxFileUpload/插件,但我發現它不再處於開發階段。也許你知道類似這樣的插件? – Gintas

+0

我建議你看看@jk的答案;這可以爲你做詭計。 –

1

我整合ajaxFileUpload時,也曾經有過這個問題,我在我的答案跌跌撞撞通過記錄錯誤控制檯和Google上搜尋它:

   //status = "error"; 
       // jQuery.handleError(s, xml, status, e); 
       console.log(s); 
       console.log(xml); 
       console.log(status); 
       console.log(e); 

然後當錯誤發生時,我發現在調用中的語法是錯誤的。它原來的dataType需要資本化JSON(歸功於shwetanka這裏:AjaxFileUpload SyntaxError: missing } in XML expression

$.ajaxFileUpload({ 
        dataType : 'JSON', 

確保服務器編碼響應返回到JSON和你應該罰款