Если у вас есть доступ к перекрестному источнику iframe
, вы можете переопределить встроенную функцию alert
следующим образом:
<iframe id="ifr" src="about:blank"></iframe>
<script type="text/javascript">
var iframe = document.getElementById('ifr');
iframe.addEventListener('load', function(event)
{
iframe.contentWindow.alert = function(s){console.log(s)};
});
iframe.src = 'iframe.html';
</script>
Код от iframe.html
<script type="text/javascript">
alert('iframe'); // this will always native function and you can not override it
</script>
<!-- BUT the following message you will get in console: -->
<input type="button" value="try it" onclick="alert('Your native alert was overriden!')">
Теперь вы можете нажать на кнопку в этом iframe, и вы получите сообщение 'Your native alert was overriden!'
в вашей консоли.
Другими словами: вы можете переопределить встроенную функцию alert
, но у вас нет возможности переопределить ее до загрузки iframe window
. У нас нет какого-либо события для этого случая. Только после загрузки iframe window
вы можете использовать функцию переопределения. Если вам этого достаточно, вы можете использовать его.
Но что-то большее вы не можете сделать.
Что важно понять:
Всегда после установки из нового src
для вашего iframe iframe будет загружать оригинальную (нативную) функцию alert
. И из-за этого вы должны переопределять его всегда после загрузки нового сайта в ваш iframe.
Альтернативное решение
Спасибо подсказке от пользователя Munim Munna в комментарии у нас есть идеальное решение:
Вы можете добавить sandbox="allow-forms allow-same-origin allow-scripts"
в качестве атрибута к вашему iframe
следующим образом:
<iframe id="ifr" src="about:blank" sandbox="allow-forms allow-same-origin allow-scripts"></iframe>
и все окна предупреждений будут игнорироваться, если вы не добавите allow-modals
в этот список. В консоли в этом случае вы получите сообщение об ошибке:
Игнорируется звонок на 'alert()'
. Документ помещен в изолированную программную среду, а ключевое слово allow-modals не задано.
А если кому-то это не нравится, он может переопределить функцию alert
, как в первой части этого моего ответа.