2012-11-24 46 views
0

我做了很多调试,但似乎错误发生在我尝试使用“this”在ae2Multi()通过方法传递数组

<html><head> 
<title>Custom</title> 
<style type="text/css"></style> 
<script type="text/javascript"> 
    function ae2(elementName) { 
     var elementObject; 
     var elementType = elementName.charAt(0); 

     if(elementType == "#") { 
      elementObject = document.getElementById(elementName.substr(1)); 
     } else if(elementType == ".") { 
      elementObject = document.getElementsByClassName(elementName.substr(1)); 
     } else { 
      elementObject = document.getElementsByTagName(elementName); 
     } 
     return elementObject; 
    } 

    function ae2Single() { 
     this.innerHTML = "singleIsWorking"; 
    } 

    function ae2Multi() { 
     alert(this); 
     for (var i = 0; i < this.length; i++) { 
      this[i].innerHTML = "it really worked!"; 
     } 
    } 

    Element.prototype.ae2Single = ae2Single; 
    Element.prototype.ae2Multi = ae2Multi; 

    window.onload = function() { 
     ae2(".container").ae2Multi(); 
    } 
</script></head><body><div id="containerMain">hello world!</div><div class="container">hello again!</div><div class="container">hello yet again!</div></body</html> 
+0

什么客户端库您使用? mootools的? –

+0

“发生错误” - 什么错误? – melpomene

+0

没有,那是我用JavaScript链接到的一个文件,我只是将代码放在内联中,以便发布并忘记取出参考。 – AaronEllington

回答

2

当您选择多个元素,你得到一个NodeList,不是Element。所以,你需要编辑NodeList原型:

Element.prototype.ae2Single = ae2Single; 
NodeList.prototype.ae2Multi = ae2Multi; 

getElementById是返回Element看来,其余返回NodeList唯一的一个。

+0

非常棒!我知道它必须是简单的! – AaronEllington

+1

无论如何写1个函数做两个? – AaronEllington

+0

如果我有它,getElementById返回的元素本身返回到节点列表中。这会起作用吗? – AaronEllington

0

即使有人威胁要切断你的手,除非你这样做,否则不要增加原生对象的原型。

编辑:提供这个答案,因为你问:“反正是有写1个功能都做”

function ae2(elementName) { 
    var elementObject; 
    var elementType = elementName.charAt(0); 

    if(elementType == "#") { 
     elementObject = document.getElementById(elementName.substr(1)); 
    } else if(elementType == ".") { 
     elementObject = document.getElementsByClassName(elementName.substr(1)); 
    } else { 
     elementObject = document.getElementsByTagName(elementName); 
    } 

    if(elementObject.length === 1){ 
     //ae2Single 
     elementObject.innerHTML = "singleIsWorking"; 
    } 
    else if(elementObject.length > 1){ 
     //ae2Multi 
     for (var i = 0; i < elementObject.length; i++) { 
      elementObject[i].innerHTML = "it really worked!"; 
     } 
    } 

} 
+1

是的,但是为什么? http://webcache.googleusercontent.com/search?q=cache:http://perfectionkills.com/whats-wrong-with-extending-the-dom/&ie=UTF-8&oe=UTF-8 – bfavaretto