2012-05-02 75 views
8

如何在執行之前刪除腳本元素如何在執行腳本元素之前刪除腳本元素?

我想過使用DOMNodeInserted事件,但顯然它不捕獲腳本元素。我也嘗試過使用jQuery livequery插件,如下所示:

$("script").livequery(function() { 
    $(this).remove(); 
}); 

它確實刪除了腳本元素,但是在執行它之後。

我正在尋找一個跨瀏覽器的解決方案,但我甚至不知道這是可能的。我閱讀了關於Mutation Observers這似乎足夠接近,但我不知道它是否可以解決我的問題。

如果在執行腳本內容之前修改腳本內容而不刪除並重新創建腳本內容,那將會更好。

+2

我不知道解決方案,但我有一個問題:你爲什麼要刪除它們(它似乎是因爲用戶而添加的)?如果有人想執行代碼,他也可以使用JavaScript控制檯? – 2012-05-02 11:22:36

+0

如果您可以檢測到腳本並阻止其執行,那麼修改代碼應該很容易,因爲您可以只抓取src屬性,將其作爲文本加載(在ajax中),修改並執行它。在您可以使用變異觀察者觀察DOM後,爲了實現這一點,瀏覽器在加載和執行文件之前需要添加腳本標記,並且找不到任何有關此信息的信息。就好像是晚些時候那樣檢測腳本標記的插入將是無用的,因爲它們已經被運行了。 – GillesC

+0

只想添加,不知道上下文或問題,這聽起來像一個解決方案怪異的方針,一個是債券給你很多麻煩。如果你解釋一下上下文,也許有人可能會提出更明智的解決方案 – GillesC

回答

10

刪除腳本元素不會執行任何操作。如果你能以某種方式訪問​​一個腳本元素,它很早以前就被執行了,刪除它將不起作用。

所以我們需要解決它。如果你的腳本元素是在頁面像這樣的頂級:

<head> 
    <script src="yourscript.js"></script> 

你可以做一個同步Ajax請求相同的頁面,這樣你就可以分析它的內容到一個新的文件,修改所有腳本代碼,然後將用修改後的文件替換當前文件 。

var xhr = new XMLHttpRequest, 
    content, 
    doc, 
    scripts; 

xhr.open("GET", document.URL, false); 
xhr.send(null); 
content = xhr.responseText; 

doc = document.implementation.createHTMLDocument(""+(document.title || "")); 

doc.open(); 
doc.write(content); 
doc.close(); 


scripts = doc.getElementsByTagName("script"); 
//Modify scripts as you please 
[].forEach.call(scripts, function(script) { 
    script.removeAttribute("src"); 
    script.innerHTML = 'alert("hello world");'; 
}); 

//Doing this will activate all the modified scripts and the "old page" will be gone as the document is replaced 
document.replaceChild(document.importNode(doc.documentElement, true), document.documentElement); 

不幸的是,這不能在jsfiddle或jsbin中設置。但是,您應該能夠將此代碼完全按原樣粘貼到此Chrome瀏覽器的此頁面的控制檯中。您應該看到警報,並且在檢查活動dom時,每個腳本都被修改了。

不同之處在於,我們在頁面上執行了腳本後正在運行此腳本,因此舊腳本應該仍然對頁面有工作效果。 這就是爲什麼,爲了這個工作,你需要成爲頁面上的第一個腳本來做到這一點。

經測試可在谷歌瀏覽器中使用。由於某種原因,Firefox完全忽略了doc.write調用。

-3

我不知道你在做什麼。但最好根據請求加載它們,而不是在某些情況下刪除它們。

$.getScript('helloworld.js', function() { 
    $("#content").html(' 
      Javascript is loaded successful! 
    '); 
    }); 

如果你想有執行力,它不可能之前刪除腳本。 但是你可以做的是,在條件&的條件下以編程方式刪除腳本,如果有內存泄漏問題,那麼你可以在刪除腳本之前調用下面的代碼。

var var1 = 'hello'; 
var cleanAll = function() { 
    delete window.var1; 
    delete window.cleanAll; 
}; 

// unload all resources 
cleanAll(); 
相關問題