[英]Feature detect opening in a new window/tab(target=_blank) with JavaScript
根據我的研究:
我需要檢測此功能何時不可用。 不可能?
附加說明
我正在嘗試檢測是否可以通過target = _blank打開一個新窗口。 例如,UIWebView [應用內瀏覽器]可以阻止target = _blank按預期工作[它只是在同一個窗口而不是新窗口中打開]。 我需要一個解決方案來指示由於瀏覽器限制而無法打開新窗口,例如在UIWebView案例中。 不幸的是,彈出窗口阻止程序阻止檢查這樣的功能,因為它們永遠不允許打開新窗口而無需繞過用戶輸入(即點擊)。
你不會有100%可靠的東西。
只需嘗試使用JS打開一個新窗口就會觸發彈出窗口阻止程序; 使它成為一種不可靠的方法來測試是否可以打開一個新窗口。
你是對的,絕對不可靠... window.open()
被阻止(即使有一個像window.open(url, '_blank');window.focus();
的技巧window.open(url, '_blank');window.focus();
), click()
也被阻止(在包含target =“_ blank”的鏈接上,就像evt = document.createEvent("MouseEvents");evt.initEvent("click", true, true);
...
但無論如何:如果WebView不允許在新選項卡中打開鏈接,那么它將正常工作。 但是,正如您所暗示的,Webview可能會對其進行授權。 在這種情況下,您將不知道您是否在webview中。 很容易檢測新標簽中的開放鏈接是否最終以相同或不同的方式打開(可以在非顯示的iframe中以javascript進行測試),但如果在瀏覽器中打開鏈接,則無法知道(並設想用戶體驗javascript代碼,從應用程序中打開瀏覽器中的新選項卡...)。 正如Dave Alperovich所說,如果沒有嘗試過,你無法提前知道會被阻擋的是什么。 所以你不應該看那邊。
沒有可靠的功能或行為區分Webview和Web瀏覽器 。 在webview中,您可以獲得瀏覽器中的所有內容(cookies,WebStorage ...)。 用戶代理有其不完善之處,但在許多情況下都可以使用。 這里或這里有解釋來構建它。
根據OP請求我測試了它。 它有效。 如果彈出窗口阻止程序已啟用,我將捕獲它,因此我將獲得一個可靠的方法來知道它已啟用。 在這種情況下,我只是發送警報,但你可以做任何你想做的事情。
這是代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Testing Pop-up Blocker</title>
<script>
function openPopUp(urlToOpen) {
var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");
try {
popup_window.focus();
}
catch (e) {
alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
}
}
</script>
</head>
<body onload="openPopUp('http://www.google.com'); return false;">
<p>Testing Pop-up Blocker</p>
</body>
</html>
這是我得到的,因為彈出窗口阻止程序已啟用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.