2009-12-17 163 views
2

我想改變方法DomElement.appendChild()工作不同,當上,我已創建的對象適用於:(覆蓋||擴展)JavaScript方法

// using MooTools; 
var domElement = new Class({...}); 

var MyObject = new domElement(...); 

$(document).appendChild(MyObject); // Error 

// I want to add to (extend) appendChild, to do something specific, when: 
alert(MyObject instanceof domElement); // true 

我能做到這一點通過修改的mootools .js,但我想不惜一切代價避免這種情況,因爲有一天我會確定其他開發者會用更新後的版本覆蓋js文件,而我將因謀殺而被監禁。

請讓我離開監獄!

+0

現在,這確實是:** jailtime阻止共享/公共代碼更新**。我完全支持這一點;如果我能獲得對他們違揹我的意願的事情的特赦,顯然。 – ZJR 2009-12-17 11:05:01

回答

1

我不知道關於MooTools的,但在本地JS一個簡單的方法來做到這一點..

var orgAppendChild = document.appendChild; 
    document.appendChild = localAppendHandler; 


    var domElement = new Class({...}); 
    var MyObject = new domElement(...); 
    // document.appendChild(MyObject); 

    var ss = document.createElement('tr'); 
document.appendChild (ss); 


    function localAppendHandler(MyObject) 
    { 
    if (MyObject instanceof domElement) 
     UrCustomRoutine(MyObject) 
     else 
      orgAppendChild(MyObject); 


    } 

    function UrCustomRoutine(MyObject){ 
    //your custom routine 
    } 

希望這有助於

更新: 從您進一步解釋(處理的appendChild任何DOM元素),我明白沒有通用的方式來定義本地hanlders來捕捉事件。

但有一個解決方法(這是非常醜陋的,我知道)。意味着你必須在使用appendChild之前爲DOM元素定義一個LocalHandler。

這樣 的document.getElementById( 'divTarget')之前的appendChild()

您必須將localhandler重新分配給需要訪問

orgAppendChild = document.getElementById('divTarget').appendChild; 
    document.getElementById('divTarget').appendChild = localAppendHandler; 
    var sss = document.createElement('table'); 
    document.getElementById('divTarget').appendChild(sss); 

另一種替代的元素: 如果你想保持簡單,我建議這種替代方法。創建AppendChild本地方法,接受對象和節點名稱作爲參數。

function AppendChild(MyObject ,Node) 
    { 
      if (MyObject instanceof domElement) 
       //your custom routine 
      else if (Node=="" && (MyObject instanceof domElement==false)) 
       document.appendChild(MyObject); 
      else if (Node!="" && (MyObject instanceof domElement==false)) 
       eval("document.getElementById('" + Node + "').appendChild(MyObject);"); 


    } 

而且

  1. 如果你想添加DOM元素來記錄

    AppendChild(DOMelement,"") 
    
  2. 如果你想DOM元素追加內的其他 容器

    AppendChild(DOMelement,"divTarget") 
    
  3. 如果你想處理您的自定義對象

    AppendChild(customObject,"") 
    

這是做到這一點的最好辦法。

+0

Ramesh,它非常簡單,非常出色。我將檢查mootools和這個解決方案是否有問題。 – 2009-12-17 07:44:42

+0

很高興幫助:-) – RameshVel 2009-12-17 07:46:10

+0

錯誤:未捕獲的異常:[異常...「節點不能插入層次結構中的指定點」代碼:「3」nsresult:「0x80530003(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR)」location:「http:/ /10.0.0.11/lab/theo.aspx行:490「] – 2009-12-17 07:49:00

0

你應該看看使用object.toElement()在你的類

http://blog.kassens.net/toelement-method

那麼就使用document.body的。注入(instanceObject);

+0

爲什麼這是downvoted - 這是通過框架提供的通過mootools的正確和正確的方式。這裏是class to element的另一個例子:http://bit.ly/5BOQ8s – 2010-01-12 10:59:36

0
var originAppend = Element.prototype.appendChild; 
Element.prototype.appendChild = function(el){ 
    // do something to el 
    originAppend.call(this, el); 
}