2009-01-09 33 views
1

我正在寫一段代碼,要求網站的DOM在任意JavaScript運行時保持凍結狀態。屬性改變是好的,但我不能有任何東西改變頁面的原始標籤結構!將DOM凍結爲JavaScript:將DOM修改函數覆蓋爲空操作

我知道在JavaScript中有功能的基數,可以修改DOM

appendChild(nodeToAppend) 
cloneNode(true|false) 
createElement(tagName) 
createElemeentNS(namespace, tagName) 
createTextNode(textString) 
innerHTML 
insertBefore(nodeToInsert, nodeToInsertBefore) 
removeChild(nodetoRemove) 
replacechild(nodeToInsert, nodeToReplace) 

我最初的想法是簡單地覆蓋這些功能,因爲沒有OPS:

>>> document.write('<p>Changing your DOM. Mwwhaha!</p>') 
>>> document.write = function() {} 
>>> document.write('<p>No-op now!</p>') 

雖然這是易於做到這一點的document對象DOM修改功能可以從許多不同的JavaScript對象調用!如果我可以在頂層覆蓋這些功能,也許它會工作?從sktrdie

更新:

>>> HTMLElement.prototype.appendChild = function(){} 
>>> $("a").get(0).appendChild(document.createElement("div")) 
# Still works argh. 
>>> HTMLAnchorElement.prototype.appendChild = function(){} 
>>> $("a").get(0).appendChild(document.createElement("div")) 
# No-op yeah! 

所以它似乎我能收集所有DOM元素的構造函數和對他們在無操作將但這似乎仍然相當混亂......運行

如何保護DOM免受任意JavaScript的修改?

+0

哇。你在做什麼?真的很好奇。 – 2009-01-09 19:48:01

+0

我有一個代理網頁顯示網站的iFrame。然後,您可以使用我注入的JavaScript選擇網站的各個部分 - 我從您選擇的內容中抓取CSS選擇器。所以`DOM`需要保持不變或者選擇器會中斷(但其他JavaScript應該像平常一樣運行!) – 2009-01-09 19:53:19

回答

2

您是否試過HTMLElement .prototype.appendChild = function(){}來覆蓋更高級別的DOM方法?

0

不要這樣做。使用白名單。請。

0

您可能會將所有內容放在<div>標記中,並隱藏該標記,將其替換爲另一個標記爲「加載..」的標記。然後,它已經加載後,你可以隱藏加載<div>並將其替換爲原來的。

0

沒有辦法做到這一點。我做了一些測試,不管我怎麼試圖覆蓋他們保留的這些方法。我相信它們是在比可執行的JavaScript更高的層次上實現的,所以你不能真正觸及它們。

1

雖然這是非常黑客,但維護當前DOM結構的唯一方法是存儲DOM的「快照」並定期檢查它。

//place in anonymous function to prevent global access 
(function() { 
    //storing the whole DOM as objects would be ideal, but too memory intensive, so a string will have to do. 
    var originalDOM = document.body.innerHTML; 

    var checkDOM = function() { 
    if (document.body.innerHTML != originalDOM) document.body.innerHTML = originalDOM 
    //check that the code is running 
    if (arbitraryCodeIsRunning) setTimeout("checkDOM", 100); 
    } 
    checkDOM(); 
})(); 

也許不是你想找的東西,但經過一些測試這是我能想到的,以保持DOM結構無關的唯一途徑。