Подтвердить что ты не робот

Как проверить, существует ли страница с помощью Javascript

<a href="#" onclick="location.href='http://www.example.com'; return false;">Hello</a>

когда я нажимаю ссылку, он должен проверить, существует ли страница. Если он существует, он переходит на эту страницу (www.example.com), но если страница не существует, она перенаправляется на другой URL.

4b9b3361

Ответ 1

Это зависит от того, существует ли страница в том же домене или нет. Если вы пытаетесь определить, существует ли страница во внешнем домене, она не будет работать - защита браузера предотвращает междоменные вызовы (политика одного и того же происхождения).

Если он находится в том же домене, вы можете использовать jQuery, как предположил Бух-Буш. Хотя я бы рекомендовал делать HEAD-запрос вместо GET-запроса, по умолчанию метод $.ajax() - метод $.ajax() будет загружать всю страницу. Выполнение запроса HEAD возвращает только заголовки и указывает, существует ли страница (коды ответов 200 - 299) или нет (коды ответов 400 - 499). Пример:

$.ajax({
    type: 'HEAD',
    url: 'http://yoursite.com/page.html',
success: function() {
        // page exists
},
error: function() {
        // page does not exist
}
});

Смотрите также: http://api.jquery.com/jQuery.ajax/

Ответ 2

Хорошая работа вокруг прокси. Если у вас нет доступа к серверной стороне, вы можете использовать YQL. Посещение: http://developer.yahoo.com/yql/console/

Оттуда вы можете сделать что-то вроде: select * from htmlstring where url="http://google.com". Вы можете использовать "REST-запрос", который они имеют на этой странице, в качестве отправной точки для вашего кода.

Здесь приведен код, который будет принимать полный URL-адрес и использовать YQL для определения того, существует ли эта страница:

function isURLReal(fullyQualifiedURL) {
    var URL = encodeURIComponent(fullyQualifiedURL),
        dfd = $.Deferred(),
        checkURLPromise = $.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20htmlstring%20where%20url%3D%22' + URL + '%22&format=json');

    checkURLPromise
            .done(function(response) {
                // results should be null if the page 404s or the domain doesn't work
                if (response.query.results) { 
                    dfd.resolve(true);
                } else {
                    dfd.reject(false);
                }
            })
            .fail(function() {
                dfd.reject('failed');
            });
    });

    return dfd.promise();
}

// usage
isURLReal('http://google.com')
        .done(function(result) {
            // yes
        })
        .fail(function(result) {
            // no, or request failed
        });

Обновление 2 августа 2017 года

Похоже, что Yahoo устарел "select * from html", хотя "select * from htmlstring" действительно работает.

Ответ 3

На основе документации для XMLHttpRequest:

function returnStatus(req, status) {
  //console.log(req);
  if(status == 200) {
    console.log("The url is available");
    // send an event
  }
  else {
    console.log("The url returned status code " + status);
    // send a different event
  }
}

function fetchStatus(address) {
 var client = new XMLHttpRequest();
 client.onreadystatechange = function() {
  // in case of network errors this might not give reliable results
  if(this.readyState == 4)
   returnStatus(this, this.status);
 }
 client.open("HEAD", address);
 client.send();
}

fetchStatus("/");

Однако это будет работать только для URL-адресов в том же домене, что и текущий URL-адрес. Вы хотите иметь возможность выполнять внешние службы? Если это так, вы можете создать простой script на сервере, который выполняет вашу работу за вас, и использовать javascript для его вызова.

Ответ 4

Если он находится в том же домене, вы можете сделать запрос главы с объектом xmlhttprequest [ajax] и проверить код состояния.

Если он находится в другом домене, сделайте xmlhttprequest на сервере и попросите его позвонить, если он установлен.

Ответ 5

Почему бы просто не создать пользовательский обработчик 404 на веб-сервере? это, вероятно, более "хороший медведь" для этого.

Ответ 6

Если вы счастливы использовать jQuery, вы можете сделать что-то вроде этого. Когда загрузка страницы вызывает аякс-вызов для каждой ссылки. Затем просто замените href всех ссылок, которые не работают.

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 
<script type="text/javascript">
<!--

$.fn.checkPageExists = function(defaultUrl){

    $.each(this, function(){

        var $link = $(this);

        $.ajax({
            url: $link.attr("href"),
            error: function(){
                $link.attr("href", defaultUrl);
            }
        });
    });
};

$(document).ready(function(){
    $("a").checkPageExists("default.html");
});
//-->
</script> 

Ответ 7

$.ajax({
        url: "http://something/whatever.docx",
        method: "HEAD",
        statusCode: {
            404: function () {
                alert('not found');
            },
            200: function() {
            alert("foundfile exists");
        }
        }
    });

Ответ 8

Другой способ сделать это - с PHP.

Вы можете добавить

<?php
if (file_exists('/index.php')) 
{ 
$url = '/index.php';
} else {
$url = '/notindex.php';
}
?>

И затем

<a href="<?php echo $url; ?>Link</a>