2012-07-13 14 views
6

Tengo una función de código de estado jquery ajax para manejar un 404 ... otra respuesta de desbordamiento de pila indica que en el método de éxito, this.url proporciona la url para la solicitud ... sin embargo, este no parece ser el caso para mi controlador statusCode. ¿Algunas ideas? Nada que pueda ver en la documentación sobre cómo obtener la url para la solicitud.JQuery statusCode 404 - cómo obtener la URL de jqXhr?

Mi objeto opción ajax se ve más o menos así (puede haber perdido fuera de un aparato ortopédico cuando se recorta a cabo código no es relevante para esta pregunta)

;(function($) { 
    var defaultSettings = { 
    // ... other plugin specific settings 
    ajaxOptions: 
    { 
        cache:false, 
        context:$(this), 
        statusCode: { 
         404:function(xhr) { 

         // this line... this.url is always undefined (so is xhr.url) 
          $('#body').append('<div class="errordisplay">Content not found' + (this.url?': ' + this.url:'') + '</div>'); 

        // ... do other stuff 

          return false; 

         } 
        } 
      } 
} 
+0

¿Está pasando algo en la opción 'context' a' $ .ajax() '? –

+2

['this.url' debería funcionar] (http://jsfiddle.net/jamesallardice/f3XTn/). Es posible que deba publicar más de su código. –

+0

este objeto ajaxOption es las opciones predeterminadas para un plugin jquery personalizado, así que tengo "context: $ (this)" ... código de pregunta actualizado con más detalles – Nathan

Respuesta

8

El contexto predeterminado para los controladores de eventos AJAX (es decir, el objeto unido a this en los controladores) de hecho expone una propiedad url porque es una mezcla entre $.ajaxSettings y los argumentos pasados ​​a $.ajax().

Sin embargo, en su caso, anula ese contexto predeterminado pasando $(this) en la opción context. Además, hacer eso en ajaxOptions significa que no será fácil extender ese objeto con la URL actual.

Sugeriría asociar la URL con el elemento que su complemento está mejorando antes de la llamada AJAX, usando data() o similar.

30

Se puede modificar la solicitud & configuración antes de enviar objetos con código siguiente:

$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
     jqXHR.url = settings.url; 
    } 
}); 

luego acceder a xhr.url en el statusCode de devolución de llamada. Deberia de funcionar.

+0

Funciona para mí y permite registrar la URL con fines de depuración. –

+0

Y si redirige en proceso? – Elaman

+0

@Elaman El navegador maneja la redirección de forma transparente, por lo que debería funcionar para 301/302 respuestas. – janlay

Cuestiones relacionadas