Проверка URL в Jquery / Javascript - PullRequest
6 голосов
/ 29 ноября 2010

Все, что мне нужно, это метод, который возвращает true, если URL-адрес отвечает. К сожалению, я новичок в jQuery, и мои попытки написания этого метода довольно разочаровывают.

Я видел несколько примеров jQuery, использующих .ajax, но код постоянно терпел неудачу на мне. Что не так?

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...
}

Ответы [ 6 ]

21 голосов
/ 29 ноября 2010

Это не то, как работает AJAX.AJAX в основном асинхронный (это фактически то, что означает первое «A»), что означает, что вместо того, чтобы вызывать функцию и она возвращает значение, вы вызываете функцию и передаете обратный вызов, и этот обратный вызов будет вызываться со значением.

(См. http://en.wikipedia.org/wiki/Continuation_passing_style.)

Что вы хотите сделать после того, как узнаете, отвечает ли URL-адрес или нет? Если вы намеревались использовать этот метод следующим образом:

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

Тогда вам нужно сделать следующее:

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

, где urlExists():

function urlExists(url, callback){
  $.ajax({
    type: 'HEAD',
    url: url,
    success: function(){
      callback(true);
    },
    error: function() {
      callback(false);
    }
  });
}
6 голосов
/ 29 ноября 2010

urlExists() не может вернуться, поскольку ему нужно дождаться запроса.

Либо передайте ему обратный вызов, либо сделайте его синхронным (не рекомендуется, так как он блокирует браузер).

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)      
    });

};

Тогда вы можете сделать

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

Также стоит упомянуть такую ​​же политику происхождения .

Кроме того, возврат из области действия анонимной функции не будетверните в родительскую функцию (как в вашем исходном примере).Он просто возвращает эту внутреннюю функцию.Чтобы вернуться от внутреннего к родительскому, установите флаг и верните его.

2 голосов
/ 29 ноября 2010

В принципе, в вашем коде нет ничего плохого. Смотрите это работает здесь: http://jsfiddle.net/PK76X/

Я предполагаю, что вы используете его для проверки доступности контента в другом домене, что не удается, поскольку браузеры не разрешают междоменные ajax-запросы.

1 голос
/ 29 ноября 2010

В общем, вы, вероятно, должны запустить свой скрипт в Firefox с помощью плагина firebug.Он предоставит вам подробную информацию, необходимую для решения проблемы.

Методы ajax и post асинхронны, поэтому вы должны обработать результат методом обратного вызова.

1 голос
/ 29 ноября 2010

Если URL принадлежит тому же домену, что и ваша страница, вы можете сделать это. Но если он принадлежит другому домену, например google.com, произойдет сбой из-за междоменной безопасности.

0 голосов
/ 08 мая 2014

AJAX в основном асинхронный, и поэтому поведение, которое вы описываете. Я использовал следующее, которое не имеет перекрестного происхождения, чтобы получить простое истинное / ложное указание, является ли URL действительным, синхронно:

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;
}

Тогда использование тривиально:

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...