Tengo un controlador de error ajax genérico escrito así:
$('html').ajaxError(function(e, xhr, settings, exception) { var message = ''; if (xhr.status == 0) { message = 'You are offline!\n Please check your network.'; } else if (xhr.status == 403) { window.location.href = $('#logon').attr('href'); } else if (xhr.status == 404) { message = 'Requested URL not found.'; } else if (xhr.status == 500) { message = xhr.responseText; $('#cboxLoadedContent div.news_article_content').append('<p>' + message + '</p>'); try {//Error handling for POST calls message = JSON.parse(xhr.responseText); } catch (ex) {//Error handling for GET calls message = xhr.responseText; } } else if (errStatus == 'parsererror') { message = 'Error.\nParsing JSON Request failed.'; } else if (errStatus == 'timeout') { message = 'Request timed out.\nPlease try later'; } else { message = ('Unknown Error.\n' + xhr.responseText); } if (message != '' && xhr.status != 500) { message = message; } if (xhr.status != 403) { $('#icis_dashboard').append('<p id="ajax_error_msg" class="offScreen">' + message + '</p>'); errorBox({ inline: true, width: 0, href: '#ajax_error_msg', onLoadCall: function() { $('#cboxLoadedContent').jScrollPaneRemove(); }, onCleanupCall: function() { $('#ajax_error_msg').remove(); } }); } });Entonces, cuando el error no es 403, se muestra un cuadro de diálogo con texto relacionado con el error.
Esto está bien, pero lo que me gustaría hacer es tener el controlador genérico como respaldo y luego tratar cada error de forma individual dentro de la llamada ajax original.
Entonces, como el controlador de respaldo alerta a "barra" en un 404, me gustaría alertar a "foo" en su lugar:
error: function(xhr) { if (xhr.status == 404) { //window.location.href = $('#logon').attr('href'); alert("foo"); } }Yo sthere de todos modos para hacer esto? No sé cómo evitar que se active la copia de seguridad, ya que ambos parecen activarse en este momento.
Puede establecer la propiedad ajax "global" en falso en la función ajax que maneja su propio error. Eso debería evitar el manejo global de errores. Consulte: http://api.jquery.com/jQuery.ajax#toptions .
No creo que puedas controlar esto con jQuery. El ajaxError global se llama en cualquier error que ocurra durante una llamada ajax. Sin embargo, la devolución de llamada de error "local" se llama antes que la devolución de llamada global, por lo que puede establecer una variable que le indique a la devolución de llamada global que no se ejecute.
Por ejemplo:
var handledLocally = false; $('html').ajaxError(function(e, xhr, settings, exception) { if (!handledLocally){ //run the normal error callback code and the reset handledLocally } }); error: function(){ //set handledLocally to true to let the global callback it has been taken care of handledLocally = true; }Puede ver este jsFiddle que muestra cómo se puede lograr esto (asegúrese de hacer clic en ejecutar en la parte superior antes de hacer clic en los enlaces): http://jsfiddle.net/e7By8/
Creo que establecer una variable global es una mala idea porque puede tener varias solicitudes de ajax al mismo tiempo. Como se mencionó, la devolución de llamada de error "local" se llama antes de la devolución de llamada global. Mi solución es simplemente adjuntar alguna propiedad personalizada al objeto jqXHR, por ejemplo , handleLocally y configurarlo como verdadero en su controlador local y verificarlo en el controlador global.
manejo local:
$.ajax({ //some settings error:function(jqXHR, textStatus, errorThrown){ //handle and after set jqXHR.handledLocally = true } })manejo mundial:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { if (jqXHR.handledLocally)) { return; } //handle global error })