Вызов JavaScript-кода в iframe с родительской страницы

Если вы используете Linux, вы можете попробовать следующий подход. Предположим, у вас есть текстовый файл с именем animal.txt:

$ cat animal.txt  
dog
pig
cat 
monkey         
elephant  

Удалить первую строку:

>>> import subprocess
>>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt']) 

, затем

$ cat animal.txt
pig
cat
monkey
elephant
586
задан Shashank Agrawal 5 March 2018 в 01:44
поделиться

8 ответов

Предположите, что идентификатор Вашего iFrame является "targetFrame" и функцией, которую Вы хотите вызвать, targetFunction():

document.getElementById('targetFrame').contentWindow.targetFunction();

можно также получить доступ к кадру с помощью window.frames вместо document.getElementById.

// this option does not work in most of latest versions of chrome and Firefox
window.frames[0].frameElement.contentWindow.targetFunction(); 
526
ответ дан Chris 5 March 2018 в 01:44
поделиться
       $("#myframe").load(function() {
            alert("loaded");
        });
2
ответ дан GeverGever 5 March 2018 в 01:44
поделиться

IFRAME должен быть в frames[] набор. Используйте что-то как

frames['iframeid'].method();
8
ответ дан Michael Berkowski 5 March 2018 в 01:44
поделиться

Quirksmode имел сообщение на этом .

, Так как страница теперь повреждается, и только доступная с помощью archive.org, я воспроизвел ее здесь:

IFrames

На этой странице я даю краткий обзор доступа iframes от страницы they’re на. Не удивительно, существуют некоторые соображения браузера.

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

Кадр или объект?

фундаментальный вопрос состоит в том, рассматривается ли iframe как кадр или как объект.

  • , Как объяснено на Введение в кадры страницы при использовании кадров браузер создают иерархию кадра для Вас (top.frames[1].frames[2] и такой). iframe вписывается в эту иерархию кадра?
  • Или браузер видит iframe как просто другой объект, объект, который, оказывается, имеет src свойство? В этом случае мы должны использовать стандарт вызов DOM (как document.getElementById('theiframe')) для доступа к нему. В общих браузерах позволяют оба представления о 'реальном' (трудно кодированном) iframes, но к сгенерированному iframes нельзя получить доступ как кадры.

атрибут ИМЕНИ

самое важное правило состоит в том, чтобы дать любой iframe, который Вы создаете name атрибут, даже если Вы также используете id.

<iframe src="iframe_page1.html"
    id="testiframe"
    name="testiframe"></iframe>

Большинству браузеров нужно эти name атрибут для создания iframe части иерархии кадра. Некоторым браузерам (особенно Mozilla) нужно id для создания iframe доступного как объекта. Путем присвоения обоих атрибутов iframe Вы не торопитесь с решением. Но name намного более важно, чем id.

Доступ

Или Вы получаете доступ к iframe как к объекту и изменяете src, или Вы получаете доступ к iframe как к кадру и изменяете location.href.

document.getElementById ('iframe_id') .src = 'newpage.html'; кадры ['iframe_name'] .location.href = 'newpage.html'; синтаксис кадра немного предпочтителен, потому что Opera 6 поддерживает его, но не объектный синтаксис.

Доступ к iframe

Так для полного cross†“опыт браузера необходимо дать iframe имя и использовать

frames['testiframe'].location.href

синтаксис. Насколько я знаю, что это всегда работает.

Доступ к документу

, Получающему доступ к документу в iframe, довольно прост, если Вы используете эти name атрибут. Для подсчета количества ссылок в документе в iframe сделайте frames['testiframe'].document.links.length .

в Сгенерированный iframes

при генерации iframe через W3C DOM iframe сразу не вводят эти frames массив, тем не менее, и frames['testiframe'].location.href, синтаксис не будет работать правильно далеко. Браузеру требуется немного времени, прежде чем iframe поднимется в массиве, время, в течение которого не может работать никакой сценарий.

document.getElementById('testiframe').src синтаксис хорошо работает при всех обстоятельствах.

target атрибут ссылки не работает ни один со сгенерированным iframes, кроме Opera, даже при том, что я дал свой сгенерированный iframe и name и id.

отсутствие [1 120] поддержка означает, что необходимо использовать JavaScript для изменения содержания сгенерированного iframe, но так как Вам нужен JavaScript так или иначе для генерации его во-первых, я не рассматриваю это как большую часть проблемы.

Размер текста в iframes

А любопытный Проводник 6 только ошибка:

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

8
ответ дан Radu 5 March 2018 в 01:44
поделиться

В IFRAME обнародуйте свою функцию к объекту окна:

window.myFunction = function(args) {
   doStuff();
}

Для доступа от родительской страницы, используйте это:

var iframe = document.getElementById("iframeId");
iframe.contentWindow.myFunction(args);
30
ответ дан Tomalak 5 March 2018 в 01:44
поделиться

Существуют некоторые причуды для знания здесь.

  1. HTMLIFrameElement.contentWindow, вероятно, более легкий путь, но это - не совсем стандартное свойство, и некоторые браузеры не поддерживают его, главным образом более старые. Это вызвано тем, что стандарт HTML Уровня 1 DOM не имеет ничего для высказывания об эти window объект.

  2. можно также попробовать HTMLIFrameElement.contentDocument.defaultView, который позволяют несколько более старых браузеров, но IE не делает. Несмотря на это, в стандарте явно не говорится, что Вы возвращаетесь эти window объект по той же причине как (1), но можно взять несколько дополнительных версий браузера здесь, если Вы заботитесь.

  3. window.frames['name'] возврат окна является самым старым и следовательно самый надежный интерфейс. Но тогда необходимо использовать name="..." атрибут, чтобы быть в состоянии получить кадр по имени, который является немного ужасен / <забастовка>, удержанная от использования / переходный. (id="..." было бы лучше, но IE не нравится это.)

  4. window.frames[number] также очень надежно, но знание правильного индекса является приемом. Можно сойти с рук это, например, если Вы знаете, что у Вас только есть один iframe на странице.

  5. совершенно возможно, что дочерний iframe еще не загрузился, или что-то еще пошло не так, как надо для создания его недоступным. Можно найти легче инвертировать поток связи: то есть, имейте дочерний iframe, уведомляют window.parent сценарий, когда это закончилось загруженный и готово быть призванным обратно. Путем передачи одного из его собственных объектов (например, функция обратного вызова) к родительскому сценарию, тот родитель может тогда связаться непосредственно со сценарием в iframe, не имея необходимость волноваться о том, с чем HTMLIFrameElement это связано.

142
ответ дан Dominique Fortin 5 March 2018 в 01:44
поделиться

Для записи, сегодня я столкнулся с той же проблемой, но на этот раз страница была встроена в объект, а не в iframe (поскольку это был документ XHTML 1.1). Вот как это работает с объектами:

document
  .getElementById('targetFrame')
  .contentDocument
  .defaultView
  .targetFunction();

(извините за уродливые разрывы строк, не поместился в одну строку)

9
ответ дан 22 November 2019 в 22:02
поделиться

Вызов родительской JS-функции из iframe возможен, но только тогда, когда и родительский элемент, и страница, загруженная в iframe , находятся в одном домене, т.е. abc .com, и оба используют один и тот же протокол, т.е. оба находятся на http: // или https: // .

Вызов завершится ошибкой в ​​следующих случаях:

  1. Родительская страница и страница iframe находятся в другом домене.
  2. Они используют разные протоколы, один на http: //, а другой на https: //.

Любой обход этого ограничения был бы крайне небезопасным.

Например, представьте, что я зарегистрировал домен superwinningcontest.com и разослал ссылки на электронные письма людей. Когда они загрузили главную страницу, я мог спрятать там несколько iframe и прочитать их фид в Facebook, проверить последние транзакции Amazon или PayPal или - если они использовали службу, которая не обеспечивала достаточную безопасность - переводить деньги со своих счетов. Вот почему JavaScript ограничивается одним доменом и одним протоколом.

64
ответ дан 22 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: