Если вы используете 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
Предположите, что идентификатор Вашего 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();
$("#myframe").load(function() {
alert("loaded");
});
IFRAME должен быть в frames[]
набор. Используйте что-то как
frames['iframeid'].method();
Quirksmode имел сообщение на этом .
, Так как страница теперь повреждается, и только доступная с помощью archive.org, я воспроизвел ее здесь:
IFrames
На этой странице я даю краткий обзор доступа iframes от страницы they’re на. Не удивительно, существуют некоторые соображения браузера.
iframe является встроенной рамкой, кадр, который, в то время как содержащий абсолютно отдельную страницу с ее собственным URL, тем не менее, помещается в другой странице HTML. Это дает очень хорошие возможности в веб-дизайне. Проблема состоит в том, чтобы получить доступ к iframe, например, для загрузки новой страницы в него. Эта страница объясняет, как сделать это.
Кадр или объект?
фундаментальный вопрос состоит в том, рассматривается ли iframe как кадр или как объект.
top.frames[1].frames[2]
и такой). iframe вписывается в эту иерархию кадра? 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 правильно изменяются. Однако этот браузер не изменяет разрывы строки в оригинальном тексте, так, чтобы часть текста могла стать невидимой, или разрывы строки могут произойти, в то время как строка могла все еще содержать другое слово.
В IFRAME обнародуйте свою функцию к объекту окна:
window.myFunction = function(args) {
doStuff();
}
Для доступа от родительской страницы, используйте это:
var iframe = document.getElementById("iframeId");
iframe.contentWindow.myFunction(args);
Существуют некоторые причуды для знания здесь.
HTMLIFrameElement.contentWindow
, вероятно, более легкий путь, но это - не совсем стандартное свойство, и некоторые браузеры не поддерживают его, главным образом более старые. Это вызвано тем, что стандарт HTML Уровня 1 DOM не имеет ничего для высказывания об эти window
объект.
можно также попробовать HTMLIFrameElement.contentDocument.defaultView
, который позволяют несколько более старых браузеров, но IE не делает. Несмотря на это, в стандарте явно не говорится, что Вы возвращаетесь эти window
объект по той же причине как (1), но можно взять несколько дополнительных версий браузера здесь, если Вы заботитесь.
window.frames['name']
возврат окна является самым старым и следовательно самый надежный интерфейс. Но тогда необходимо использовать name="..."
атрибут, чтобы быть в состоянии получить кадр по имени, который является немного ужасен / <забастовка>, удержанная от использования забастовка> / переходный. (id="..."
было бы лучше, но IE не нравится это.)
window.frames[number]
также очень надежно, но знание правильного индекса является приемом. Можно сойти с рук это, например, если Вы знаете, что у Вас только есть один iframe на странице.
совершенно возможно, что дочерний iframe еще не загрузился, или что-то еще пошло не так, как надо для создания его недоступным. Можно найти легче инвертировать поток связи: то есть, имейте дочерний iframe, уведомляют window.parent
сценарий, когда это закончилось загруженный и готово быть призванным обратно. Путем передачи одного из его собственных объектов (например, функция обратного вызова) к родительскому сценарию, тот родитель может тогда связаться непосредственно со сценарием в iframe, не имея необходимость волноваться о том, с чем HTMLIFrameElement это связано.
Для записи, сегодня я столкнулся с той же проблемой, но на этот раз страница была встроена в объект, а не в iframe (поскольку это был документ XHTML 1.1). Вот как это работает с объектами:
document
.getElementById('targetFrame')
.contentDocument
.defaultView
.targetFunction();
(извините за уродливые разрывы строк, не поместился в одну строку)
Вызов родительской JS-функции из iframe
возможен, но только тогда, когда и родительский элемент, и страница, загруженная в iframe
, находятся в одном домене, т.е. abc .com, и оба используют один и тот же протокол, т.е. оба находятся на http: //
или https: //
.
Вызов завершится ошибкой в следующих случаях:
Любой обход этого ограничения был бы крайне небезопасным.
Например, представьте, что я зарегистрировал домен superwinningcontest.com и разослал ссылки на электронные письма людей. Когда они загрузили главную страницу, я мог спрятать там несколько iframe
и прочитать их фид в Facebook, проверить последние транзакции Amazon или PayPal или - если они использовали службу, которая не обеспечивала достаточную безопасность - переводить деньги со своих счетов. Вот почему JavaScript ограничивается одним доменом и одним протоколом.