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、求助????????各位如果有什么好對策,希望能點撥一下。
有關于新頁面彈窗的問題
xue5hen
2018-07-20 13:38:34