Я предполагаю, что страница, на которую вы загружаете этот 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 может просто протянуть руку, удалить атрибут песочницы, а затем перезагрузить себя, фактически полностью вырваться из песочницы.
Вообще говоря, динамическое удаление или изменение атрибута песочницы не рекомендуется, потому что это может затруднить рассуждение о том, что будет разрешено, а что - нет.
С моей точки зрения, два работоспособных варианта.
- установить флаг с начала. (что не является лучшим способом сделать это)
- использовать сообщение, отправив 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>
Второй подход я испытанного с приведенным выше кодом и этим работает.
Надеюсь, это полезно.
Вы не указали разрешение разрешающей навигации в атрибуте sandbox ur iframe? www.w3schools.com/tags/att_iframe_sandbox.asp – sujit