Вопрос

У меня есть страница с document.onkeydown обработчик событий, и я загружаю его внутри iframe на другой странице.Мне нужно щелкнуть внутри iframe, чтобы страница контента начала «прослушивать».

Есть ли способ использовать JavaScript на внешней странице, чтобы установить фокус на внутреннюю страницу, чтобы мне не приходилось щелкать внутри iframe?

РЕДАКТИРОВАТЬ:ответ на комментарий:

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

На самом деле я не хочу «setFocus» в традиционном смысле, а скорее «включаю обработчики событий в контент-документе iframe».

Это было полезно?

Решение

У меня была аналогичная проблема с jQuery Thickbox (диалоговый виджет в стиле лайтбокса).Способ устранения моей проблемы следующий:

function setFocusThickboxIframe() {
    var iframe = $("#TB_iframeContent")[0];
    iframe.contentWindow.focus();
}

$(document).ready(function(){
   $("#id_cmd_open").click(function(){
      /*
         run thickbox code here to open lightbox,
         like tb_show("google this!", "http://www.google.com");
       */
      setTimeout(setFocusThickboxIframe, 100);
      return false;
   });
});

Кажется, код не работает без setTimeout().Судя по моему тестированию, он работает в Firefox3.5, Safari4, Chrome4, IE7 и IE6.

Другие советы

При использовании метода contentWindow.focus() таймаут, вероятно, необходим для ожидания полной загрузки iframe.

Для меня также использование атрибута onload="this.contentWindow.focus()" работает с Firefox в теге iframe

document.getElementsByName("iframe_name")[0].contentWindow.document.body.focus();

Попробуйте прослушивает события в вышестоящем документе, и передавая событие в обработчик в IFrame документе.

у меня была аналогичная проблема: я пытался сосредоточиться на текстовой области в iframe, загруженном с другой страницы.в большинстве случаев это работает.Возникла проблема, из-за которой он срабатывал в FF, когда iFrame был загружен, но до того, как он был виден.поэтому фокус никогда не устанавливался правильно.

я работал над этим, используя решение, аналогичное ответу Чиминга выше

    var iframeID = document.getElementById("modalIFrame"); 
//focus the IFRAME element 
$(iframeID).focus(); 
//use JQuery to find the control in the IFRAME and set focus 
$(iframeID).contents().find("#emailTxt").focus(); 

Я обнаружил, что FF запускает событие фокуса для iframe.contentWindow, но не для iframe.contentWindow.document.Например, Chrome может справиться с обоими случаями.Итак, мне просто нужно было привязать обработчики событий к iframe.contentWindow, чтобы все заработало.Возможно, это кому-то поможет...

Вот код для создания iframe с помощью jQuery, добавления его в документ, опроса его, пока он не загрузится, а затем его фокусировки.Это лучше, чем установка произвольного тайм-аута, который может работать или не работать в зависимости от того, сколько времени занимает загрузка iframe.

var jqueryIframe = $('<iframe>', {
    src: "http://example.com"
}),
focusWhenReady = function(){
    var iframe = jqueryIframe[0],
    doc = iframe.contentDocument || iframe.contentWindow.document;
    if (doc.readyState == "complete") {
        iframe.contentWindow.focus();
    } else {
        setTimeout(focusWhenReady, 100)
    }
}
$(document).append(jqueryIframe);
setTimeout(focusWhenReady, 10);

Код для определения загрузки iframe был адаптирован из Биранчиответ на Как проверить, загружен ли iframe или есть ли у него контент?

Это то, что сработало для меня, хотя пахнет немного неправильно:

var iframe = ...
var doc = iframe.contentDocument;

var i = doc.createElement('input');
i.style.display = 'none'; 
doc.body.appendChild(i);
i.focus();
doc.body.removeChild(i);

хм.он также прокручивает содержимое до конца.Думаю, мне следует вставить фиктивное текстовое поле вверху.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top