Мне нужно отправить значение в iframe. IFrame присутствует в текущем окне. Как я могу достичь этого?
Мне нужно сделать это в javascript родительского (текущего) окна.
Мне нужно отправить значение в iframe. IFrame присутствует в текущем окне. Как я могу достичь этого?
Мне нужно сделать это в javascript родительского (текущего) окна.
Во-первых, вам нужно понять, что у вас есть два документа: рамка и контейнер (который содержит фрейм).
Основным препятствием при манипулировании рамкой из контейнера является то, что кадр загружается асинхронно. Вы не можете просто получить доступ к нему в любое время, вы должны знать, когда он закончил загрузку. Поэтому вам нужен трюк. Обычным решением является использование window.parent
в кадре для получения "вверх" (в документе, который содержит тег iframe
).
Теперь вы можете вызвать любой метод в документе контейнера. Этот метод может манипулировать фреймом (например, вызвать некоторый JavaScript в фрейме с необходимыми параметрами). Чтобы узнать, когда вызывать метод, у вас есть два варианта:
Вызовите его из body.onload кадра.
Поместите элемент script в качестве последней вещи в содержимое HTML фрейма, где вы вызываете метод контейнера (слева как упражнение для читателя).
Итак, кадр выглядит так:
<script>
function init() { window.parent.setUpFrame(); return true; }
function yourMethod(arg) { ... }
</script>
<body onload="init();">...</body>
И контейнер вроде этого:
<script>
function setUpFrame() {
var frame = window.frames['frame-id'];
frame.yourMethod('hello');
}
</script>
<body><iframe name="frame-id" src="..."></iframe></body>
Зависит от конкретной ситуации, но если iframe можно развернуть после остальной загрузки страницы, вы можете просто использовать строку запроса, a::
<iframe src="some_page.html?somedata=5&more=bacon"></iframe>
А потом где-то в some_page.html:
<script>
var params = location.href.split('?')[1].split('&');
data = {};
for (x in params)
{
data[params[x].split('=')[0]] = params[x].split('=')[1];
}
</script>
Используйте коллекцию фреймов.
Из ссылки:
var frames = window.frames; // or // var frames = window.parent.frames;
for (var i = 0; i < frames.length; i++) {
// do something with each subframe as frames[i]
frames[i].document.body.style.background = "red";
}
Если iframe имеет имя, вы также можете сделать следующее:
window.frames['ponies'].number_of_ponies = 7;
Вы можете сделать это только в том случае, если две страницы будут обслуживаться из того же домена.
Еще два варианта, которые не самые изящные, но, вероятно, их легче понять и реализовать, особенно если данные, которые требуется от iframe от его родителя, - это всего лишь несколько vars, а не сложные объекты:
Использование идентификатора фрагмента URL (#)
В контейнере:
<iframe name="frame-id" src="http://url_to_iframe#dataToFrame"></iframe>
В iFrame:
<script>
var dataFromDocument = location.hash.replace(/#/, "");
alert(dataFromDocument); //alerts "dataToFrame"
</script>
Использовать имя iFrame
(мне не нравится это решение - он злоупотребляет атрибутом имени, но это вариант, поэтому я упоминаю его для записи)
В контейнере:
<iframe name="dataToFrame" src="http://url_to_iframe"></iframe>
В iFrame:
<script type="text/javascript">
alert(window.name); // alerts "dataToFrame"
</script>
Здесь другое решение, которое можно использовать, если кадры из разных доменов.
var frame = /*the iframe DOM object*/;
frame.contentWindow.postMessage({call:'sendValue', value: /*value*/}, /*frame domain url or '*'*/);
И в самом кадре:
window.addEventListener('message', function(event) {
var origin = event.origin || event.originalEvent.origin; // For Chrome, the origin property is in the event.originalEvent object.
if (origin !== /*the container domain url*/)
return;
if (typeof event.data == 'object' && event.data.call=='sendValue') {
// Do something with event.data.value;
}
}, false);
Не знаю, какие браузеры поддерживают это.
Посмотрите на приведенную ниже ссылку, в которой говорится, что можно изменить содержимое iFrame на вашей странице с помощью Javascript, хотя вы, скорее всего, столкнетесь с несколькими проблемами с перекрестным браузером. Если вы можете это сделать, вы можете использовать javascript на своей странице, чтобы добавить скрытые элементы dom в iFrame, содержащие ваши значения, которые iFrame может читать. Доступ к документу внутри iFrame
Есть 2 способа
Первый путь Открыть сеанс в родительском (С#)
Session["MYDATA"] = "Some Data";
и внутри IFRAME (С#) вы просто пишете
String x=Session["MYDATA"]
второй способ, который менее проблематичен, поскольку я понимаю внутри Html родителя вы добавляете окончание к вашему источнику (src)
внутри С# моего кадра я put (внутри страницы_Load)
String SourcePage = Request.QueryString["source_page"].ToString();
вы получаете (SourcePage = MYpage)
надеюсь, что это поможет вам