Итак, я пытаюсь найти ответ на вопрос, почему эта проблема происходит; Я исправил проблему, но хочу знать, почему это произошло.
TL; DR
Предоставленный Google код отслеживания конверсий, который вводил iframe с использованием document.write
, неожиданно вызывал прекращение работы страницы во всех версиях Internet Explorer, но был исправлен путем внедрения одного и того же iframe с использованием не document.write
метода.
История:
Doubleclick - рекламная сеть, которая предоставляет фрагмент JavaScript для отслеживания конверсий из рекламы.
Фрагмент, который они дают, выглядит следующим образом:
<SCRIPT language="JavaScript">
var axel = Math.random()+"";
var a = axel * 10000000000000;
document.write('<IFRAME SRC="https://fls.doubleclick.net/activityi;src=143;type=donat01;cat=indir4;ord=1;num='+ a + '?" WIDTH=10 HEIGHT=10 FRAMEBORDER=0></IFRAME>');
</SCRIPT>
<NOSCRIPT>
<IFRAME SRC="https://fls.doubleclick.net/activityi;src=143;type=donat01;cat=indir4;ord=1;num=1?"
WIDTH=1 HEIGHT=1 FRAMEBORDER=0></IFRAME>
</NOSCRIPT>
Теперь я знаю, что по разным причинам document.write опасен и его следует избегать. Но Google дает мне этот код, поэтому я решил, что могу доверять ему.
Он неожиданно начал ломать все наши страницы для всех пользователей, использующих Internet Explorer. Как и в случае, страница перестает отображаться полностью, как только она достигнет document.write
. Это было сумасшествие: один из крупнейших сторонних рекламодателей в Интернете дал мне JavaScript, который буквально сломал мои страницы покупки для 25% моего трафика!
В качестве сортировки я быстро заменил тот же код, используя технику внедрения, найденную в Google Analytics:
var iframe = document.createElement('iframe');
iframe.src = //the URL;
iframe.width = 0;
iframe.height = 0;
iframe.frameborder = 0;
var ref = document.getElementsByTagName('script')[0];
ref.parentNode.insertBefore(iframe, ref);
Это решило проблему, фактически не объясняя:
Почему почти пустой iframe, внедренный с помощью document.write, разрушает Internet Explorer, но этот метод выше не делает?