未捕获的类型错误:无法读取未定义的属性“toLowerCase”

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性“toLowerCase”【英文标题】:Uncaught TypeError: Cannot read property 'toLowerCase' of undefined 【发布时间】:2014-07-06 13:02:13 【问题描述】:

我收到此错误,它源自 jquery 框架。 当我尝试在准备好的文档上加载选择列表时,我收到此错误。 我似乎无法找到我收到此错误的原因。

它适用于更改事件,但我在尝试手动执行该功能时遇到错误。

Uncaught TypeError: Cannot read property 'toLowerCase' of undefined -> jquery-2.1.1.js:7300

这里是代码

$(document).ready(function() 
    $("#CourseSelect").change(loadTeachers);
    loadTeachers();
);

function loadTeachers() 
    $.ajax( 
        type: 'GET', 
        url: '/Manage/getTeachers/' + $(this).val(), 
        dataType: 'json', 
        cache: false,
        success:function(data)  
            $('#TeacherSelect').get(0).options.length = 0;    
            $.each(data, function(i, teacher) 
                var option = $('<option />');
                option.val(teacher.employeeId);
                option.text(teacher.name);
                $('#TeacherSelect').append(option);
            );
        ,         
        error: function()  
            alert("Error while getting results"); 
        
    );

【问题讨论】:

【参考方案1】:

当您在 DOMReady 上调用 loadTeachers() 时,this 的上下文将不是 #CourseSelect 元素。

您可以通过在加载 DOM 时触发 #CourseSelect 元素上的 change() 事件来解决此问题:

$("#CourseSelect").change(loadTeachers).change(); // or .trigger('change');

也可以使用$.proxy 更改函数运行的上下文:

$("#CourseSelect").change(loadTeachers);
$.proxy(loadTeachers, $('#CourseSelect'))();

或上面的香草JS等价物,bind()

$("#CourseSelect").change(loadTeachers);
loadTeachers.bind($('#CourseSelect'));

【讨论】:

【参考方案2】:

我遇到了同样的问题,我试图在某些选择上监听更改,实际上问题是我使用的是事件而不是 event.target,它是选择对象。

不正确:

$(document).on('change', $("select"), function(el) 
    console.log($(el).val());
);

正确:

$(document).on('change', $("select"), function(el) 
    console.log($(el.target).val());
);

【讨论】:

在我的特殊情况下,我必须更改 "$(this).val();"到 "$(this.target).val();" 但如果我们能提供帮助,我们希望避免使用this。使用this 会使代码更难维护。 ? 非常感谢!【参考方案3】:

这对我有用!!!

调用不带参数的函数

$("#CourseSelect").change(function(e1) 
   loadTeachers();
);

带参数调用函数

$("#CourseSelect").change(function(e1) 
    loadTeachers($(e1.target).val());
);

【讨论】:

【参考方案4】:

当您访问$(this).val() 时,当它被更改事件this 指向调用者即CourseSelect 时,它会导致错误,因此它正在工作并且将获得CourseSelect 的值。但是当您手动调用它时,this 指向文档。因此,要么您必须传递 CourseSelect 对象,要么直接访问 $("#CourseSelect").val() 而不是 $(this).val()

【讨论】:

【参考方案5】:

它失败了“when trying to execute the function manually”,因为你有一个不同的'this'。这将不是指手动调用该方法时您想到的东西,而是其他东西,可能是窗口对象,或者您在手动调用时拥有的任何上下文对象。

【讨论】:

【参考方案6】:

您的 $(this).val() 在您的 ajax 调用中没有作用域,因为它不在更改事件函数作用域中

可能是您首先在更改事件本身中实现了该 ajax 调用,在这种情况下它可以正常工作。 但是当你创建一个函数并在更改事件中调用该函数时,$(this).val() 的范围无效。

只需使用 id 选择器获取值,而不是

$(#CourseSelect).val()

整个代码应该是这样的:

 $(document).ready(function () 

    $("#CourseSelect").change(loadTeachers);
    loadTeachers();
);

function loadTeachers()

    $.ajax( type:'GET', url:'/Manage/getTeachers/' + $(#CourseSelect).val(), dataType:'json', cache:false,
        success:function(data)
         
            $('#TeacherSelect').get(0).options.length = 0;    

            $.each(data, function(i, teacher) 
            
                var option = $('<option />');
                option.val(teacher.employeeId);
                option.text(teacher.name);
                $('#TeacherSelect').append(option);
            );
        , error:function() alert("Error while getting results"); 
    );

【讨论】:

以上是关于未捕获的类型错误:无法读取未定义的属性“toLowerCase”的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:无法读取未定义的属性 toLowerCase

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

NextJS:未捕获的类型错误:无法读取未定义的属性(读取“属性”)

未捕获的类型错误:无法读取文本字段上未定义错误的属性“toLowerCase”

为啥我会收到“未捕获的类型错误:无法读取未定义的属性 'body'”?

反应和流星“未捕获的类型错误:无法读取未定义的属性'createElement'”