2017-02-06 4 views
0

У меня есть ошибочный html + javascript. Она возвращает Uncaught ReferenceError: number is not defined, который, как ожидается:Очистить кеш iframe

<!DOCTYPE html> 
    <meta name="robots" content="noindex"> 
    <html> 
    <body> 
    <p id="demo"></p> 
    <script> 
     document.getElementById("demo").innerHTML = number(); 
    </script> 
    <script id="jsbin-javascript"> 
     function number() { 
     return 1; 
     } 
    </script> 
    </body> 
</html> 

Однако, если я запускаю код в виде строки по iframeдважды (plnkr), то второй прогон странно возвращает результат. Это потому, что функция number кэшируется где-то первым запуском, чего я не хочу.

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="script.js"></script> 
    </head> 
    <body> 
    <iframe></iframe> 

    <script> 
      var iframe = document.querySelector('iframe'); 
      var iframe_doc = iframe.contentDocument; 
      iframe_doc.open(); 
      iframe_doc.write(source); 
      iframe_doc.close(); 

      var iframe = document.querySelector('iframe'); 
      var iframe_doc = iframe.contentDocument; 
      iframe_doc.open(); 
      iframe_doc.write(source); 
      iframe_doc.close(); 
    </script> 
    </body> 
</html> 

Так кто-нибудь знает, как очистить кэш, таким образом, чтобы каждый прогон iframe совершенно новый?

Edit 1 После ответ @LeonidVasilyev, я добавил в HTML:

<section id="output"> 
    <iframe></iframe> 
</section> 

И в JavaScript моей детской площадки:

this.render = function (code) { 

    var source = prepareSource(code); 

    var placeholder = document.getElementById("output"); 
    while (placeholder.firstChild) { 
     placeholder.removeChild(placeholder.firstChild); 
    } 
    var iframe = document.createElement("iframe"); 
    placeholder.appendChild(iframe); 

    var iframe_doc = iframe.contentDocument; 
    iframe_doc.open(); 
    iframe_doc.write(source); 
    iframe_doc.close(); 
} 

Что нечетное является то, что каждый время Я перезагружаю/обновляю страницу, значок бумаги на вкладке Chrome и значок перезагрузки вокруг каждой вспышки дважды. Это из-за placeholder.appendChild(iframe), потому что если я удалю эту строку, она мигает один раз.

Кто-нибудь знает, как избежать этого значка, дважды мигающего?

enter image description here

+0

Euh, не уверен, если я правильно понимаю. Но вы можете исправить 'Uncaught ReferenceError: number not defined', просто поместив функцию внутри того же тега скрипта, что и вызов к ней. Итак, что вы пытаетесь сделать с iframe? Это просто исправление ошибки выше? Или вам действительно нужен iframe для чего-то? – Shilly

+0

Кроме того, причина, по которой вам нужно дважды вызывать код iframe, заключается в том, что iframe и родительский фрейм не синхронизированы. Итак, когда вы пытаетесь написать тело iframe, DOM еще не загружен, поэтому вам нужно установить Timeout doc.write. – Shilly

+0

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

ответ

0

Это Chrome bug. В вашем случае document.open() должен создать новый глобальный объект. Выдержка из description of document.open() algorithm в HTML спецификации:

  1. Call the JavaScript InitializeHostDefinedRealm() abstract operation with the following customizations:

    • For the global object, create a new Window object window.

    • For the global this value, use the current browsing context's associated WindowProxy.

    • Let realm execution context be the created JavaScript execution context.

Firefox 51 и Internet Explorer 11 правильно создать новый объект Window.

В качестве временного решения вы можете создать новый iframe узел на каждой итерации:

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="script.js"></script> 
    </head> 
    <body> 
    <div id="placeholder"></div> 
    <script> 
     var placeholder = document.getElementById("placeholder"); 
     var iframe = null; 

     iframe = document.createElement("iframe"); 
     placeholder.appendChild(iframe); 
     var iframe_doc = iframe.contentDocument; 
     iframe_doc.open(); 
     iframe_doc.write(source); 
     iframe_doc.close(); 

     iframe = document.createElement("iframe"); 
     placeholder.appendChild(iframe); 
     var iframe_doc = iframe.contentDocument; 
     iframe_doc.open(); 
     iframe_doc.write(source); 
     iframe_doc.close(); 
    </script> 
    </body> 
</html> 
+0

Я вижу ... одно замечание о 'placeholder.appendChild (iframe);' это то, что каждый раз, когда я обновляю страницу, я вижу, что icône на вкладке Chrome мигает. Это очень мало из-за 'appendChild', я не знаю, почему ... –

+0

Поскольку я занимаюсь игровой площадкой, это означает, что каждый раз, когда мы меняем код, мы должны удалить существующий iframe и добавить новый iframe , что мне кажется слишком частыми манипуляциями с DOM, нет? есть ли альтернативы? –

+0

Хотя это верно, это побочный эффект от iframe DOM. Поскольку вы не можете просто iframe.onload (не работает во всех браузерах), вы не знаете, когда можно получить доступ к документу iframe, поэтому он работает только во второй раз. (у iframe было время для загрузки) И число, уже определенное beign, является побочным эффектом использования глобальных переменных. Если функция не была глобальной внутри iframe, вам не нужно делать все, чтобы создать новый узел iframe. – Shilly