Как проверить, существует ли страница с помощью Javascript
<a href="#" onclick="location.href='http://www.example.com'; return false;">Hello</a>
когда я нажимаю ссылку, он должен проверить, существует ли страница. Если он существует, он переходит на эту страницу (www.example.com), но если страница не существует, она перенаправляется на другой URL.
Ответы
Ответ 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>