推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
isbase
0.31D

Chrome console 出现的 Uncaught TypeError: Cannot read property 'attributes' of undefined 应该怎么排查呢?

  •  
  •   isbase · Nov 11, 2015 via Android · 6838 views
    This topic created in 4011 days ago, the information mentioned may be changed or developed.
    Uncaught TypeError: Cannot read property 'attributes' of undefined
    Uncaught TypeError: Cannot read property 'nodeType' of undefined



    这是出问题代码片段
    element = document.getElementsByTagName('*');
    var l = element.length;
    for (var j = 0; j < l; j++) {
    if (element[j].attributes['class'] != undefined && element[j].attributes['class'].value === 'github') {
    element = element[j];
    }
    }




    我在 console 里手工测试 document.getElementsByTagName('*')[key].attributes['class'] != undefined && document.getElementsByTagName('*')[key].attributes['class'].value === 'github' 是没问题的
    循环中会出现的元素我都在console手工测试过,所以元素明明都是可以使用attributes和nodeType的
    11 replies  •  2015-11-12 13:17:02 +08:00
    tudou527
    tudou527
    Nov 11, 2015
    1
    这个报错不是已经很明确了吗?你要找 xxx.attributes 和 ooo.nodeType ,但是 xxx 和 ooo 不存在。
    oxyflour
    oxyflour
    Nov 11, 2015
    2
    element = element[j];

    说一下你想对 element 做什么奇怪的事情?
    jings
    jings
    Nov 11, 2015 via Android
    3
    @tudou527 泥垢了😅
    ^﹏^
    用原生的 DOM 写是有多累。
    aivier
    aivier
    Nov 11, 2015
    4
    @jings 我觉得比带几百 K 的库好多了,楼主写法比较奇特...所以看着很累,让我写的话,
    document.get....("*").forEach(func (){
    });
    isbase
    isbase
    OP
    Nov 11, 2015 via Android
    5
    @tudou527 就是疑惑为什么会找不到呢 我在 chrome 控制台手工输入是可以找到的
    isbase
    isbase
    OP
    Nov 11, 2015 via Android
    6
    @oxyflour
    @tudou527
    @aivier


    完整代码

    function $(selector) {
    var str = selector.split(' '),
    temp,
    element = document;
    for (var i = 0; i < str.length; i++) {//ID
    if (str[i].indexOf('#') === 0) {
    temp = str[i].replace('#', '');
    element = element.getElementById(temp);
    }
    else if (str[i].indexOf('.') === 0) {//Class
    temp = str[i].replace('.', '');
    element = element.getElementsByClassName(temp)[0];
    }
    else if (str[i].indexOf('#') === -1 && str[i].indexOf('.') === -1 && str[i].indexOf('[') === -1) {//Tag
    element = element.getElementsByTagName(str[i])[0];
    }
    else if (str[i].indexOf('[') === 0 && str[i].indexOf('=') === -1) {//属性
    temp = str[i].replace('[', '').replace(']', '');
    for (var element = element.getElementsByTagName('*'), j = 0; j < element.length; j++) {
    if (element[j].hasAttribute(temp) === true) {
    element = element[j];
    }
    }
    }
    else {//属性值
    temp = str[i].replace('[', '').replace(']', '');
    temp = temp.split('=');
    element = element.getElementsByTagName('*');
    var l = element.length;
    for (var j = 0; j < l; j++) {
    if (element[j].attributes[temp[0]] != undefined && element[j].attributes[temp[0]].value === temp[1]) {
    element = element[j];
    }
    }
    }
    }
    return element;
    }
    xwartz
    xwartz
    Nov 11, 2015
    7
    = = 打个断点就可以查看哪里不对啊。。这样的代码格式,谁愿意看。。
    isbase
    isbase
    OP
    Nov 11, 2015 via Android
    8
    @xwartz 回复不能用 Markdown
    Slienc7
    Slienc7
    Nov 12, 2015 via Android
    9
    可以 gist 贴代码
    逐步 console.log 出来即可
    isbase
    isbase
    OP
    Nov 12, 2015 via Android
    10
    xwartz
    xwartz
    Nov 12, 2015
    11
    @isbase = = 运行了下,没报错
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4848 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 07:57 · PVG 15:57 · LAX 23:57 · JFK 02:57
    ♥ Do have faith in what you're doing.