window.focus () не работает в Google Chrome - PullRequest
43 голосов
/ 03 мая 2010

Просто интересно, собирается ли Google Chrome поддерживать window.focus() в какой-то момент.Когда я имею в виду поддержку, я имею в виду это работает.Призыв к этому не провалится, он просто ничего не делает.Все другие основные браузеры не имеют этой проблемы: FireFox, IE6-IE8 и Safari.

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

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

Я знаю, что одна из выдвинутых идей заключалась в том, чтобы закрыть окно, а затем снова открыть его, но это ужасное решение.Поиск в Google показывает, что я не единственный человек, разочарованный этим.

И чтобы быть на 100% ясным, я имею в виду новые окна, а не вкладки (вкладки не могут быть сфокусированы на том, что я прочитал) ивсе открываемые окна находятся в одном домене.

Любые идеи, обходные пути, кроме упомянутого выше плохого?

В проекте Chromium есть ошибка, проверьте ее.вне здесь .Спасибо за сообщение, что Rich .

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's closed or not.
        if (that.windowExists(windowTarget)) {

            // We still have our window object so let's 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();
                }
            }
        }
    }
}

Ответы [ 15 ]

0 голосов
/ 07 января 2017
window.open('javascript:void(0)', 'myWindow');
0 голосов
/ 12 ноября 2014

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

На всплывающей странице загрузите в заголовок функцию:

<script type="text/javascript">
    function confirmBlur() {
        if (confirm("Do you want to close this window?")) {
            window.close();
        }
    }
</script>`

А потом на всплывающей странице:

<body onblur="ConfirmBlur()">

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

(будь нежным)

0 голосов
/ 20 мая 2014

Я боролся с этим в Chrome. Я хотел, чтобы всплывающее окно отображалось, когда пользователь нажимал ссылку на родительском экране. Работает при первом отображении всплывающего окна, но как только всплывающее окно теряет фокус, javascript не может снова вернуть его вперед; Вы должны вручную нажать на окно. Вот что сработало для меня. Этот скрипт является родительским окном (со ссылками). Как видите, я поставил его в конец раздела 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')">. Если пользователь не закрывает всплывающее окно вручную, оно закрывается, когда родительское окно восстанавливает фокус. Таким образом, всплывающее окно уничтожается и создается заново каждый раз. Кажется, немного запутанным, но это работает для меня.

0 голосов
/ 20 сентября 2013

Это прекрасно работает для меня. Удален запуск пустого окна из блока 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();
0 голосов
/ 05 апреля 2013

Я только что нашел довольно простое решение.

Если вы снова откроете окно, которое находится в фоновом режиме и нацелено на то же окно («_self»), Chrome автоматически сфокусирует это окно.

Чтобы восстановить фокус окна, используйте следующий код:

path = windowHandle.document.URL;
windowHandle.open(path,"_self");
...