为什么我会得到一个未定义的函数错误?

时间:2014-12-22 20:05:28

标签: javascript php jquery mysql

我正在尝试使用AJAX从我的数据库中删除数据。我有一个问题列表,它们被分类到一个表中。表中的每一行都有一个我用作按钮的超链接,这些删除按钮的id与数据库中给出的问题具有相同的id。这些删除按钮属于名为' delete_btn'的类。 在' loadDeleteButtons'函数我试图迭代这个数组,并给每个删除按钮一个onclick事件,最终会调用' deleteData'机能的研究。此功能应使用删除按钮' ID'删除给定的问题。并应使用异步查询删除它。 我收到这个错误:

Uncaught Typerror: undefined is not a function

此错误指向' obj.getAttribute(' id')'部分。提前谢谢!

var loadData = function(obj) {
    $.ajax({
        url: 'ReadQuestionList.php?bottom=' + limit.bottom + '&number=' + limit.number,
        type: "GET",
        cache: false,
        success: function (html) {
            obj.html(html);
            setTableWidth(false);
            deleteButtons = document.getElementsByClassName('delete_btn');
            loadDeleteButtons();
        }
    });
};

var loadDeleteButtons = function(){
    for(var obj in deleteButtons){
        deleteButtons[obj].onclick = deleteData(obj);
    }
};

var deleteData = function(obj){
    $.ajax({
        url: 'ReadQuestionList.php?id=' + obj.getAttribute('id'),
        type: "GET",
        cache: false,
        success: function (html) {
            setTableWidth(false);
            loadData(questionTable);
        }
    });
};

3 个答案:

答案 0 :(得分:1)

你有几行使用未定义的变量:

    for(var obj in deleteButtons){

deleteButtons超出了loadDeleteButtons()的范围。在顶部添加var deleteButtons;即可解决此问题。

loadData(questionTable);

questionTable未在任何地方定义。

答案 1 :(得分:1)

此代码会导致deleteButtons成为 HTMLCollection

deleteButtons = document.getElementsByClassName('delete_btn');

此代码遍历该集合的每个对象。假设该类只有一个按钮,集合的对象将是0lengthitemnamedItem

for(var obj in deleteButtons){
  deleteButtons[obj].onclick = deleteData(obj);
}

这些对象都没有getAttribute属性,导致此行失败:

url: 'ReadQuestionList.php?id=' + obj.getAttribute('id')

相反,这样做:

for(var obj = 0 ; obj < deleteButtons.length ; obj++) {
  deleteButtons[obj].onclick = function() {
    deleteData(this);
  }
}

答案 2 :(得分:-1)

由于deleteButtons在ajax回调中定义,因此在声明loadDeleteButtons时可能无法加载。

更好的解决方案是使用jQuery.on委派事件处理程序。

$('body').on('click', '.delete_btn', function(){
    deleteData($(this));
});