2012-10-29 165 views
0

我試圖動態加載zoom.it腳本,但是我似乎無法在document.write的情況下這樣做。 document.write的問題在於它取代了我不想要的頁面上的所有內容。還有什麼其他的選擇?document.write有什麼替代方法?

這是document.write在行動:http://jsfiddle.net/JyT9B/6/(注意被移除的元素)。

另外,將<script>標籤直接放入正文中的作品爲:http://jsfiddle.net/gTcRw/5/,但我需要將它動態放置。


我也試過方法Ways to add javascript files dynamically in a pageHow to add and remove js files dynamically,但似乎獲得錯誤Cannot set property 'innerHTML' of null,這可能是一個zoom.it具體的事情。我不介意知道爲什麼會這樣。

使用其他方法的的jsfiddle例子:

徒勞也試過這樣:.innerHTML - 它被添加到dom bu t不運行。

+0

是的,你需要domready中前執行'document.write'(HTTP ://jsfiddle.net/JyT9B/7/) - 但這不是動態的 – Bergi

+0

他們有有一個非縮小版本的腳本,所以我們可以在動態加載時調試爲什麼'P'是'null'? – Bergi

+0

@Bergi,感謝關於'document.write'的提示。這可能是有用的。另外,不,我沒有訪問非縮小版本。 – zlog

回答

1

使用iframe結束包含html頁面w ith嵌入的腳本標記。

iframe的好處是我可以隨意顯示/刪除它,而無需擔心在刪除腳本時清理當前頁面文檔。

HTML

<body> 
    <div id="container"> 
    <a id="show" href="#">show</a> 
    <a id="close" href="#">close</a> 

    <div id="placeholder"></div> 
    </div> 
</body>​ 

的JavaScript

function appendFrame(elem) { 
    var iframe = document.createElement("iframe"); 
    iframe.id = "iframe"; 
    iframe.setAttribute("src", "about:blank"); 
    iframe.style.width = "200px"; 
    iframe.style.height = "200px"; 
    $(elem).append(iframe); 
} 

function loadIFrame() { 
    appendFrame($("#placeholder")); 

    var doc = document.getElementById('iframe').contentWindow.document; 
    doc.open(); 
    doc.write("<html><head><title></title></head><body><script src='http://zoom.it/aaa.js'><\/script><\/body><\/html>"); 
    doc.close(); 
}; 

$("#show").click(function() { 
    loadIFrame(); 
}); 

$("#close").click(function() { 
    $("#iframe").remove(); 
});​ 

的jsfiddle這裏的解決方案:http://jsfiddle.net/7KRcG/2/

+1

-1,因爲在[script元素](http://dev.w3.org/html5/spec/single-page.html#the-script-element)中有一個iFrame是無效的HTML。你依賴於瀏覽器的怪癖和糾錯,這是一個非常糟糕的策略。此外,腳本元素沒有innerHTML屬性,他們確實有[* textContent *](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247)和[* text *](http://dev.w3.org/html5/spec/single-page.html#the-script-element)屬性。 – RobG

+0

好吧,那麼使用js創建iframe的更新如何? – zlog

+1

+1甚至可以在'document.write'部分正確引用結束標記字符。和'document.close()'。該死的。 :-) – RobG

2

我認爲createElementappendChild組合應該工作,在這樣的事情:

http://jsfiddle.net/kbDny/3/

$(function() { 
    getScript("http://www.zoom.it/aaa.js"); 
}); 

function getScript(src) { 
    var scr = document.createElement("script"); 
    scr.type = "text/javascript"; 
    scr.src = src; 

    var head = document.getElementsByTagName("head")[0]; 
    head.appendChild(scr); 
} 

但是,沒有任何理由不使用$.getScript - 只是通過url作爲第一個參數,如:

$.getScript(url, function (data, textStatus, jqxhr) { 
    // Script loaded successfully 
}); 
+1

他已經這樣做([「* document.createElement in a function *」](http://jsfiddle.net/demC4/4/)),但它也會拋出異常 – Bergi

+0

@Bergi我不是爲什麼我沒有檢查鏈接 - 我認爲他們是如何使用它的解釋...我只是想提供一個例子。無論如何,拋出的「異常」來自加載的腳本,而不是代碼......所以我們無法控制 - 加載工作。 – Ian

+0

我認爲他知道如何動態地添加腳本(他將問題鏈接到該腳本上),他寧願想知道爲什麼在動態插入時此特定腳本不起作用 – Bergi

相關問題