【问题标题】:Cannot read property '0' of undefined -- JavaScript无法读取未定义的属性“0”——JavaScript
【发布时间】:2014-08-18 21:42:43
【问题描述】:

我的目标:选中复选框后,启用相关元素。

这是我的 JavaScript。据我了解,this 是输入。因此,调用parentNode 将上升到checkbox div。然后我设置parent_1,即col-md-3 div。然后我将child 设置为parent_1 的下一个兄弟,即下一个col-md-3 div。但我得到了错误

Uncaught TypeError: Cannot read property '0' of undefined 

错误位置是输入。

function selectElement(object) {
    var parent = object.parentNode;
    var parent_1 = parent.parentNode;
    var child = parent_1.nextSibling;
    if (parent.children[0].checked == true) {
        child.children[0].disabled = false;
    } 
    else {
        child.children[0].disabled = true;
    }
}

这是我的 HTML:

<div class="col-md-3">
    <div class="checkbox checkbox-primary">
        <input type="checkbox" id="fast_dd" onClick="selectElement(this);">
        <label for="fast_dd">Anomalies</label>
    </div>
</div>
<div class="col-md-3">
    <select name="fast" class="selectpicker" disabled>
        <option>Options</option>
    </select>
</div>

编辑 - 完全不知道为什么我写了parent.children[0] 而不仅仅是object,我很笨拙

编辑 2 - 将标题更改为更准确

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    你快到了。

    你想要的是获取下一个元素,不一定是下一个 DOM 节点(即文本节点)。

    改用这个 JS:

    function selectElement(object) {
        var parent = object.parentNode;
        var parent_1 = parent.parentNode;
        var child = parent_1.nextElementSibling; //nextElementSibling instead of nextElement
        if (object.checked == true) { // use object instead of parent.children
            child.children[0].disabled = false;
        } 
        else {
            child.children[0].disabled = true;
        }
    }
    

    这是一个小提琴:http://jsfiddle.net/1hzmwd7w/2/

    【讨论】:

    • +1。文本节点存在是因为两个元素之间有一个换行符。如果您不知道,这是一个常见的错误。
    • 是的。我犯这个错误的次数比我在这里承认的要多。 :)
    • 太棒了!谢谢你。这让我感到困惑,因为您的 JSFiddle 运行良好,而我的仍然没有。我删除了 Selectpicker 类,它现在可以完美运行。如果您正在阅读本文并且正在使用 Selectpicker,请寻找另一种风格!
    【解决方案2】:
    var isClassMember = function (element, classname) {
        var classes = element.className;
        if (!classes) {
            return false;
        };
        if (classes == classname) {
            return true;
        };
        var whitespace = /\s+/;
        if (!whitespace.test(classes)) {
            return false;
        };
        var c = classes.split(whitespace);
        for (var i = 0; i < c.length; i++) {
            if (c[i] == classname) {
                return true;
            };
        };
        return false;
    };
    var getElements = function (classname, tagname, root, firstFlag, depth) {
        if (!root) {
            root = document;
        }
        else {
            if (typeof root == "string") {
                root = document.getElementById(root);
            };
        };
        if (!tagname) {
            tagname = "*";
        };
        if (depth) {
            var maxRecursion = depth;
            var all = (function getChildsElementsLevel(root, tagName, currentLevelNumber) {
                var result = [],
                    currentLevelChilds = (function getLevelChilds(root, tagName) {
                        var result = [];
                        var children = root.firstChild;
                        do {
                            if (children.nodeName == tagName) {
                                result.push(children);
                            };
                        } while (children = children.nextSibling);
                        return result;
                    })(root, tagName),
                    currentLevelChildsLength = currentLevelChilds.length,
                    nextLevelNumber = ++currentLevelNumber;
    
                for (var f = currentLevelChildsLength; f--;) {
    
                    var currentEl = currentLevelChilds[f];
                    result.push(currentEl);
                    if (nextLevelNumber < maxRecursion) {
                        result.concat(getChildsElementsLevel(currentEl, tagName, nextLevelNumber));
                    }
                }
                return result;
            })(root, tagname, 0);
        }
        else {
            var all = root.getElementsByTagName(tagname);
        }
        if (!classname) {
            return all;
        };
        var elements = [],
            allLength = all.length,
            isMyClass = isClassMember;
        if (firstFlag) {
            for (var i = 0; i < allLength; i++) {
    
                var element = all[i];
                if (isMyClass(element, classname)) {
                    return element;
                };
            };
        }
        else {
            for (var i = allLength; i--;) {
    
                var element = all[i];
                if (isMyClass(element, classname)) {
                    elements.push(element);
                };
            };
        }
    
        return elements;
    };
    function toArray(Lcollection) {
        for (var i = 0, a = [], len = Lcollection.length; i < len; i++) {
            a.push(Lcollection[i]);
        };
        return a;
    };
    
    (function () {
        function init() {
            var myDIV = getElements("checkbox-primary", "DIV", null, true);
            if (myDIV && myDIV.childNodes) {
                var myArray = toArray(myDIV.childNodes),
                    myArrayLength = myArray.length,
                    myCheckBox = null;
    
                for (var i = 0; i < myArrayLength; i++) {
                    var tempNode = myArray[i];
                    if (tempNode.nodeName.toUpperCase() === "INPUT" && tempNode.type.toUpperCase() === "CHECKBOX") {
                        myCheckBox = tempNode;
                        break;
                    };
                };
                if (myCheckBox) {
                    if (myCheckBox.checked) {
                        myCheckBox.disabled = false;
                    }
                    else {
                        myCheckBox.disabled = true;
                    }
                };
            };
        };
        if (this.addEventListener) {
            this.addEventListener("load", init, false)
        }
        else {
            window.onload = init;
        }
    }());
    

    【讨论】:

      【解决方案3】:

      您可以通过一种非常简单的方式做到这一点。

      为您的选择标签添加一个 ID

       <select name="fast" id="fast" class="selectpicker" disabled>
      

      并使用此 javascript 检查点击事件并处理操作。

      function selectElement(object) {
       if (object.checked == true) {
           document.getElementById("fast").disabled = false;
       } 
       else {
           document.getElementById("fast").disabled = true;
       }
      }
      

      【讨论】:

      • 我这样编码是因为我需要它来处理其他具有不同 ID 的元素。常见的结构是选择元素位于输入 div 正下方的 div 中。
      • 这门课不适合你吗?或者它可能是一个未知元素?
      • 巧妙地使用 DOM 总比笨重的 getElementById 要好。
      • @sebcap26 什么意思?
      • 权衡是可读性。正如@sebcap26 指出的那样,getElementById 方法可能会很慢,因此通常使用 DOM 上下文会更快。需要注意的是,DOM 遍历比 getElementById 调用更难阅读。虽然我个人通常选择 DOM 遍历,所以我不必用 id 来装饰所有东西。以下是一些有用的链接:youtube.com/watch?v=mHtdZgou0qU、stackoverflow.com/questions/1716266/…、jonraasch.com/blog/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多