Я новичок здесь, так что у меня нет достаточной репутации прокомментировать ответы, и я прошу прощения, если я делаю это неправильно, но принятое решение, к сожалению, не сможет выполнить то, что вы ищете.
Я смог продемонстрировать, что я имею в виду, если сценарий из JSFiddle выше запускается после того, как DOM готов (предупреждение не будет, но все равно ошибка в консоли). Вот немного более подробно о том, что происходит в настоящее время с этой скрипкой:
// running with the No wrap - in <head> option
var frame = document.querySelector('iframe'); // null, the iframe isn't there yet
try {
frame.src="http://wedesignthemes.com/themes/redirect.php?theme=wedding";
} catch(e) {
// TypeError here, no hints about the iframe :(
alert('Error!');
}
Исключение, перехваченные не имеет ничего общего с IFRAME, это на самом деле ошибка типа от попыток установить src
собственности на null
стоимость.
То, что вы действительно хотите сделать, это поймать ошибку внутри из фрейма (когда песочнице скрипт пытается получить доступ к window.top
), но это не представляется возможным из-за Same-origin policy. Btw, установка флага песочницы "allow-same-origin"
имеет значение только в том случае, если содержимое iframe подается от того же origin
, что и документ верхнего уровня. Например. как только src
или location
iframe будет изменен на другой origin
, there's no way to touch anything inside.
Есть способы общения через iframe
границ, например, с window.postMessage
или старым и дилетантским способом использования IFrame-х location.hash
, но я предполагаю, что вы не можете влиять на исходном код страницы происходит в вашу IFRAME. (Хороший разработчик, конечно, был бы открыт для предложений и видел, что такая функция может быть полезна.)
Единственный способ, которым я был в состоянии поймать эту ошибку, не нарушая никаких правил безопасности браузера был установлен флаг в allow-top-navigation
песочницы, а затем использовать window.onbeforeunload
обработчик в документе верхнего уровня, чтобы поймать навигационную попытку от ребенка iframe
. Я бы никогда не рекомендовал это, потому что пользовательский опыт ужасный. Невозможно предотвратить навигацию, не запрашивая пользователя о том, хотите ли они покинуть страницу или нет. Доказательство концепции ниже:
<iframe id="myframe" sandbox="allow-scripts allow-top-navigation"></iframe>
<script>
var url = "http://wedesignthemes.com/themes/redirect.php?theme=wedding",
frame = document.getElementById("myframe"),
listener;
listener = window.addEventListener("beforeunload", function(e) {
e.preventDefault();
e.stopImmediatePropagation();
// The iframe tried to bust out!
window.removeEventListener("beforeunload", listener);
return "This is unavoidable, you cannot shortcut a " +
"navigation attempt without prompting the user";
});
frame.src = url;
</script>
Так, к сожалению, я не могу найти способ сделать это красиво в текущих реализациях браузера без помощи вашего 3-разработчика контента партии. Я прочитал некоторые интересные вещи в спецификации HTML5, которые могли бы позволить нам делать такие вещи в будущем (и, к сожалению, у меня не хватает числа ссылок, которые я могу здесь вставить), поэтому я буду следить за ходом событий.
Включает ли это случай, когда кто-то нажимает на ссылку, и у нее установлен целевой параметр '_parent' или' _top'? – Gohn67