我需要重寫document.createElement()方法,我在網上尋找一個javascript源代碼來獲得一些想法。我搜索http://code.google.com/p/v8/source/browse,但它似乎像搜索返回所有svn來源(甚至非相關的圖書館)的結果,這使得它很混亂。我瀏覽了svn中的代碼,當然還有C++源代碼,但顯然沒有JavaScript實現。哪裏可以找到V8 DOM方法實現(document.createElement())的「javascript」源代碼?
回答
您不應該,通常也不能重寫本地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)
我只是好奇:「擴展」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
@meetamit Chrome播放不錯。我聽說MSIE(意外的驚喜)的(舊版本)沒有。 – Alnitak 2013-02-20 20:31:22
謝謝克里斯。但是對我而言,包裝不起作用,僅僅因爲我無法控制強制用戶使用這個包裝函數來創建新元素,事實上這是我需要重寫本機代碼的主要原因,因此用戶可以繼續創建元素與「本機」代碼,我可以添加功能。 – lyxio 2013-02-20 20:33:49
- 1. Git - 我在哪裏可以找到實現.gitignore的源代碼
- 2. 我在哪裏可以找到TextView.setText(..)方法的源代碼?
- 3. 哪裏可以找到java.lang本地方法的源代碼?
- 4. 在哪裏可以找到JQuery方法的實際代碼?
- 5. 我在哪裏可以找到RSA的官方源代碼?
- 6. 我在哪裏可以找到jquery.param的實現代碼?
- 7. 我在哪裏可以找到JavaScript本機函數源代碼?
- 8. 我在哪裏可以找到GCC源代碼中的strncpy()函數的實現?
- 9. 哪裏可以找到tf.image.resize_bicubic的實現?
- 10. 哪裏可以找到「time.h」的實現?
- 11. 哪裏可以找到stdio.h的實現?
- 12. 哪裏可以找到sitemesh 2.4.1源碼?
- 13. 我在哪裏可以找到Vigenere密碼的Java源代碼?
- 14. 哪裏可以得到libc_p.so源代碼?
- 15. 哪裏可以得到Android源代碼?
- 16. @dynamic實現哪裏可以找到它?
- 17. 我在哪裏可以找到Java本機方法實現?
- 18. 尋求源代碼:數組的clone()方法在哪裏實現?
- 19. 哪裏可以找到代碼塊
- 20. 哪裏可以找到代碼隱藏?
- 21. 哪裏可以找到rails項目的`r.element`的源代碼?
- 22. 哪裏可以找到Redhat的nash工具的源代碼?
- 23. 我在哪裏可以找到C++的generic.h的源代碼?
- 24. 哪裏可以找到mac上的C源代碼?
- 25. 在哪裏可以找到Linux系統調用的源代碼?
- 26. 我在哪裏可以找到J2ME的源代碼?
- 27. 我在哪裏可以找到TagLib#庫的源代碼?
- 28. 從哪裏可以找到Glassfish的源代碼附件?
- 29. 哪裏可以找到Mozilla NoScript擴展的源代碼?
- 30. 哪裏可以找到Linux核心命令的源代碼?
這樣的事情是不可能的。如果'alert'或者'console.log'這個或者任何其他的本地函數,你會看到像'function name(){[native code]}' – 2013-02-20 20:09:20
_「我需要重寫document.createElement()」_ - 爲什麼? _「但顯然沒有JavaScript實現」_ - 你不能只重寫本地DOM方法,因爲你只能通過瀏覽器提供的方法與DOM進行交互(除非你編寫自己的瀏覽器)。你可以編寫一個調用內置DOM方法的包裝方法... – nnnnnn 2013-02-20 20:09:24
你到底在做什麼? – epascarello 2013-02-20 20:12:47