2011-08-07 72 views
4

我在关注this documentation并使用它下载和应用数据到DOM。不过,我似乎没有能够为我得到应用它:创建一个jQuery插件:this.html不是函数

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(); 

我也试过$(本),这会让其停止破坏,但它不是注入的内容选择。

想法?

+3

使用'$(本)',使其具有'.html'方法的jQuery对象之前创建HTML的变量。发布什么*然后*作为问题(因为这是真正的问题:) –

+0

@FLX:你想用'this'来引用什么? – PeeHaa

+1

此外,'this'不可用于beforeSend回调的范围..您必须执行'var somevar = this;'使其在回调内可见 - 有趣的是这个范围规则。 – Erik

回答

6

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

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/

+0

真棒,谢谢karim! – FLX

1

您可能要首先修复你自己执行的功能然后10试图把它传递到另一个函数

(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