2010-11-29 31 views
6

Todo lo que necesito es un método que devuelve verdadero si la URL está respondiendo. Desafortunadamente, soy nuevo en jQuery y está haciendo que mis intentos de escribir ese método sean bastante frustrantes.Comprobando una URL en Jquery/Javascript

He visto varios ejemplos de jQuery usando .ajax, pero el código me falla constantemente. ¿Qué pasa?

var urlExists = function(url){ 
    //When I call the function, code is still executing here. 
    $.ajax({ 
     type: 'HEAD', 
     url: url, 
     success: function() { 
      return true; 
     }, 
     error: function() { 
      return false; 
     }    
    }); 
    //But not here... 
} 

Respuesta

20

Así no es como funciona AJAX. AJAX es fundamentalmente asíncrono (eso es lo que significa la primera 'A'), lo que significa que en lugar de llamar a una función y devuelve un valor, llama a una función y pasa una devolución de llamada, y esa devolución de llamada se llamará con el valor .

(Ver http://en.wikipedia.org/wiki/Continuation_passing_style.)

¿Qué quieres hacer después de saber si la URL está respondiendo o no? Si usted pretende utilizar este método como este:

//do stuff 
var exists = urlExists(url); 
//do more stuff based on the boolean value of exists 

Entonces lo que tiene que hacer es:

//do stuff 
urlExists(url, function(exists){ 
    //do more stuff based on the boolean value of exists 
}); 

donde urlExists() es:

function urlExists(url, callback){ 
    $.ajax({ 
    type: 'HEAD', 
    url: url, 
    success: function(){ 
     callback(true); 
    }, 
    error: function() { 
     callback(false); 
    } 
    }); 
} 
+0

No estoy seguro de si te estás perdiendo el punto o estoy ... Todo lo que quiero ahora es un valor booleano. – user474632

+0

Actualicé mi respuesta para darle un valor booleano, ¿eso ayuda? –

+0

Me gusta esta respuesta. –

5

urlExists() no pueden regresar porque necesita esperar a la solicitud.

O bien pásalo por una devolución de llamada, o hazlo sincrónico (no recomendado, porque bloquea el navegador).

var urlExists = function(url, callback) { 

    if (! $.isFunction(callback)) { 
     throw Error('Not a valid callback'); 
    } 

    $.ajax({ 
     type: 'HEAD', 
     url: url, 
     success: $.proxy(callback, this, true), 
     error: $.proxy(callback, this, false)  
    }); 

}; 

A continuación, puede hacer

urlExists('/something', function(success) { 
    if (success) { 
     alert('Yay!'); 
    } else { 
     alert('Oh no!'); 
    } 
}); 

También vale la pena mencionar la same origin policy.

También, volviendo desde el alcance de una función anónima will not return en la función principal (como en el ejemplo original). Simplemente devuelve esa función interna. Para volver de un interno a uno principal, establezca un indicador y devuélvalo.

+0

Volviendo T/F no debería ser un problema, y ​​si era que iba a perder el punto entero al código de todos modos ... – user474632

+0

podría usar petición síncrona, aunque –

+0

@ user205376 Sí , si no te importa tener bloqueado el navegador de tu usuario. – alex

1

Si la url es del mismo dominio que su página, puede hacerlo. Pero si proviene de un dominio diferente, por ejemplo, google.com, fallará debido a la seguridad entre dominios.

1

En general, es probable que debe ejecutar su script en Firefox usando el plugin firebug. Le dará los detalles necesarios para resolver el problema.

Los métodos ajax y post son asíncronos, por lo que debe manejar el resultado en un método de devolución de llamada.

2

Básicamente, no hay nada de malo en su código. Véalo trabajar aquí: http://jsfiddle.net/PK76X/

Supongo que lo está usando para verificar la disponibilidad del contenido en un dominio diferente, que falla porque los navegadores no permiten solicitudes ajax de dominio cruzado.

+0

Gracioso, eso. Logré hacerlo bien a excepción de un detalle importante. Ahora tendré que pensar en un método diferente para que mi sitio encuentre la dirección correcta. – user474632

+1

En realidad, existe una diferencia fundamental entre el código en su jsfiddle y su código: su código hará, en caso de éxito o error, algo (alerta, en este caso). Su código intenta devolver un valor de la función original, que no funcionará porque la función original ya ha finalizado para el momento en que se invocan las funciones de éxito o error. Esas declaraciones de devolución no regresan de urlExists(), vuelven de las funciones de éxito y error. –

+1

Tiene toda la razón, no me di cuenta de esas declaraciones de devolución ... – Simon

-1

AJAX es básicamente asincrónico, y es por eso que el comportamiento que está describiendo. He utilizado el siguiente, que está libre de origen cruz, para obtener una indicación simple de verdadero/falso si una URL es válida, de manera sincrónica:

function isValidURL(url) { 
    var encodedURL = encodeURIComponent(url); 
    var isValid = false; 

    $.ajax({ 
     url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&format=json", 
     type: "get", 
     async: false, 
     dataType: "json", 
     success: function(data) { 
     isValid = data.query.results != null; 
     }, 
     error: function(){ 
     isValid = false; 
     } 
    }); 

    return isValid; 
} 

El uso es entonces trivial:

var isValid = isValidURL("http://www.wix.com"); 
alert(isValid ? "Valid URL!!!" : "Damn..."); 

esperanza esto ayuda

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – vonbrand

+0

Lo siento Ohad, pero su función volverá inmediatamente antes de disparar éxito o error porque la llamada a ajax es asincrónica. por lo tanto, el método devuelve isValid = false inmediatamente después de llamar a ajax(), cada vez. tiene que votar abajo este. lo siento. –

+0

@ JJ_Coder4Hire, ¿Lo has probado? Verifica la llamada ajax. Establece: "async: false" – Ohad

Cuestiones relacionadas