Недавно, когда я работал над проектом, я столкнулся с ситуацией, когда использование window.open было перехвачено браузером, что привело людей в крайнее уныние. Хотя страницу можно выпустить в собственной среде, для пользователей пользователями быть не может. необходимо пройти перехват. Более того, когда происходит перехват, многие новички понятия не имеют, что происходит, и не знают, где посмотреть перехваченную страницу. Это действительно грустно~~.
Кроме того, можно обнаружить, что когда window.open вызывает событие для пользователя или загружается, оно не будет перехвачено. Как только код всплывающего окна будет перемещен в ajax или часть асинхронного кода, он будет перехвачен немедленно. .
Анализ причин и углубленное исследованиеКогда браузер обнаруживает новое всплывающее окно, созданное в результате непользовательских операций, он блокирует его. Потому что браузер думает, что это не та страница, которую хочет видеть пользователь.
Например, если выполнить непосредственно в js, следующий код:
js-код:
//Открываем страницу напрямую window.open('//www.baidu.com', '_blank');
Браузер ie8 Chrome 40 Firefox 34 Opera 27 Safari 5.1.7
Следует ли запретить появление NNYYY и для следующего кода:
js-код:
document.body.addEventListener('click', function() { window.open('//www.baidu.com', '_blank'); });
Все браузеры не будут блокировать его.
Подводя итог, каждый браузер по-разному оценивает время перехвата, и ответ на код, помещенный в обратный вызов ajax, различен, поэтому я не буду здесь вдаваться в подробности. Однако программисты не хотят, чтобы всплывающее окно в нашем коде перехватывалось браузером.
Решение:1. Вместо этого используйте тег
Учитывая следующую функцию, привязка этой функции к обратному вызову события щелчка может избежать перехвата всплывающих окон большинством браузеров:
js-код:
function newWin(url, id) { var a = document.createElement('a'); a.setAttribute('href', url); a.setAttribute('target', '_blank'); ', id); // Предотвратить повторное добавление if(!document.getElementById(id)) document.body.appendChild(a); a.click();}
2. Используйте метод отправки формы, чтобы открыть страницу.
Этот метод требует создания from, а затем запуска отправки формы с помощью js-кода и отправки формы на новую страницу. Код длинный, поэтому я не буду его здесь писать. Все знают, что есть такой. решение.
Обратите внимание, что два вышеуказанных метода не подходят для размещения в функции обратного вызова ajax. Если они помещены в функцию обратного вызова, они все равно будут перехвачены браузером.
3. Окончательное решение — сначала открыть всплывающее окно, а затем перенаправить
Третье решение на самом деле является обходным путем. Основная идея заключается в следующем: сначала откройте страницу с помощью щелчков пользователя, а затем перенаправьте страницу. Пример кода выглядит следующим образом.
js-код:
xx.addEventListener('click', function () { // Открываем страницу, лучше всего использовать здесь страницу подсказки var newWin = window.open('loading page'); ajax().done(function() { // Повторить прямую ссылку на целевую страницу newWin.location.href = 'target url' });
Вышеупомянутый метод фактически открывает два адреса, поэтому при открытии первого адреса рекомендуется выдать сообщение, похожее на «Текущая страница загружается, пожалуйста, подождите». . простая страница подсказки, которая позволяет избежать повторного открытия реальной целевой страницы и позволяет пользователям заметить перенаправление страницы.
Решение второе:
<a href=javascript:; onclick=dialog();>Нажмите всплывающее окно</a><script>function Dialog(){ $.ajax({ url: 'url', type: 'POST', dataType: 'json', async: false, // Это должно быть определено как синхронные данные: {param1: 'value1'}, Success: function(data){ window.open(data.url, '_blank'); //Инициируем a. всплывающее окно} })} </скрипт>
Недостатки этого метода:
Фактический тест может решить проблему перехвата большинства браузеров, но не может решить проблему перехвата программного обеспечения безопасности (360 не перехватит, но QQ Butler сможет).
Выше приведено все содержание этой статьи. Я надеюсь, что она будет полезна для изучения всеми. Я также надеюсь, что все поддержат сеть VeVb Wulin.