javascript - window.location.href ne saute pas immédiatement dans la méthode. Existe-t-il un moyen de le résoudre ?
欧阳克
欧阳克 2017-06-26 10:58:15
0
7
2193

Question : Pourquoi n'est-il pas exécuté location.href = "../exit.html";, 而是执行了 window.location.href = 'http://www.baidu.com'; ?

Existe-t-il un moyen d'exécuter la méthode getData(), 如果获取数据失败,则跳转到 ../exit.html, 不再执行 gourl(); ?

Supplément : ajax里面的 async: false 是同步请求!!!, ce n'est qu'une simple démo. En fait, il peut y avoir beaucoup de logique derrière la méthode getData(), mais si getData() ne parvient pas à obtenir des données, le programme ne sera pas autorisé à exécuter d'autres méthodes, et d'autres méthodes peuvent ne pas être présentes dans le même fichier.


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
</head>

<body>
    <p>
        <h2>我是测试页面,看我是否发生跳转</h2></p>
    <script src="https://cdn.bootcss.com/jquery/1.9.0/jquery.min.js"></script>
    <script type="text/javascript">
    $(function() {
        getData();
        gourl();
    });

    function getData() {
        var is_success = false;
        $.ajax({
            type: "GET",
            url: "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=bug&bk_length=600",
            data: "",
            dataType: "json",
            async: false,
            success: function(data) {
                if (data.status == 200) {
                    is_success = true;
                } else {
                    is_success = false;
                }
            }
        });
        if (!is_success) {
            location.href = "../exit.html";
        }
    }

    function gourl() {
        console.log('我被执行了');
        window.location.href = 'http://www.baidu.com';
    }
    </script>
</body>

</html>

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

répondre à tous(7)
女神的闺蜜爱上我

Ensuite, vous pouvez rappeler gourl après le succès de la méthode getData pour effectuer le traitement logique souhaité
De plus, je ne sais pas comment juger spécifiquement votre is_success car il y a $ajax et une erreur correspondante

代言

Votre code équivaut à exécuter les deux phrases suivantes :

location.href = '../exit.html';
location.href = 'http://www.baidu.com';

Lorsque ces deux phrases sont exécutées en continu, elles passeront à l'adresse suivante

Je suppose qu'il faut du temps au navigateur pour accéder au premier, mais avant qu'il ne réussisse, le deuxième saut revient, donc j'abandonne le premier saut et j'exécute le deuxième saut, comme si j'entrais rapidement l'adresse deux fois dans le URL Idem.

为情所困

La fonction

gourl() ne peut pas être appelée devant, mais doit être placée au milieu de la logique Ajax, et ajouter else{gourl();}
après la logique if :

if (!is_success) {
        location.href = "../exit.html";
    }else {
        gourl();
    }
学习ing

Le code du questionneur peut être compris comme suit :

    <script type="text/javascript">
    $(function() {
        getData();
    });

    function getData() {
        var is_success = false;
        $.ajax({
            type: "GET",
            url: "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=bug&bk_length=600",
            data: "",
            dataType: "json",
            async: false,
            success: function(data) {
                if (data.status == 200) {
                    is_success = true;
                } else {
                    is_success = false;
                }
            },
            error: function() { ... }
        });
        if (!is_success) {
            location.href = "../exit.html";
        }
        console.log('我被执行了');
        window.location.href = 'http://www.baidu.com';
    }
    </script>

Lorsqu'il y a deux location.hrefs consécutifs dans le code, le saut suivant sera exécuté. Le sujet de cette question peut l'essayer lui-même.

De plus, comme ajax est asynchrone, le sujet doit également écrire if(!is_success)写到ajax中的error中去,或者写到success中的else判断中,否则无论ajax是否成功,都会跳转。gourl() dans le succès.

De plus, des erreurs inter-domaines devraient se produire si ajax est utilisé directement comme ceci. Il est recommandé d'utiliser un proxy ou d'autres méthodes pour résoudre les problèmes inter-domaines.

ringa_lee

Code de téléphone portable, c'est ce que tu veux dire ?

$(function() {
    var dtd = $.Deferred();
    dtd
      .done(function(){
          console.log('我被执行了');
          window.location.href = 'http://www.baidu.com';
      })
      .fail(function(){
          console.log('我被抛弃了');
          window.location.href = "../exit.html";
      });
    $.get("http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=bug&bk_length=600", "json")
      .done(function(data) {
          if (data.status == 200) {
              dfd.resolve();
          } else {
              dtd.reject();
          }
      });
});

Utilisant principalement les promesses de jQ, toutes écrites de manière asynchrone, tous les rappels réussis d'ajax sont placés dans le done de Deferred (s'il y en a plusieurs, ils peuvent également être écrits sous forme de tableaux), puis donnent simplement un statut directement dans le done d'ajax.

某草草

Puisque getDatagourl有执行的关系,要么把gourl est placé en jugement de rappel, cela peut convenir à une utilisation asynchrone.
Si c'est une synchronisation avec le sujet, alors ça va

    $(function() {
        getData();
        gourl();
    });

Puis-je contrôler Gourl directement ici pour l'exécuter ?

三叔

Il se peut qu'il y ait un problème avec la logique de votre code. Ajax est asynchrone. gourl(); Cette fonction ne doit pas être appelée à cet endroit. Il peut être appelé lors du rappel de réussite ou d’échec de la requête ajax.
Au vu de votre demande, elle devrait être appelée avec succès.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!