是什么导致我的"未捕获的TypeError:无法读取属性' toLowerCase'未定义"错误?

时间:2016-02-01 06:47:42

标签: javascript jquery dom

仅供参考,我已经阅读了相关帖子Uncaught TypeError: Cannot read property 'toLowerCase' of undefined,并试图实现这个想法。尽管如此,我还是获得了经典

  

未捕获的TypeError:无法读取属性' toLowerCase'未定义的

错误,我不知道我的代码中的哪一行来自jQuery中的错误点。我的代码是

    ReadinessColorSetter = (function () {

        this.ColorToRange = {
            '#f65314': [0, 30],
            '#ffbb00': [31, 70],
            '#7cbb00': [70, 100]
        }

        this.SetReadiness = function (ipt) {
            // ipt: input element containing
            var val = $(this).val(),
                newcolor = "#FFF"; // default
            for (var hexcode in this.ColorToRange) {
                var range = this.ColorToRange[hexcode];
                if (val >= range[0] && val < range[1]) {
                    newcolor = hexcode;
                    break;
                }
            }
            $(ipt).parent().children().last().css('background-color', newcolor);
        }

        return this;
    })();

    // On page load, set the color of the readiness       
    $(function () {
        $('input[class="completeness"]').each(function (el) {
            ReadinessColorSetter.SetReadiness(this);
        });
    });

    // When the readiness value is changed, set the color of the readiness
    //$('input[class="completeness"]').change(function () {
        //ReadinessColorSetter.SetReadiness(this);
    //});
    $(document).on('change', $('input[class="completeness"]'), function (el) {
        ReadinessColorSetter.SetReadiness($(el.target));
    });

    $('#change-submitted').click(function () {
        alert('Change submitter clicked'); // TEST
    });

正如您所见,我已经评论了我认为的问题,并尝试实施正确的修复。

关于这个问题的任何指导?

2 个答案:

答案 0 :(得分:5)

这似乎无效:

 $(document).on('change', $('input[class="completeness"]'), function (el) {
 //-----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----it should be a string

正如您所看到的,您已经在描述中传递了一个jquery对象,您应该看到它需要一个css选择器字符串,如:

 $(document).on('change', 'input.completeness', function (el) {

并在方法中:

var val = $(ipt).val(),

并且if条件应为:

if (val >= range[0] && val <= range[1]) {
    newcolor = hexcode;//--^^----------------should be less than equal instead
    break;
}

答案 1 :(得分:0)

看着:

 // On page load, set the color of the readiness       
$(function () {
    $('input[class="completeness"]').each(function (el) {
        ReadinessColorSetter.SetReadiness(this);
    });
});

$ .each()闭包有[index,elements]的参数,你要将未包装的元素发送到你的SetReadiness函数,你应该做类似的事情:

(function () {
    $('input[class="completeness"]').each(function (index, elem) {
        ReadinessColorSetter.SetReadiness(elem);
    });
})();

你的代码中还有一个错误,你在jQuery元素对象中多次包装元素,这导致两个不同类型的对象被发送到你的SetReadiness函数,它是一个案例中的标准元素对象和一个jQuery元素另一种情况下的对象。

将函数输入规范化为标准元素对象或jQuery元素对象,这样做可以消除混乱的代码,即。

    this.SetReadiness = function (ipt) {
        // ipt: element pre wrapped inside of a jQuery object.

        var val = ipt.val(),
            newcolor = "#FFF"; // default
        for (var hexcode in this.ColorToRange) {
            var range = this.ColorToRange[hexcode];
            if (val >= range[0] && val < range[1]) {
                newcolor = hexcode;
                break;
            }
        }
        ipt.parent().children().last().css('background-color', newcolor);
    }

让您使用一个将纯jQuery元素对象作为参数的函数,或者您可以发送标准元素对象,然后将其包装在SetReadiness函数中的jQuery元素对象中。

希望这能解决您遇到的一些问题,每当收到未定义的错误时,请始终检查是否在$(对象)中包装有效对象。

标准化这样的一切将清除您的错误并为您提供干净且可读的代码。我没有查看代码的功能,只专注于清除未定义的错误。