【問題集】window.Openブロックされた問題の使用

2243 ワード

必要:
   
インタフェースを呼び出すと、応答内容が新しいtabページに表示されます.
実現構想:
   
応答コールバックでwindowを通過する.Open()メソッドで、新しいtabを開きます.
質問:
   
ブラウザがブロックされているため、新しいtabが開けません.
シナリオ:
   
1、ネットで主な解決策を探した.
クリックイベント:
a、aラベルを作成し、clickイベントをトリガーする.
  .     var a = document.createElement("a");    
        a.setAttribute("href", url);    
        a.setAttribute("target", "_blank");    
        document.body.appendChild(a);    
        a.click();

     
b、formフォームを作成し、submitをトリガーする
       var f=document.createElement("form");
        f.setAttribute("action" , url );
        f.setAttribute("method" , 'get' );
        f.setAttribute("target" , '_black' );
        document.body.appendChild(f)
        f.submit();

この2つのスキームは、ブラウザがユーザの操作だと判断するため、遅延せずにtabを再開することができる.
しかし、私がこのコードを1 s実行に遅延すると、tabはブラウザにブロックされます.~~ブラウザは広告だと思っているかもしれませんが...
httpリクエストには遅延があるに違いないので、このスキームは実行できません.そこでシナリオ2があります.
2、イベントトリガをクリックするときにwindowを呼び出す.Open()メソッドは、新しいtabを開き、応答コールバックで、新しいtabを開くhrefを設定します.
            var new_window = null; 
            $scope.save= function () {
                new_window = $window.open();
                commonService.sendRequest(Api.choosePayChannel, 'POST', {
                    orderNo: $scope.orderNo,
                    payType: $scope.currentPlatform
                }).then(function (resp) {
                    var respData = resp.data;
                    if (respData) {
                        if (respData.type == 'html') { 
                            new_window.document.write(respData.result);

                        } else if (respData.type == 'img') {
                            var url = $state.href('smsPay', {codeUrl: respData.result, orderId: $scope.orderNo});
                             new_window.location.href = window.location.origin+window.location.pathname+url;
                        }
                    }
                }, function (error) {
                    new_window.close();
                    commonService.showErrorTip(error);
                });
            };