Установка фокуса на содержимое iframe

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

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

Обновлено: ответ на комментарий:

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

На самом деле я не ищу "setFocus" в традиционном смысле, а скорее "включить обработчики событий в iframe contentDocument"

Можете ли вы предоставить больше контекста? Вы печатаете в главном окне и ожидаете, что этот текст появится (в той или иной форме) в вашем iframe? Это актуально, потому что установка фокуса внутри вашего iframe будет мешать пользователям вводить текст в главном окне.

cLFlaVA 15.12.2008 20:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
48
1
117 182
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Небольшая вариация этого решения работала в моем проекте. Моя версия была: this.iframe[0].contentWindow.document.body.focus(); Но мне пришлось изменить ее таким образом, чтобы она работала в плагине, который я использую.

Christian Ziebarth 21.02.2013 03:17

Попробуйте прослушать события в родительском документе и передать событие обработчику в документе 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);

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

Ответ принят как подходящий

У меня была аналогичная проблема с 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.

Я предполагаю, что это потому, что A: iframe должен завершить загрузку, а B: safari имеет (имел?) Ошибку в отношении этого и требует setTimeout не менее 1

Quickredfox 18.03.2011 20:16

Спасибо, что поделился. Работает отлично.

Jk_ 28.01.2013 20:19

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

Asmor 30.06.2014 20:43

почему здесь iframe [0] взят как индекс массива?

Juke 15.02.2019 00:17

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

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

Использование этого решения в сочетании с предложением Хайме ниже решило мою проблему, по крайней мере, в браузерах Mozilla и webkit. Все еще проверяю IE ...

Christian Ziebarth 21.02.2013 03:20

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

У меня была аналогичная проблема, когда я пытался сосредоточиться на области txt в 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(); 

Вот код для создания 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 или есть контент?

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