2010-07-29 16 views
5

estoy usando una función de envoltura alrededor de la función AJAX de jQuery como este error url no es válido Cuando una url no es válida, primero llama al error y luego a la función completa. Está bien. Pero cuando uso "script" como dataType, no llama nada cuando la url no es válida. ¿Qué debo hacer para detectar errores HTTP 404 y otros cuando uso "script" como dataType?jQuery ajax manejo con "guión" tipoDatos

+0

¿Qué está utilizando para depurar? ¿Tiene acceso a Fiddler o Firebug para que pueda evaluar lo que se solicita y devuelve? Otra pregunta es: ¿está tratando de acceder a un recurso en un dominio diferente con su solicitud 'script'? –

+0

Ni siquiera intento Firebug pero es una buena idea. El recurso está en un dominio diferente, pero puedo OBTENER un script desde un "dominio cruzado" – Pink

+0

¿Qué sucede cuando se cambia el parámetro 'tipo' de 'script' a 'jsonp'? ¿Su éxito alerta fuego? –

Respuesta

1

He visto la fuente de jQuery y encontré que no llama a ningún método de manejo de errores. De hecho, llama a las funciones de éxito() y completar() solo cuando la solicitud de obtención de http es exitosa.

// If we're requesting a remote document 
     // and trying to load JSON or Script with a GET 
     if (s.dataType === "script" && type === "GET" && remote) { 
      var head = document.getElementsByTagName("head")[0] || document.documentElement; 
      var script = document.createElement("script"); 
      script.src = s.url; 
      if (s.scriptCharset) { 
       script.charset = s.scriptCharset; 
      } 

      // Handle Script loading 
      if (!jsonp) { 
       var done = false; 

       // Attach handlers for all browsers 
       script.onload = script.onreadystatechange = function() { 
        if (!done && (!this.readyState || 
          this.readyState === "loaded" || this.readyState === "complete")) { 
         done = true; 
         success(); 
         complete(); 

         // Handle memory leak in IE 
         script.onload = script.onreadystatechange = null; 
         if (head && script.parentNode) { 
          head.removeChild(script); 
         } 
        } 
       }; 
      } 

      // Use insertBefore instead of appendChild to circumvent an IE6 bug. 
      // This arises when a base node is used (#2709 and #4378). 
      head.insertBefore(script, head.firstChild); 

      // We handle everything using the script element injection 
      return undefined; 
     } 
0

Malas noticias: este problema aún no se resuelve en jquery 1.x. Buenas noticias: es resuelto en jquery 2.x (que no es compatible con IE < = 8). Logré que funcione mi devolución de llamada complete, que recibe una notificación de error. Consulte here para obtener el código de jquery, o el fragmento relacionado:

send: function(_, complete) { 
    script = jQuery("<script>").prop({ 
     async: true, 
     charset: s.scriptCharset, 
     src: s.url 
    }).on(
     "load error", 
     callback = function(evt) { 
      script.remove(); 
      callback = null; 
      if (evt) { 
       complete(evt.type === "error" ? 404 : 200, evt.type); 
      } 
     } 
    ); 
    document.head.appendChild(script[ 0 ]); 
},