无法调用未定义的方法

时间:2013-04-19 14:55:43

标签: javascript

所以我制作了这段代码,它几乎完美无缺。一件事是setupListener方法最后返回一个错误,可能它找到了我不想找到的属性。我一直在努力解决这个问题,但我显然没有那么多经验来解决它。我已经设置了一些console.log方法进行调试。你使用这个函数:setupListener(Id or Class or a Tag name as string, event to watch on as string, and an action);

例如。 setupListener('.pun', 'click', function (e){ console.log(e); });

    var getElement = function (onStr) {
    if (onStr.indexOf('.') === 0) {
        onStr = onStr.slice(1);
        return document.getElementsByClassName(onStr);
    } 

    if (onStr.indexOf('#') === 0) {
        onStr = onStr.slice(1);
        return document.getElementById(onStr);
    } 

    if (onStr.indexOf('#') !== 0 && onStr.indexOf('.') !== 0) {
        return document.onStr = document.getElementsByTagName(onStr);
    }
};

var setupListener = function (elementStr, eventStr, action) {
    var tempElement = getElement(elementStr);

        // element a collection and has addEventListener method
        if (tempElement.length > 1 && tempElement[1].addEventListener) {
            for (var i = 1; tempElement.length >= i; i++) {
                if (typeof(tempElement[i].addEventListener) !== "undefined")
                    console.log('1'); //debugging
                    tempElement[i].addEventListener(eventStr, action);
            }   
        }

        // IE < 9 Support
        // element a collection and has NOT addEventListener method
        else if (tempElement.length  > 1 && !tempElement[1].addEventListener) {
            for (var i = 1; tempElement.length >= i; i++) {
                if (typeof(tempElement[i].addEventListener) !== "undefined")
                    console.log('2'); // debugging
                    tempElement[i].attachEvent(eventStr, action);
            }
        }

        // element not a collection and HAS addEventListener method
        else if (!tempElement.length > 1 && tempElement.addEventListener) {
            console.log('3'); // debugging
            tempElement.addEventListener(eventStr, action);
        }

        // element not a collection and has NOT addEventListener method
        // IE < 9 support
        else if (!tempElement.length > 1 && !tempElement.addEventListener) {
            console.log('4'); // debugging
            tempElement.attachEvent(eventStr, action);
        }

    else { 
     console.log('5'); // debugging
    }
};

1 个答案:

答案 0 :(得分:0)

你的问题出在元素集合的一部分。请注意,您按array[0]获取数组的第一个元素,因此您可以通过array[array.length-1]获取最后一个元素。但是,当您迭代数组时,您正在做的是从1开始并迭代到array.length。当您尝试访问不可用的数组元素(array[array.length])时,您将获得undefined,这就是您的错误所说的内容。所以你必须改变for - 循环中的界限。即。

for (var i = 0; i < tempElement.length; i++)