【问题标题】:Passing an Array through a Method通过方法传递数组
【发布时间】:2012-11-12 08:03:22
【问题描述】:

我已经做了很多调试,但似乎错误发生在我尝试在ae2Multi() 中使用“this”时。

<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>

【问题讨论】:

  • 您使用的是什么客户端库? mootools?
  • “发生错误” - 什么错误?
  • 无,这是我用 javascript 链接到的文件,我只是将代码放入内联代码中以便于发布并且忘记取出参考。
  • TypeError: 'undefined' is not a function (evalating 'ae2(".container").ae2Multi()')

标签: javascript arrays parameter-passing


【解决方案1】:

当您选择多个元素时,您会返回 NodeList,而不是 Element。所以你需要编辑NodeList原型:

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

getElementById 似乎是唯一一个返回 Element 的,而其余的返回 NodeList

【讨论】:

  • 有没有写1个函数来做这两个?
  • 如果我让它把getElementById返回的元素自己放到一个节点列表中。这行得通吗?
  • 我不明白为什么需要增加 NodeList 或 Element 的原型——这并不聪明。为什么你不能只处理你在第一个函数中所做的事情而不是返回元素?
  • @AaronEllington 您可以改用document.querySelectorAll,它总是会返回NodeList
【解决方案2】:

即使有人威胁要砍掉你的手,也不要扩充原生对象的原型,除非你这样做。

编辑:提供此答案是因为您问“是否无论如何要编写 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!";
        }
    }

}

【讨论】:

猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2016-07-30
相关资源
最近更新 更多