Как я могу обнаружить, является ли браузер блокирует новую вкладку или всплывающее окно при использовании window.open` сHtml

Программисты Html
Ответить
Anonymous
 Как я могу обнаружить, является ли браузер блокирует новую вкладку или всплывающее окно при использовании window.open` с

Сообщение Anonymous »

Как предложено в вопросе Как я могу обнаружить, если браузер блокирует всплывающее окно?

Код: Выделить всё

window.open("https://example.com/", "_blank", "")
< /code>
можно использовать для определения того, было ли заблокировано всплывающее окно; Как указано в MDN < /p>

null
возвращается, если браузер не может открыть новый контекст просмотра, например, потому что он был заблокирован всплывающим блокатором браузера. Делайте, когда ваш проект предназначен для производства. NOOPener предлагается в вопросе windows.open Но блокировать использование window.opener (2016) для решения проблемы безопасности.
Итак, как вы все еще можно определить, если всплывающее окно (например, открытие новой вкладки).

Код: Выделить всё

window.open("https://example.com/", "_blank", "noopener")`
< /code>
Учитывая, что он всегда возвращает null < /code>?

 (тестируется в Chrome и Firefox, год 2025) < /sub> < /p>
Документация MDN не охватывает этот случай, поэтому я боюсь, что это может быть ошибка /дизайн. Уточните ожидаемый вариант использования, для того, чтобы функциональность веб-приложения было типично, если какие-либо попытки перемещаться с пользователем на другую страницу/домен. Критические части пользовательского потока могут потребовать, чтобы разработчики справились с любой неудачей, отображая предупреждение пользователю и обучая их, как разрешить всплывающие окна для текущего сайта в их браузере. /> [*]  Последний обновленный ответ в  [b]  2018  [/b] , принятый в: Как я могу обнаружить, блокирует ли браузер всплывающее окно? window.opener


Workaround 1 - Prevent Popup Blocking:
This answer suggests a workaround, similar to what an the article Overcoming popup blocking issues (2023) also describes:
function dynamicallyCreateAnchorAndNavigate(url) {
let a = document.createElement('a');
a.href = url;
a.target = "_blank"
// Note: target="_blank" implies rel="noopener" behavior as per https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#browser_compatibility
a.rel = "noopener"
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
Не используя window.open API, но вместо этого создавая временный якорь для использования его Click API, мы можем избежать некоторых всплывающих блокаторов. Если это так, я думаю, что это указывает на халатность реализаций браузеров всплывающих блокаторов. Я приветствую любые взносы/комментарии, чтобы обновить эти утверждения, чтобы отразить текущую ситуацию. Например, функция Popup из WindowFeatures , то есть «минимальное всплывающее окно», вероятно, нельзя достичь через .
обходной путь 2 - перенаправить из безопасного домена:
Мы могли бы открыть новую страницу на одном и том же доменем, что мы не используем no ash ase as as as as as as as as are as as as are is as as are is as as are is as as as as as as as as as as as as as as as as as as as as as as as are is as ke as kin op in as kno op. Избегайте нарушения UX) может выполнить перенаправление, используя , который также требует обходного пути от вопроса

Код: Выделить всё

location.href
нарушает кнопку «Назад», если не используется settimeout () (2010):

Код: Выделить всё

setTimeout(() => window.location.href="https://example.com/", 0);
< /code>
 Возможный ответ с использованием Window API: < /h3>
Этот ответ от @t3-rry предлагает открыть пустую страницу, удаление ссылки на открытие, а затем перенаправление новой страницы.const newWindow = window.open();
newWindow.opener = null;
newWindow.location = "https://example.com/";
Это может вызвать небольшой недостаток замедления процесса, так как на мгновение Abstic: Blank в адресную строку мигает. Также см. Комментарии; При использовании в Safari могут быть и другие проблемы. PrettyPrint-Override ">

Код: Выделить всё

const popupTestWindow = window.open();
const isPopupBlocked = !popupTestWindow || popupTestWindow.closed || typeof popupTestWindow.closed == 'undefined';
if (!isPopupBlocked) {
popupTestWindow.close();
const newWindow = window.open("https://example.com/", '_blank', 'noopener');
// Retry checking a blocked popup if needed
}
Это, однако, приводит к тому, что страница дважды мигает, поскольку новая вкладка снова закрывается и создается, вызывая более разрушительный UX.


Подробнее здесь: https://stackoverflow.com/questions/797 ... ing-window
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Html»