賞金將在 4 天后到期。此問題的答案有資格獲得 50聲望賞金。 Sensanaty希望引起對這個問題的更多關注。
在涉及用戶身份驗證時,我使用的應用程式與一些具有一些嚴格安全策略的平臺集成,因此我們這邊的身份驗證也必須進行一些不同的處理。這里的細節不是很重要。
我現在正在開發一個新功能,用戶可以從串列中打開一些專案,但從用戶體驗的角度來看,在新選項卡中打開這些專案最有意義,因為用戶會希望在一次,而無需導航回串列并再次在其中找到它們的位置。
所以為了讓它作業,我們的 API 有一個redirects處理身份驗證的端點。實作細節并不重要,重要的是知道這個端點將接收一個應該導航到的 URL(從我們的 UI 提供),并且它會回傳一個帶有令牌的重定向 URL。
因此,我使用了以下函式,當用戶單擊按鈕時呼叫該函式
async function openInNewTab() {
// $ajax is an axios instance that calls the endpoint
const { url } = await $ajax.post('/redirects', {
data: {
url: "myurl.com/route/to/go/to",
//...
}
});
window.open(url)
}
如您所見,它非常簡單,它從我們的 API 獲取重定向 URL,并嘗試在新選項卡中打開該 URL。這在 Chrome 中有效,但在 Firefox 或 Safari 中無效,提示用戶彈出視窗被阻止。
我很清楚瀏覽器有許多關于彈出視窗以及何時被阻止的規則,但是在這種情況下,此操作是由用戶通過單擊按鈕進行互動來啟動的,唯一的問題是被呼叫的函式是異步的。
有什么辦法可以在 Firefox 和 Safari 中進行這項作業?如果沒有異步功能,該功能在實際網路速度下根本無法正常作業,并且根據我們的應用程式的作業方式,我們無法target="_blank"使用鏈接中的類似內容來規避重定向 URL,這將無法正確進行身份驗證。
uj5u.com熱心網友回復:
我最終在這里找到了兩種潛在的解決方法。
它們都非常相似,但是從我的測驗來看,Safari 在將事件決議為彈出視窗時似乎是最嚴格的。
適用于所有主要瀏覽器(基于 Chromium 的瀏覽器、Firefox 和 Safari)的版本,但感覺有點 hacky。
在這里找到這個:https ://stackoverflow.com/a/70463940/8610114
const { url } = await $ajax.post('/redirects', {
data: {
url: "myurl.com/route/to/go/to",
//...
}
});
setTimeout(() => {
window.open(url, "_blank");
});
還有另一種解決方案,雖然這個解決方案似乎在 Safari 中無法始終如一地作業,因為它有時會被阻止(似乎是隨機的)
const newWindow = window.open('about:blank', '_blank');
const { url } = await $ajax.post('/redirects', {
data: {
url: "myurl.com/route/to/go/to",
//...
}
});
newWindow.location.href = url;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521741.html
上一篇:如何在MASM中跨段填充塊?
