Ответ 1
Все еще то же самое в версии 14.0.835.202 м в Windows 7; нашел другое обходное решение, не более элегантное, но по крайней мере позволит избежать потери данных на странице: показать предупреждение в окне, которое вы хотите сфокусировать.
Просто интересно, собирается ли Google Chrome поддерживать window.focus()
в какой-то момент. Когда я имею в виду поддержку, я имею в виду это работает. Призыв к этому не провалится, он просто ничего не делает. Все другие основные браузеры не имеют этой проблемы: FireFox, IE6-IE8 и Safari.
У меня есть класс на стороне клиента для управления окнами браузера. Когда я впервые создаю окно, окно фокусируется, но последующие попытки перенести фокус на окно не работают.
Из того, что я могу сказать, это, кажется, функция безопасности, чтобы избежать раздражающих всплывающих окон, и это не проблема WebKit, поскольку она работает в Safari.
Я знаю, что одна идея, которую кто-то выдвинул, состояла в том, чтобы закрыть окно, а затем снова открыть его, но это ужасное решение. Поиск в Google показывает, что я не единственный человек, разочарованный этим.
И чтобы быть на 100% понятным, я имею в виду новые окна, а не вкладки (вкладки не могут быть сфокусированы на том, что я прочитал), и все открываемые окна находятся в одном домене.
Какие-нибудь идеи, обходные пути помимо плохого, который я упомянул выше?
Об этом есть ошибка в проекте Chromium, проверьте ее здесь. Спасибо за публикацию, что Рич.
MyCompany = { UI: {} }; // Put this here if you want to test the code. I create these namespaces elsewhere in code.
MyCompany.UI.Window = new function() {
// Private fields
var that = this;
var windowHandles = {};
// Public Members
this.windowExists = function(windowTarget) {
return windowTarget && windowHandles[windowTarget] && !windowHandles[windowTarget].closed;
}
this.open = function(url, windowTarget, windowProperties) {
// See if we have a window handle and if it closed or not.
if (that.windowExists(windowTarget)) {
// We still have our window object so let check if the URLs is the same as the one we're trying to load.
var currentLocation = windowHandles[windowTarget].location;
if (
(
/^http(?:s?):/.test(url) && currentLocation.href !== url
)
||
(
// This check is required because the URL might be the same, but absolute,
// e.g. /Default.aspx ... instead of http://localhost/Default.aspx ...
!/^http(?:s?):/.test(url) &&
(currentLocation.pathname + currentLocation.search + currentLocation.hash) !== url
)
) {
// Not the same URL, so load the new one.
windowHandles[windowTarget].location = url;
}
// Give focus to the window. This works in IE 6/7/8, FireFox, Safari but not Chrome.
// Well in Chrome it works the first time, but subsequent focus attempts fail,. I believe this is a security feature in Chrome to avoid annoying popups.
windowHandles[windowTarget].focus();
}
else
{
// Need to do this so that tabbed browsers (pretty much all browsers except IE6) actually open a new window
// as opposed to a tab. By specifying at least one window property, we're guaranteed to have a new window created instead
// of a tab.
windowProperties = windowProperties || 'menubar=yes,location=yes,width=700, height=400, scrollbars=yes, resizable= yes';
windowTarget = windowTarget || "_blank";
// Create a new window.
var windowHandle = windowProperties ? window.open(url, windowTarget, windowProperties) : window.open(url, windowTarget);
if (null === windowHandle) {
alert("You have a popup blocker enabled. Please allow popups for " + location.protocol + "//" + location.host);
}
else {
if ("_blank" !== windowTarget) {
// Store the window handle for reuse if a handle was specified.
windowHandles[windowTarget] = windowHandle;
windowHandles[windowTarget].focus();
}
}
}
}
}
Все еще то же самое в версии 14.0.835.202 м в Windows 7; нашел другое обходное решение, не более элегантное, но по крайней мере позволит избежать потери данных на странице: показать предупреждение в окне, которое вы хотите сфокусировать.
Я боролся с этой проблемой. Мне нужна ссылка на другое окно, поэтому я выдавал:
otherWinRef = window.open("","OtherWindow");
Однако, когда я выдаю эту команду, браузер переключит фокус на OtherWindow. Я думал, что это можно решить, сделав это:
otherWinRef = window.open("","OtherWindow");
window.focus();
но window.focus() не действует. Я пробовал:
otherWinRef = window.open("","OtherWindow");
setTimeout(window.focus,0);
Но вызов window.focus() все равно не повлиял.
Я разрешаю проблему, добавив следующий код в источник OtherWindow.
function Bounce(w) {
window.blur();
w.focus();
}
Затем я изменил код в главном окне на:
otherWinRef = window.open("","OtherWindow");
otherWinRef.Bounce(window);
UPDATE: это решение больше не работает в Chrome.
Невероятно, решение довольно просто. Я пытался понять эту проблему как минимум неделю. Все, что вам нужно сделать, это размыть окно, а затем дать ему фокус. Я пробовал это раньше, и это не сработало.
windowHandle.blur();
windowHandle.focus();
Итак, я решил попробовать это:
windowHandle.blur();
setTimeout(windowHandle.focus, 0);
и, похоже, работает.
Я обновил свой код здесь:
MyCompany = { UI: {} }; // Put this here if you want to test the code. I create these namespaces elsewhere in code.
MyCompany.UI.Window = new function() {
// Private fields
var that = this;
var windowHandles = {};
var isChrome = /chrome/.test(navigator.userAgent.toLowerCase());
// Public Members
this.focus = function(windowHandle) {
if (!windowHandle) {
throw new Exception("Window handle can not be null.");
}
if (isChrome) {
windowHandle.blur();
setTimeout(windowHandle.focus, 0);
}
else {
windowHandle.focus();
}
}
this.windowExists = function(windowTarget) {
return windowTarget && windowHandles[windowTarget] && !windowHandles[windowTarget].closed;
}
this.open = function(url, windowTarget, windowProperties) {
// See if we have a window handle and if it closed or not.
if (that.windowExists(windowTarget)) {
// We still have our window object so let check if the URLs is the same as the one we're trying to load.
var currentLocation = windowHandles[windowTarget].location;
if (
(
/^http(?:s?):/.test(url) && currentLocation.href !== url
)
||
(
// This check is required because the URL might be the same, but absolute,
// e.g. /Default.aspx ... instead of http://localhost/Default.aspx ...
!/^http(?:s?):/.test(url) &&
(currentLocation.pathname + currentLocation.search + currentLocation.hash) !== url
)
) {
// Not the same URL, so load the new one.
windowHandles[windowTarget].location = url;
}
// Give focus to the window. This works in IE 6/7/8, FireFox, Safari but not Chrome.
// Well in Chrome it works the first time, but subsequent focus attempts fail,. I believe this is a security feature in Chrome to avoid annoying popups.
that.focus(windowHandles[windowTarget]);
}
else {
// Need to do this so that tabbed browsers (pretty much all browsers except IE6) actually open a new window
// as opposed to a tab. By specifying at least one window property, we're guaranteed to have a new window created instead
// of a tab.
//windowProperties = windowProperties || 'menubar=yes,location=yes,width=700, height=400, scrollbars=yes, resizable= yes';
windowProperties = windowProperties || 'menubar=yes,location=yes,width=' + (screen.availWidth - 15) + ', height=' + (screen.availHeight - 140) + ', scrollbars=yes, resizable= yes';
windowTarget = windowTarget || "_blank";
// Create a new window.
var windowHandle = windowProperties ? window.open(url, windowTarget, windowProperties) : window.open(url, windowTarget);
if (null === windowHandle || !windowHandle) {
alert("You have a popup blocker enabled. Please allow popups for " + location.protocol + "//" + location.host);
}
else {
if ("_blank" !== windowTarget) {
// Store the window handle for reuse if a handle was specified.
windowHandles[windowTarget] = windowHandle;
windowHandles[windowTarget].focus();
}
}
}
}
}
Предложение кого-то в блоге использовать следующее:
if (navigator.userAgent.indexOf('Chrome/') > 0) {
if (window.detwin) {
window.detwin.close();
window.detwin = null;
}
}
window.detwin = window.open(URL, 'windowname', '...');
window.detwin.focus();
После эта ошибка может быть полезна.
вы можете focus
другое окно, вызвав open
с javascript:;
как url
:
window.open('http://....', 'myWindow');
// focus that window later on...
window.open('javascript:;', 'myWindow');
Вот обходной путь, который я смог использовать. Он может не работать для всех, но он делает то, что мне нужно, и обрабатывает сценарии, в которых ваше всплывающее окно обновлялось через Ajax после начальной загрузки (т.е. Оно не возвращается на сервер для перезагрузки страницы).
function refocusWindow() {
var newName = window.name + '-2'; // you'll want to customize this for your needs
var options = ''; // again, customize for your situation
var w = window.open('', newName, options);
w.document.write(document.getElementById('everything').innerHTML);
window.close();
}
Я использую трюк нового окна, чтобы он выглядел так, будто я просто переориентирую страницу, но на самом деле я создаю новое окно с точным содержимым старого окна и закрываю старое окно.
Вам просто нужно убедиться, что вы сможете захватить все необходимое для нового окна. Я помещаю все, что мне нужно, в div #everything
; вам может потребоваться изменить это для ваших нужд.
Надеюсь, это по крайней мере поможет некоторым из вас.
Примечание: встроенный Javascript, похоже, выполняет этот подход, связанный с Javascript может и не быть. Будьте осторожны, если это будет проблемой для вас.
window.focus()
для дочерних окон отлично работает для меня в Chrome v52 в Windows, но ТОЛЬКО внутри инициированного пользователем события, например. обратный вызов клика. (Это то же ограничение, что всплывающее блокирование относится к вызовам window.open()
.)
Единственное решение, которое в настоящее время работает в Chrome, - это код внутри нового окна:
$(".closeBtn").click( function(e)
{
window.open("",window.opener.name);
window.close();
});
К сожалению, решение работает только в двух условиях:
window.opener
должно быть указано имя для загрузки документа (window.name="WhateverName";
)window.open()
вызывается при нажатии пользователяЯ только что нашел довольно простое решение.
Если вы заново открываете окно, находящееся в фоновом положении, ориентируясь на одно и то же окно ( "_self" ), Chrome автоматически фокусирует это окно.
Чтобы восстановить фокус окна, вы должны использовать следующий код:
path = windowHandle.document.URL;
windowHandle.open(path,"_self");
Это отлично работает для меня. Удалено запуск пустого окна из блока catch, вместо этого непосредственно запускается URL-адрес, что позволяет избежать путаницы пользователя, когда он говорит пустое окно.
windowHandle = window.open('', 'PrintInvoice', urlOptions);
try {
windowHandle.document.location.href = url;
} catch (exc) {
windowHandle.close();
windowHandle = window.open(url, 'PrintInvoice', urlOptions);
}
windowHandle.focus();
Я боролся с этим в Chrome. Я хотел, чтобы всплывающее окно отображалось, когда пользователь нажал ссылку на родительском экране. Работает в первый раз, когда отображается всплывающее окно, но как только всплывающее окно теряет фокус, javascript не может вернуть его обратно на передний план; вы должны вручную щелкнуть по окну. Вот что сработало для меня. Это script - это родительское окно (одно со ссылками). Как вы можете видеть, я положил его в конец раздела HEAD::
<script type="text/javascript">
var infoWindow;
function openLink(url) {
infoWindow = window.open("", "infoWindow", "width=880, height=500, top=20, left=20, scrollbars=yes, toolbar=yes, resizable=yes");
infoWindow.location.href=url;
infoWindow.focus();
}
function closeWindow() {
if (infoWindow) {
infoWindow.close();
}
}
</script>
</head>
<body bgcolor="black" onFocus="closeWindow()" onLoad="closeWindow()">
Все ссылки <A href="Javascript: openLink('url')">
. Если пользователь не закрывает всплывающее окно вручную, он закрывается, когда родительское окно восстанавливает фокус. Таким образом всплывающее окно уничтожается и воссоздается каждый раз. Кажется любопытным, но он работает для меня.
Может быть, не то, что все хотят, но (в chrome) я заметил, что предупреждение, всплывающее из всплывающей страницы, держит фокус всплывающего окна. Так что я делаю это сейчас...
На всплывающей странице загрузите функцию в заголовок:
<script type="text/javascript">
function confirmBlur() {
if (confirm("Do you want to close this window?")) {
window.close();
}
}
</script>'
А потом на всплывающей странице:
<body onblur="ConfirmBlur()">
Так что это вариант закрытия всплывающего окна, когда фокус потерян. Но в моем случае это всплывающее окно для редактирования данных. Окно, которое никто не хочет закрывать без просьбы. Таким образом, теперь пользователь получает уведомление о том, что фокус собирается исчезнуть, и получает выбор, хочет он закрыть окно или нет. Опять же, далеко не идеально, но это сработало для меня.
(быть нежным)
window.open('javascript:void(0)', 'myWindow');
Ни одно из решений здесь не сработало для меня. Итак, я придумал это:
$('<form target="_blank" action="'+URL+'" method="post"></form>')
.appendTo('body').submit();
Это создает пустую форму, которая отправляется по почте на целевой URL. Применяя target="_blank"
мы имитируем вызов window.open() с побочным эффектом сохранения фокуса на новом окне.
Редактировать: версия Vanilla JS, которая также удаляет элемент формы впоследствии:
var f = document.createElement("form");
f.setAttribute('method', 'post');
f.setAttribute('action', URL);
f.setAttribute('target', '_blank');
document.getElementsByTagName('body')[0].appendChild(f);
f.submit();
f.parentNode.removeChild(f);
Я просто использую эту строку кода для перефокусировки, это лучшее, что мне до сих пор удавалось:
window.open('', 'NameOfTheOpenedWindow').focus();
благодаря этому ответу [здесь] (fooobar.com/info/247173/... "Ответ от dileepar")
Я также сделал [jsfiddle] (https://jsfiddle.net/Foxygaming9978/6gc38f5x/ "jsfiddle popup refocus testing") для тестирования.
надеюсь, это поможет