创建一个jquery插件:this.html不是一个函数

时间:2011-08-07 19:35:23

标签: jquery-plugins jquery jquery-selectors

我正在关注this documentation并使用它来下载数据并将数据应用到DOM。但是,我似乎无法应用它,因为我得到了:

  

this.html不是函数:this.html(ajax_load);

代码:

(function( $ ){
  $.fn.tasks = function() {

    // there's no need to do $(this) because
    // "this" is already a jquery object

    // $(this) would be the same as $($('#element'));

    $.ajax({
        url: "include/tasks_handler.php?action=gettasks&list=default",
        beforeSend: function() {
            this.html(ajax_load);
        },
        success: function(html){
            this.html(html);
        }
    });

  };
})( jQuery );


$("#taskList").tasks(); 

我也尝试过$(this),这会阻止它破坏,但它不会将内容注入选择器。

想法?

2 个答案:

答案 0 :(得分:6)

ajax选项中的

this是指选项对象,而不是插件的上下文。解决方法是:

var that = this;
$.ajax({
    url: "include/tasks_handler.php?action=gettasks&list=default",
    beforeSend: function() {
        that.html(ajax_load);
    },
    success: function(html){
        that.html(html);
    }
});

这个快速示例演示了正在发生的事情:

var obj = {
    foo: function() {
        alert("bar");
    },
    bar: function() {
        alert(this.foo);
    }
};

obj.bar(); // function() { alert("bar"); }

这个例子更好地展示了正在发生的事情:

var options = {
    success: function(html) {
        this.html(html);
    },
    html: function(html) {
        alert("This is not the .html() you are looking for, move along." + html);     
    } 
}

options.success("some html");

小提琴:http://jsfiddle.net/GTScL/

答案 1 :(得分:1)

您可能想先修复自我执行功能 然后在尝试将其传递给另一个函数之前为html创建一个变量

(function ($) {

      $.fn.tasks = function () {

            var ele = $(this);

            $.ajax({
                    url: "include/tasks_handler.php?action=gettasks&list=default",
                    beforeSend: function() {
                           ele.html(ajax_load);
                    },
                    success: function(html){
                           ele.html(html);
                    }
            });
      };

}( jQuery )); // Bracket goes after