2010-01-15 47 views
1
<html> 
<head> 
    <script> 
    remove_line(11); 
    // This should remove the line 11 from source code, 
    // eliminating the unordered list element. 
    </script> 
</head> 
<body> 
    <p>Some text</p> 
    <ul><li>Some list item</li></ul> 
    <a>Some link</a> 
</body> 
</html> 

我是完全意識到這段代碼傷害了你的眼睛。但是,對於非常非典型的技術原因(主要是性能),這將是解決我的問題最有效的方法。這很可能是不可行的,但它確實會爲我節省很多編碼和性能問題。Javascript是否具有給定文檔原始源代碼的內部知識?

如果不是可行的(如預期),什麼是最一致的/有效符號/對唯一技術識別/訪問DOM的每元素(包括文本被混合/內嵌元件)。

我在考慮以下符號:tag_name [index]其中索引將通過源代碼中的外觀順序表示第X個元素。但是,我不確定它是否有效,我不確定如何在Javascript中實現它。我也想過XPath,但我不確定它是否支持Javascript(除了一些框架「模擬」它)。

UPDATE:我原來的職位也不是很清楚,所以我要澄清一些要點:

  • 我正在圖書館的最終目標是「儘量減少頁面渲染「,所以做服務器端並將其發送回用戶不是一種選擇。一旦我有一個我正在嘗試做的功能實現,我會發布更新。否則,在這裏解釋時間太長。

  • 爲了澄清什麼,我真正需要做的,讓我給下面的(虛構的)例子:

    • 腳本X是一個服務器端腳本,隨機選擇document.html DOM節點。
    • 腳本X需要告訴腳本Y(位於document.html中的Javascript腳本)以刪除它所選擇的DOM節點。
    • 腳本X如何唯一標識它已選擇的DOM節點,以便它可以將它傳遞給腳本Y?

我如何唯一標識DOM節點,以便腳本Y可以識別它,並操縱它真正的興趣。優選地,它也應該與文本節點一起工作。

+0

爲什麼你不能通過CSS選擇器(例如通過jQuery)或id(通過'document.getElementById')來訪問它們? – 2010-01-15 10:08:21

+0

實際的原因需要很長時間來解釋,但它基本上是因爲我正在寫一個通用的庫,應該與任何給定的HTML文檔一起工作。 – 2010-01-15 10:16:06

回答

2

No javascript has no such access to the source code。你爲什麼不在服務器上這樣做呢?

+0

我正在處理的圖書館的目標是「儘量減少頁面渲染」,因此將其設置爲服務器端並將其發送回用戶不是一種選擇。一旦我有一個我正在嘗試做的功能實現,我會保持這個問題更新。否則,在這裏解釋時間太長。 – 2010-01-15 10:20:39

1

通過element_name你是指標籤的名字,還是name屬性的值?在前者的情況下,你可以這樣做:

var nodeToRemove = document.getElementsByTagName('span')[7]; 

如果你指的name屬性的值,你可以使用一個庫如jQuery:

$('*[name=myName]:eq(7)'); 

或者如果使用普通的JavaScript,您必須手動迭代DOM(遞歸)

+0

我的意思是「標籤的名稱」。感謝您指出實現我提出的符號的實際JS函數。 – 2010-01-15 10:22:02

0

在某些有限情況下可能會發生這種情況。一個聰明的解決方法是,如果頁面是靜態的,你可以爲同一頁面創建一個XmlHttpRequest,然後responseText(),這會給你確切的源代表。 (注意:這可能產生特定瀏覽器的結果。)

然而,DOM本身是一個對象圖,並保持無源代碼的結構的知識。鑑於DOM,有無數的原始資源可以產生它。

+0

getResponseText()不會根據需要爲您提供確切的源代碼表示,例如,試圖數線。至少在IE中,getResponseText()在瀏覽器嘗試修復不正確的HTML標記之後返回文檔,因此可能對源代碼進行更大的更改。 – jarnbjo 2010-01-15 10:14:02

+1

jarnbjo:參考?你是不是在考慮'innerHTML',它的行爲如此? 'XMLHttpRequest.responseText'(而不是'getResponseText()'!這是Java)根本不處理返回的內容(因爲它甚至可能不是HTML)。 – bobince 2010-01-15 10:17:27

+0

@bobince»哎呀!固定。 – 2010-01-15 10:18:29

0

瀏覽器解析的代碼轉換爲DOM樹,你可以通過比如說,document.body.childNodes集合遍歷和查詢.nodeType(文本節點1元,3),您可以查詢點名和集合X的所有元素類型。

ul將是body第二個元素/子。 document.body.getElementsByTagName('*')[1]會引用它,我不太確定你可以通過行號來做到這一點,除非你解析document.documentElement.innerHTML並通過換行符分解,並抓住第11行,但瀏覽器有可能重新格式化它。

話又說回來,這將有助於告訴我們你想要做什麼準確,更具體。

編輯:如果你這樣做是服務器端,使用DOM庫和removeElement

0

如果您訪問document.body.innerHTML,您可能會得到源代碼,但在某些瀏覽器中可能會再次「標準化」(例如,刪除了額外的換行符和空格)。

我相信,雖然你會想什麼是保持語義和分配ID給你認識你以後可能會刪除的元素。例如

<html> 
<head> 
    <script> 
    var myItem = document.getElementById('list-1-item-1'); 
    myItem.parentNode.removeChild(myItem); 
    // This should remove the line 12 from source code, 
    // eliminating the unordered list element. 
    </script> 
</head> 
<body> 
    <p>Some text</p> 
    <ul><li id="list-1-item-1">Some list item</li></ul> 
    <a>Some link</a> 
</body> 
</html> 

或者你能避免使用parentNode完全如果設置父的ID,你看看它爲好。

我堅持這個語義,因爲你的代碼總是可以得到的在瀏覽器中,代理重新格式化等。

相關問題