2015-05-10 3 views
3

У меня есть iframe на моей странице aspx. код для этого является:Как изменить флаги песочницы iframe

<iframe style="height: 513px; width: 1071px" id="iframe1" sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="paymentprocess.aspx"></iframe> 

атрибутов песочницы необходимы для остановки страницы Iframe, чтобы занять все окно. после оплаты страница ответов загружается в iframe из-за автоматического перенаправления. Я хочу изменить атрибуты iframe через javascript, чтобы все окна отображали страницу ответов. Я получаю сообщение об ошибке в консоли javascript.

Рамка, пытающаяся навигация верхнего уровня, изолирована песочницей, но флаг «allow-top-navigation» не установлен.

Я использую этот код:

if (top != self) { 
    top.location = self.location; 
} 

но бросает вышеупомянутую ошибку в консоли.

Пожалуйста, кто-то поможет мне, как изменить атрибуты фрейма родительского окна из дочернего страницы (в данном случае страницы подтверждения)

+0

Вы не указали разрешение разрешающей навигации в атрибуте sandbox ur iframe? www.w3schools.com/tags/att_iframe_sandbox.asp – sujit

ответ

3

Я предполагаю, что страница, на которую вы загружаете этот iframe внутри, и содержимое, которое вы загружаете внутри iframe, находятся в разных доменах (интерпретируется из paymentprocess.aspx). Если это так, вы не можете напрямую обрабатывать родительский документ из-за политики перекрестного происхождения. Но вы можете отправить сообщение родителю, обработать это сообщение родителем и установить этот дополнительный флаг в атрибутах iframe с атрибутом set.

Пример кода:

из IFRAME:

window.parent.postmessage("ChangeIframeAttributes", *); 

внутри родительского документа:

window.addEventListener('message', function (event) { 

    if (event.data === "ChangeIframeAttributes") { 
     document.getElementById("iframeId").setAttribute("property","value"); 
    } 

}, false); 

В случае, если вы находитесь на том же домене, вы можете получить доступ к родительский документ с window.parent.document, выберите элемент из объекта документа и setAttribute.

Update:

Я попытался просто установив атрибут с помощью window.parent и атрибут получает обновление, но проблема все еще сохраняется при изменении top.location, потому что IFrame уже загружен и модификации атрибута не будет будет выполняться, если вложенный контекст просмотра iframe перемещается.

От w3c,

http://www.w3.org/TR/2011/WD-html5-20110525/the-iframe-element.html

Эти флаги вступают в силу только когда вложенная контекст просмотра в фрейма будет перемещаться.Удаление их, или удаляя весь атрибут песочнице, не оказывает никакого влияния на уже загруженной странице

Если ключевое слово Allow-скрипты устанавливается вместе с-разрешения общего происхождения ключевых слов, а файл с того же происхождения как документ iframe, тогда скрипт в «изолированном» iframe может просто протянуть руку, удалить атрибут песочницы, а затем перезагрузить себя, фактически полностью вырваться из песочницы.

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

С моей точки зрения, два работоспособных варианта.

  1. установить флаг с начала. (что не является лучшим способом сделать это)
  2. использовать сообщение, отправив url и установив window.location на родителя.

Псевдо код:

в главном окне:

<script type="text/javascript"> 
function f() 
{ 
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
    var eventer = window[eventMethod]; 
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 

    // Listen to message from child window 
    eventer(messageEvent,function(e) { 
     var key = e.message ? "message" : "data"; 
     var data = e[key]; 
     window.location = data; 

    },false); 
} 
</script> 
<body onload="f()"> 

<iframe id="iframeId" src="testiframe.html" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"> 
</iframe> 
</body> 

на IFRAME:

<script type="text/javascript"> 
var callParent = function() { 

    window.parent.postMessage(" " + self.location, '*'); 

}; 
</script> 
<button onclick="callParent()">set parent attribute<button> 

Второй подход я испытанного с приведенным выше кодом и этим работает.

Надеюсь, это полезно.

+0

привет Рамеш, на самом деле confirm.aspx и моя родительская страница принадлежит моему собственному домену. Так что не проблема. Но я пытаюсь изменить атрибуты тега iframe родительской страницы с дочерней страницы (т. Е. Confirm.aspx). Я застрял там. – santubangalore

+0

, так что вы сможете получить доступ к окну. – Ramesh

+0

, если из-за отсутствия атрибута allow-top-navigation вы также не можете установить атрибут, хотя вы можете получить доступ к окну. (Я думаю, вы не можете установить, как это изолировано), тогда я думаю, вам следует прибегнуть к сообщение, поскольку это единственный способ связи между iframe или iframe и объектом окна? – Ramesh

0

document.getElementsByTagName («IFrame»). SetAttribute («attribute_name», «ATTRIBUTE_VALUE»);

+0

Привет, divy3993, в этом случае iframe принадлежит родительской странице (Say IframePage.aspx), и я пытаюсь изменить атрибуты с дочерней страницы, т.е. страницы, загруженной в iframe (а именно confirm.aspx). это даже возможно? если да, то как? – santubangalore