2013-02-20 70 views
0

我需要重寫document.createElement()方法,我在網上尋找一個javascript源代碼來獲得一些想法。我搜索http://code.google.com/p/v8/source/browse,但它似乎像搜索返回所有svn來源(甚至非相關的圖書館)的結果,這使得它很混亂。我瀏覽了svn中的代碼,當然還有C++源代碼,但顯然沒有JavaScript實現。哪裏可以找到V8 DOM方法實現(document.createElement())的「javascript」源代碼?

+0

這樣的事情是不可能的。如果'alert'或者'console.log'這個或者任何其他的本地函數,你會看到像'function name(){[native code]}' – 2013-02-20 20:09:20

+6

_「我需要重寫document.createElement()」_ - 爲什麼? _「但顯然沒有JavaScript實現」_ - 你不能只重寫本地DOM方法,因爲你只能通過瀏覽器提供的方法與DOM進行交互(除非你編寫自己的瀏覽器)。你可以編寫一個調用內置DOM方法的包裝方法... – nnnnnn 2013-02-20 20:09:24

+1

你到底在做什麼? – epascarello 2013-02-20 20:12:47

回答

0

您不應該,通常也不能重寫本地DOM方法。諸如createElement之類的方法與客戶的EMACscript實現「接近表面」,具有受保護的範圍,並且根本無法通過「userland」腳本進行復制。

createElement的情況下,你可能能夠覆蓋在某些瀏覽器(見下文)document對象的createElement功能,但你也很快就會發現,它崩潰和某些現有的客戶端/版本灼傷。此外,您無法更改document的原型,因爲它沒有。

你可以,但是,容易並沒有風險創建一個小的包裝函數:

var createElement = function (ele_type, attrs) { 
    var ele = document.createElement(ele_type); 
    if (!ele) 
     return false; 

    for (var idx in attrs) { 
     if ((idx == 'styles' || idx == 'style') && typeof attrs[idx] == 'object') { 
      for (var prop in attrs[idx]){ele.style[prop] = attrs[idx][prop]} 
     } else if (idx == 'html') { 
      ele.innerHTML = attrs[idx] 
     } else { 
      ele.setAttribute(idx, attrs[idx]); 
     } 
    } 

    // now fire any custom events or do whatever you needed to do 

}; 

var myNewDiv = createElement ('div', {'id':'myNewDiv', 'styles':{'color':'red'}}); 

這讓你在創建一個新的元素來實現自定義代碼的機會。它可以在所有瀏覽器上工作,而不管實現方式的差異如何,並且與今天要編寫的任何其他代碼一樣具有未來發展的可能性。

上述另一條路線,這是不跨瀏覽器或保證工作甚至明天,是覆蓋有源document實例的createElement功能。這種方法的問題在於文檔對象沒有被規範定義 - 它是特定於實現的。 今天,Firefox(例如)可以讓你覆蓋這個功能,但是這可能會改變,恕不另行通知。

document.createElement = function(originalDocumentCreate) { 
    return function() { 
     var ele = originalDocumentCreate.apply(this, arguments); 

     // now fire any custom events or do whatever you needed to do 

     return ele; 
    }; 
}(document.createElement); 

參見:https://stackoverflow.com/a/11727842/610573(代碼概念信貸Esailija)

+0

我只是好奇:「擴展」document.createElement是多麼瘋狂/兼容。像這樣:'var nativeMethod = document.createElement;'然後'document.createElement = function(ele_type,attrs){nativeMethod.call(document,ele_type,attrs);/*然後做其他的東西* /})'。無論如何,通過開發控制檯在Chrome中工作。 – meetamit 2013-02-20 20:30:34

+0

@meetamit Chrome播放不錯。我聽說MSIE(意外的驚喜)的(舊版本)沒有。 – Alnitak 2013-02-20 20:31:22

+0

謝謝克里斯。但是對我而言,包裝不起作用,僅僅因爲我無法控制強制用戶使用這個包裝函數來創建新元素,事實上這是我需要重寫本機代碼的主要原因,因此用戶可以繼續創建元素與「本機」代碼,我可以添加功能。 – lyxio 2013-02-20 20:33:49

相關問題