вернуть фокус из iframe к родителю - PullRequest
5 голосов
/ 22 февраля 2011

У меня есть несколько сочетаний клавиш, привязанных к объекту документа с помощью события keydown (для этого я использую плагин jquery.hotkeys, но я сомневаюсь, что это важно).

У меня тогда есть iframe, который ядинамически вставить в DOM и после некоторых действий удалить его.Моя проблема в том, что после удаления iframe мне нужно нажать на родительский документ, чтобы иметь возможность использовать сочетания клавиш, в противном случае события нажатия клавиш не обнаруживаются.

Я пытался использовать .focus (), .click (), .mousedown () и т. Д. Для элемента документа, а также для других элементов на родительской странице, но не смог вернуть фокус народительская страница.

Как вернуть фокус на страницу, не требуя от пользователя нажатия на страницу?Спасибо !!

Ответы [ 2 ]

0 голосов
/ 16 августа 2014

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

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

Пример :

external.html:

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /></head><body>
    Outer content - press [Enter] to load the iframe
    <div id="iframeHolder"></div>

    <script src="//ajax.googleapis.com/ajax/libs/prototype/1.7.2.0/prototype.js"></script>
    <script>
        // Create a function for the child frame to call
        function regainFocus(){
            $('iframeHolder').update('');
            window.focus();
        }
        // When the outer document loads, start handling keystrokes
        Event.observe(window, 'load', function(){ Event.observe(window, 'keyup', function(e){
            // Catch only the Enter key
            if((e.which||window.event.keyCode) != Event.KEY_RETURN) return;

            // Construct the iframe, set its src, add it to holder, and focus on it
            var frame = $(document.createElement('iframe'));
            frame.setAttribute('src', 'inner.html');
            frame.observe('load', function(){ this.contentWindow.focus(); });
            $('iframeHolder').appendChild(frame);
        });});
    </script>
</body></html>

inner.html:

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /></head><body>
    Inner content - press [Esc] to close the iframe

    <script src="//ajax.googleapis.com/ajax/libs/prototype/1.7.2.0/prototype.js"></script>
    <script>
        // When the inner document loads, start handling keystrokes
        Event.observe(window, 'load', function(){ Event.observe(window, 'keyup', function(e){
            // Catch only the Esc key
            if((e.which||window.event.keyCode) != Event.KEY_ESC) return;

            // Call the parent's function
            parent.regainFocus();
        });});
    </script>
</body></html>
0 голосов
/ 24 мая 2012

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

Затем, когда вы удалите iframe, просто вызовите top.doc.focus() или top.doc.getElement ('id'). focus ().

...