utilisation de javascript pour détecter si l'url existe avant l'affichage dans iframe

j'utilise javascript pour passer une url dynamique à iframe src. mais parfois, l'url n'existe pas, comment pourrais-je détecter la non-existent url à l'avance, de sorte que je peux me cacher l'iframe qui avec l'erreur 404.

22
demandé sur L84 2012-06-07 10:43:29

5 réponses

à cause de ma mauvaise réputation, Je ne pouvais pas commenter la réponse de Derek. J'ai essayé ce code comme il est et il ne fonctionne pas bien. Il y a trois questions sur le code Derek.

  1. la première est que le temps pour async envoyer la requête et changer sa propriété 'status' est plus lent que pour exécuter l'expression suivante - if(request.statut === "404"). Donc la demande.le statut finira par, en raison de la bande internet, rester sur le statut 0 (zéro), et il le code ci-dessous ne sera pas respecté si. Pour corriger ce qui est facile: changez 'true' en 'false' sur la méthode ouverte de la requête ajax. Cela provoquera un blocage bref (ou non) de votre code (dû à un appel synchrone), mais modifiera le statut de la requête avant d'atteindre le test de if.

  2. le second est que le statut est un entier. En utilisant '= = = ' JavaScript comparison operator vous essayez de comparer si l'objet latéral gauche est identique à un sur la droite côté. Pour que cela fonctionne, il y a deux façons:

    • supprimer les guillemets qui entourent 404, ce qui en fait un entier;
    • utilisez l'opérateur javascript '= = ' pour tester si les deux objets sont similaires.
  3. le troisième est que L'objet XMLHttpRequest ne fonctionne que sur les nouveaux navigateurs (Firefox, Chrome et IE7+). Si vous voulez que l'extrait de travailler sur tous les navigateurs que vous avez à faire la façon dont W3Schools suggère: w3schools ajax

le code qui a vraiment fonctionné pour moi était:

var request;
if(window.XMLHttpRequest)
    request = new XMLHttpRequest();
else
    request = new ActiveXObject("Microsoft.XMLHTTP");
request.open('GET', 'http://www.mozilla.org', false);
request.send(); // there will be a 'pause' here until the response to come.
// the object request will be actually modified
if (request.status === 404) {
    alert("The page you are trying to reach is not available.");
}
43
répondu GPrimola 2017-02-21 21:18:03

utilisez un XHR et voyez s'il vous répond a 404 ou non.

var request = new XMLHttpRequest();  
request.open('GET', 'http://www.mozilla.org', true);
request.onreadystatechange = function(){
    if (request.readyState === 4){
        if (request.status === 404) {  
            alert("Oh no, it does not exist!");
        }  
    }
};
request.send();

mais notez qu'il ne fonctionnera que sur la même origine. Pour un autre hôte, vous aurez à utiliser un langage côté serveur de le faire, que vous devrez trouver par vous-même.

22
répondu Derek 朕會功夫 2017-05-23 11:47:17

vous pouvez tester l'url via AJAX et lire le code d'état - c'est-à-dire si L'URL est dans le même domaine.

si c'est un domaine distant, vous pouvez avoir un script serveur sur votre propre domaine consulter une URL distante.

2
répondu Joseph 2017-05-23 10:31:15

j'ai trouvé que ça marchait dans mon scénario.

The jqXHR.success (), jqXHR.erreur(), et jqXHR.les méthodes de callback complete () introduites dans jQuery 1.5 sont dépréciées à partir de jQuery 1.8. Pour préparer votre code pour leur suppression éventuelle, utilisez jqXHR.done (), jqXHR.fail(), et jqXHR.toujours() à la place.

$.get("urlToCheck.com").done(function () {
  alert("success");
}).fail(function () {
   alert("failed.");
});
2
répondu fragmint 2014-12-03 09:37:53

vous pouvez essayer et faire un simple GET sur la page, si vous obtenez un 200 en arrière, cela signifie que la page existe. Essayez ceci (en utilisant jQuery), la fonction est la fonction de rappel de succès sur un chargement de page réussi. Notez que cela ne fonctionnera que sur les sites de votre domaine pour empêcher XSS. D'autres domaines devront être gérés côté serveur

$.get(
   yourURL,
   function(data, textStatus, jqXHR) {
      //load the iframe here...
   }
);
1
répondu Matt Dodge 2012-06-07 06:50:23