2014-05-18 96 views
27

我收到此錯誤,它來自jquery框架。 當我嘗試加載文檔準備好的選擇列表時,我得到這個錯誤。 我似乎無法找到爲什麼我得到這個錯誤。未捕獲TypeError:無法讀取undefined屬性'toLowerCase'

它適用於更改事件,但在嘗試手動執行該功能時出現錯誤。

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"); 
     } 
    }); 
} 

回答

27

當您在DOMReady上調用loadTeachers()時,this的上下文將不是#CourseSelect元素。

可以通過對DOM的負載#CourseSelect元件上觸發change()事件解決這個問題:

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

備選地可以使用$.proxy改變功能下運行的上下文:

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

或上述的vanilla JS等價物,bind()

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

它失敗 「when trying to execute the function manually」 因爲你有一個不同的 '本'。當手動調用該方法時,這不會引用您想到的內容,而是其他內容,可能是窗口對象,或手動調用時的任何上下文對象。

1

當您訪問$(this).val()當它通過改變事件稱爲this分給調用者即CourseSelect所以它是工作,並會得到CourseSelect值它導致錯誤。但是當你手動調用它時this指向文檔。所以要麼必須通過CourseSelect對象,要麼直接訪問$("#CourseSelect").val()而不是$(this).val()

12

我有同樣的問題,我試圖聽取一些選擇的變化,實際上問題是我使用的事件,而不是event.target這是選擇對象。

不正確的:

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

正確:

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

在我的特殊情況下的功能,我不得不改變「$(本).VAL(); 「到「$(this.target).val();」 –

+0

'$(this).val()'也是一個正確的用法 –

+0

但是,如果我們能夠幫助它,我們希望避免使用'this'。使用'this'會使代碼更難以維護。 – Bobort

0

您的$(本).VAL()在你的Ajax調用無用武之地,因爲它不是在變化事件功能範圍

可能是您實現了ajax首先調用您的更改事件本身,在這種情況下它工作正常。 但是當你創建一個函數並在change事件中調用該函數時,$(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"); } 
    }); 
} 
2

這對我的作品!

呼叫沒有參數一個功能

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

調用具有參數

$("#CourseSelect").change(function(e1) { 
    loadTeachers($(e1.target).val()); 
}); 
相關問題