Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I change handleError?

Tags:

jquery

I have jquery script, which should send response to my file. If everything good, I get success, but if wrong, I should get error function, but I get jQuery.handleError is not a function jQuery.handleError(s, xml, status, e);

How can I change this handleError to other function? Or what can I do?

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;
}
})
like image 457
Gintas Avatar asked Oct 23 '11 12:10

Gintas


3 Answers

handleError was deprecated from jquery 1.5 and up. I switched from the plugin you are using to this one: http://www.jainaewen.com/files/javascript/jquery/iframe-post-form.html

It's much simpler and it is pretty easy to modify the plugin to your specific form.

You could try to write your own handleError function as this post suggests: When was handleError removed from jQuery?

like image 148
jk. Avatar answered Oct 25 '22 02:10

jk.


Which version of jQuery are you using? It seems that multiple plugins have problems like the one you're faced with. See, for example, this thread.

In some cases, updating to latests version of both jQuery and the plugin would do the trick.

Either way, it that's not working, what happens when you embed a earlier version of jQuery, does it solves the problem? Cause that would mean the problem is not in your script, but inside the plugin itself.

like image 1
Dennis Hunink Avatar answered Oct 25 '22 01:10

Dennis Hunink


I had this problem too when integrating ajaxFileUpload, I stumbled across my answer by logging the error to console and googling it:

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

then when the error fired I found out that syntax in the call was wrong. it turns out dataType needs to be capitalized as JSON(credit goes to shwetanka here: AjaxFileUpload SyntaxError: missing } in XML expression)

$.ajaxFileUpload({
                   dataType : 'JSON',

make sure the server is encoding the response back in json and you should be fine

like image 1
David Duncan Avatar answered Oct 25 '22 01:10

David Duncan