亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有關于新頁面彈窗的問題

有關于新頁面彈窗的問題

xue5hen 2018-07-20 13:38:34
1、需求????????網站內有一個table做的客戶列表,其中一列有個“查看詳情”的按鈕,點擊后會向服務器發起一個請求(參數為該行客戶的id信息),然后根據返回值判斷是否打開一個新頁面(返回true則打開新頁;返回為false則toast提示“無法查看!”)。????????這個需求其實蠻常見,實現似乎也很簡單,但還是遇到一些值得一提的情況。2、方案1)方案一:window.openqueryUserViewAuth(params).then((res)?=>?{ ????If?(res.data.isSuccess)?{ ????????Window.open('/newPage') ????}?else?{...} })????????但是當點擊按鈕觸發彈窗時,被瀏覽器攔截了,項目負責人認為這個體驗是不好的,所以需要考慮如何解決這個問題。????????在此之前,先提一下瀏覽器攔截彈窗的原因,網上搜了下,說是因為“ajax回調中的上下文已不是用戶行為了,從安全角度出發,瀏覽器進行了攔截”,這意味著“在函數內部新建a標簽再去觸發a標簽的click事件”也是不可行的。2)方案二:控制a標簽的href跳轉????????于是有提議說是否可以“直接使用a標簽替代table中的按鈕,然后當用戶點擊時根據ajax的返回結果去‘阻止/放行’a標簽的href行為”。這個想法聽起來不太能做到,實際也確實沒成功,不過測試中有點兒小發現,雖然目測沒什么實用價值,但還是忍不住提一嘴:????????①?首先,如果要阻止a標簽的href跳轉,常見的伎倆如下;<a?href="newPage.html"?onclick="return?false;">測試</a>????????②?但這顯然不滿足此次的需求,得讓返回值是可控的,所以嘗試變形;<a?href="newPage.html"?onmousedown="this.x=fn();"?onclick="return?this.x;">測試</a> <script> ????function?fn()?{return?false} </script>? ? ? ? ③?上述②的變形是可以的,但那代碼都是同步的,所以→再變;<a?href="newPage.html"?onmousedown="this.x=fn();"?onclick="return?this.x;">測試</a> <script> ????function?fn()?{ ????????setTimeout(function(){return?false},0) ????} </script>? ? ? ?OK,到這里KO了,見證奇跡的時刻并未降臨。3)方案三:????????苦思無望,只好再到搜索引擎上找找思路,(其實就是解釋彈窗為什么被攔截的那帖子),提到了一個思路“在click事件中先打開一個空白的新窗口,然后再進行ajax請求,請求后再去更改新窗口的url”。這方法不錯,但可惜并不適用于此次的項目需求,畢竟如果請求發現res.data.isSuccess為false(即不應該打開新頁面),“這時再用close去關”并不是一個好的用戶體驗,何況如果請求返回過慢,那個新窗口會以空白之身杵在那里很久,也不好。4)結束????????后來,項目負責人提出暫通過后端來解決,方案如下:前端直接用a標簽做按鈕,在href上拼接上get請求的地址(即上述的ajax請求),當用戶點擊時觸發請求,然后再由后端做302重定向。3、求助????????各位如果有什么好對策,希望能點撥一下。
查看完整描述

1 回答

已采納
?
慕勒0069038

TA貢獻143條經驗 獲得超39個贊

很抱歉這幾天都沒有回復, 趕項目= = ,今天抽空看了一眼,給你寫了一個 你試試

<!DOCTYPE?html>
<html?lang="en">
<head>
??<meta?charset="UTF-8">
??<title>Title</title>
??<script?src="jquery/js/jquery.min.js"></script>
??<script>
?????$(document).ready(function?(e)?{

????????$('span').bind('click',function(e,canjump){
???????????console.log(1);
??????????if(!canjump){
?????????????e.preventDefault();
?????????????$('span').trigger("myclick");
?????????????}
????????});
????????$('span').bind('myclick',function(e){
???????????async?function?a()?{
??????????????try{
?????????????????return?await?new?Promise((resolve,?reject)?=>?{
????????????????????setTimeout(function?()?{
???????????????????????resolve(true);
????????????????????},?1000);
?????????????????});
??????????????}catch?(e){
?????????????????return?await?Promise.reject(false);
??????????????}
???????????}
???????????a().then(function?(canjump)?{
??????????????console.log(13);
??????????????$('span').trigger("click",[true]);
???????????}).catch(function?(err)?{
??????????????console.log(err);
???????????})
????????});
?????});
??</script>
</head>
<body>
??<a?href="test1.html"?><span>測試</span></a>
</body>
</html>


查看完整回答
1 反對 回復 2018-07-24
?
慕勒0069038

TA貢獻143條經驗 獲得超39個贊

方案2? 的 可以參考下 es6(es7) 的 async、await?

?方案2 你的不成功的原因是 應該是fn() 內部的setTimeout 相當于異步方法, 調用fn的時候 沒有return false 出來,

其實有個方法, 就是 成功后彈個確認框(layer就行) ,里面說 即將前往新的頁面 ,給一個確定和取消, 確定就window.open(), 這樣不就不會被攔截了么

查看完整回答
反對 回復 2018-07-20
  • xue5hen
    xue5hen
    謝謝,我之后再去查查async|await的用法,之前實際也試過,但我對這玩意兒一直用不好,當時測試沒成功就撇一邊了,因為怕是自己用的有問題就沒提。 至于您提到的后一種方法,網上那個文章里也提到了,因為會多一步用戶確認,所以沒考慮它。
  • xue5hen
    xue5hen
    我剛又試了試async|await,不知道用法是否正確,現在還達不到目的,麻煩再幫著看下,給改改 http://jsrun.net/69gKp/edit
  • 1 回答
  • 0 關注
  • 1100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號