2016-06-07 1 views
2

проблема, с которой я столкнулся, описан здесь.
window.open behaviour in chrome tabs/windowsс использованием modernizr для определения поддержки нескольких окон

, где вы не можете открыть несколько окон через javascript в chrome.

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

есть способ использовать modernizr или что-то помимо браузера, нюхать, что я могу определить, поддерживается ли поведение?

ответ

0

Эта возможность открывать несколько окон различно между браузером и даже конфигурацией браузера. Так что никогда не предполагайте, что вы сможете открыть несколько всплывающих окон, возможно, сможете, но об испытаниях вы можете узнать только, это очень легко проверить.

Чтобы проверить, удалось ли открыть всплывающее окно, проверьте возвращаемое значение.

var popupWindow = window.open('http://www.google.com/'); 
if (!popupWindow) { 
    console.log('the window did not open'); 
    // do other stuff 
} 

Если окно открыто возвращаемое значение будет Window объект. Если окно не открывается, возвращаемое значение будет ложным, это точное возвращаемое значение может варьироваться от блокировщика всплывающих окон до всплывающего блокатора, но обычно вы можете считать значение ложным, если окно не открывается; что означает undefined или null.
Таким образом, очень легко вызвать альтернативный метод, если окно не открывается.

Для этого вам не нужен модернизм или какие-либо плагины, такое поведение при возврате объекта Window одинаково во всех браузерах.

MDN ссылка:
https://developer.mozilla.org/en-US/docs/Web/API/Window/open

Firefox и Safari, кажется, поддерживает открытие нескольких окон по умолчанию. Chrome, однако, заблокирует второе окно и покажет небольшое «всплывающее» заблокированное сообщение. Кроме того, Chrome также заблокирует открывающиеся окна, которые не происходят из непосредственных действий пользователей; что означает щелчок или нажатие клавиши.

0

Ничто, как modernizr или любой пользовательский код, не даст вам никаких признаков обнаружения объектов. Основная причина заключается в том, что все основные браузеры требуют какого-либо действия пользователя, чтобы открыть новое окно программно - обычно щелчок. Поэтому создание функции обнаружения не может быть и речи.

Это интересный вопрос и тот, где мышление с точки зрения «прогрессивного улучшения» может помочь вам найти хорошее решение.

Во-первых, предположим, что вы не можете открыть несколько окон в любым браузером. Что бы вы сделали? Покажите список ссылок, которые вы предложили. Добавляя что-то вроде target="_blank" к каждой ссылке, теперь у нас есть работающее приложение без какого-либо JavaScript (или, если пользователь имеет JavaScript выключено):

<section id="links-wrap"> 
    <a href="/page-A.html" target="_blank" /> 
    <a href="/page-B.html" target="_blank" /> 
</section> 

Эти базовая функциональность будет работать на каждом браузере когда-либо сделанный - ваш Treo посетители будут любить вас. Однако этот опыт не идеален, потому что ссылки, скорее всего, откроют новые вкладки вместо новых окон. Поэтому давайте использовать JavaScript для открытия нового окна всякий раз, когда нажимается ссылка.Позволяет также скрыть каждую ссылку после того, как она нажата и положение каждого окна таким образом, чтобы они не дублировали:

function openWindowFromLink (link, idx) { 
    var top = idx % 2 * 600; 
    var left = Math.floor(idx/2) * 600; 
    var win = window.open(link.href, 'Window '+ top +'x'+ left, 'width=600,height=600,top='+ top +',left='+ left); 
    if (win) { 
    link.style.display = "none"; 
    } 
    return win; 
} 

function handleLinkClick(ev) { 
    ev.preventDefault(); 
    var link = ev.target; 
    var idx = 0; 
    var prev = link.previousSibling; 
    while (prev) { 
    if (prev.nodeType === 1) { 
     idx++; 
    } 
    prev = prev.previousSibling; 
    } 
    openWindowFromLink(link, idx); 
} 

document.getElementById('links-wrap').addEventListener('click', handleLinkClick); 

Теперь приходит трудная часть: как мы можем открыть несколько окон одновременно. Как известно, Chrome позволяет открывать только одно окно для каждого пользователя. В то время как другие браузеры могут не иметь такого же ограничения, они могут добавить его в будущем (я действительно удивлен, что они не все имеют это ограничение прямо сейчас). Итак, допустим, что все браузеров имеют то же ограничение, что и Chrome. Пользователи не хотят каждый раз щелкнуть каждую ссылку - так что дайте им цель щелчка, чтобы они могли быстро щелкнуть, чтобы открыть все окна. Творческая формулировка уменьшит досаду этой задачи.

<div id="rapid-click-box"> 
    Click me really fast and see what happens! 
</div> 

... и некоторые JavaScript:

var clickBox = document.getElementById('rapid-click-box'); 
var clickCount = 0; 
clickBox.addEventListener('click', function handleRapidClick (ev) { 
    var link = links[clickCount]; 
    if (link.style.display !== 'none') { 
     openWindowFromLink(link, clickCount); 
    } 

    if (++clickCount === links.length) { 
     clickBox.removeEventListener('click', handleRapidClick); 
     clickBox.style.display = 'none'; 
    } 
}); 

Наконец, давайте заботиться о тех, браузер, который позволяет несколько окон, которые будут открыты одновременно. Нам все еще нужен пользователь, чтобы позвонить, чтобы позвонить window.open - так что давайте начнем креатив и посмотрим, как мы можем заставить пользователя щелкнуть что-нибудь. Хитро сформулировано приветственное сообщение должно хватить:

<div id="welcome-message" style="display:none"> 
    <h1>Hey, welcome to my site. Are you a human?</h1> 
    <button>Yes</button> 
</div> 

<script> 
// show the welcome message immediately if JS is enabled 
document.getElementById('welcome-message').style.display = 'block'; 
</script> 

... и еще раз, немного JavaScript:

var button = document.getElementsByTagName('button')[0]; 
button.addEventListener('click', function handleYesClick (ev) { 
    ev.preventDefault(); 
    button.removeEventListener('click', handleYesClick); 
    document.getElementById('welcome-message').style.display = 'none'; 

    for (var i = 0, l = links.length; i < l; i++) { 
     if (!openWindowFromLink(links[i], i)) { 
     break; 
     } 
    } 

    if (i === links.length) { 
     clickBox.style.display = 'none'; 
    } 
}); 

И скрипку, чтобы показать все это в действии:

https://jsfiddle.net/q8x5pqsw/

Смежные вопросы