刪除腳本元素不會執行任何操作。如果你能以某種方式訪問一個腳本元素,它很早以前就被執行了,刪除它將不起作用。
所以我們需要解決它。如果你的腳本元素是在頁面像這樣的頂級:
<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
調用。
我不知道解決方案,但我有一個問題:你爲什麼要刪除它們(它似乎是因爲用戶而添加的)?如果有人想執行代碼,他也可以使用JavaScript控制檯? – 2012-05-02 11:22:36
如果您可以檢測到腳本並阻止其執行,那麼修改代碼應該很容易,因爲您可以只抓取src屬性,將其作爲文本加載(在ajax中),修改並執行它。在您可以使用變異觀察者觀察DOM後,爲了實現這一點,瀏覽器在加載和執行文件之前需要添加腳本標記,並且找不到任何有關此信息的信息。就好像是晚些時候那樣檢測腳本標記的插入將是無用的,因爲它們已經被運行了。 – GillesC
只想添加,不知道上下文或問題,這聽起來像一個解決方案怪異的方針,一個是債券給你很多麻煩。如果你解釋一下上下文,也許有人可能會提出更明智的解決方案 – GillesC