Подтвердить что ты не робот

Передавать значение в iframe из окна

Мне нужно отправить значение в iframe. IFrame присутствует в текущем окне. Как я могу достичь этого?

Мне нужно сделать это в javascript родительского (текущего) окна.

4b9b3361

Ответ 1

Во-первых, вам нужно понять, что у вас есть два документа: рамка и контейнер (который содержит фрейм).

Основным препятствием при манипулировании рамкой из контейнера является то, что кадр загружается асинхронно. Вы не можете просто получить доступ к нему в любое время, вы должны знать, когда он закончил загрузку. Поэтому вам нужен трюк. Обычным решением является использование 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>

Ответ 2

Зависит от конкретной ситуации, но если 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>

Ответ 3

Используйте коллекцию фреймов.

Из ссылки:

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;

Вы можете сделать это только в том случае, если две страницы будут обслуживаться из того же домена.

Ответ 4

Еще два варианта, которые не самые изящные, но, вероятно, их легче понять и реализовать, особенно если данные, которые требуется от 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>

Ответ 5

Здесь другое решение, которое можно использовать, если кадры из разных доменов.

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);

Не знаю, какие браузеры поддерживают это.

Ответ 6

Посмотрите на приведенную ниже ссылку, в которой говорится, что можно изменить содержимое iFrame на вашей странице с помощью Javascript, хотя вы, скорее всего, столкнетесь с несколькими проблемами с перекрестным браузером. Если вы можете это сделать, вы можете использовать javascript на своей странице, чтобы добавить скрытые элементы dom в iFrame, содержащие ваши значения, которые iFrame может читать. Доступ к документу внутри iFrame

Ответ 7

Есть 2 способа


Первый путь Открыть сеанс в родительском (С#)

Session["MYDATA"] = "Some Data";

и внутри IFRAME (С#) вы просто пишете

String x=Session["MYDATA"]

проблема: если у вас есть несколько открытий, они могут смешиваться и создавать проблемы


второй способ, который менее проблематичен, поскольку я понимаю внутри Html родителя вы добавляете окончание к вашему источнику (src)

внутри С# моего кадра я put (внутри страницы_Load)

String SourcePage = Request.QueryString["source_page"].ToString();

вы получаете (SourcePage = MYpage)

надеюсь, что это поможет вам