jQuery Plugin init绑定事件到窗口滚动 - 如何传递$ this?

时间:2011-04-22 22:14:24

标签: jquery plugins scope scrolltop

我的第一个插件使用了正确的架构,但我坚持如何将事件监听器应用于$(window).scroll以将globalMessage固定到窗口的顶部。正在进行的完整插件可以在这里看到:https://gist.github.com/937792,但相关位是下面的init。

设置修改目标元素的css属性的窗口事件侦听器的最佳方法是什么?

(function($){

    var methods = {
        init: function(options) {

            var $this = this;
            var opts = $.extend({}, $.fn.globalMessage.defaults, options);
            var data = $this.data('globalMessage');

            // init global data
            if ( ! data ) {
                $this.data('globalMessage', {
                    settings : opts
                });

                $(window).bind("scroll.globalMessage", function() {

                    // ----------
                    // HOW TO ACCESS both $this (defined outside this context)
                    // and the scrollTop value to change top css val?
                    //-----------
                    $this.css("top", $(window).scrollTop());

                });

                $this.bind('click.globalMessage', methods.hide);

            }

            return $this;
        },
        ...[other funcs]...
    }

    ...[main entry point etc]...

})(jQuery);

2 个答案:

答案 0 :(得分:0)

如果您考虑一下,this对象的上下文中就没有methods。所以你需要通过init()调用传递它:

(function($){

    var methods = {
        init: function(sel, options) {

            var $this = $(sel);

然后,当您调用插件时,将this传递给init()方法:

$.fn.yourPlugin = function(method) {
    if (!this.length) {
        return this;
    }
    if (methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
        return methods.init(this, arguments);
    } else {
        $.error('Method ' +  method + ' does not exist on jQuery.yourPlugin');
    }
};

我唯一要注意的是,在设置$this变量时,它实际上是一个jQuery对象,而不是一个特定的元素。所以我用过:

(function($){

    var methods = {
        init: function(sel, options) {

            var $sel = $(sel);

而且,就事件处理程序中的$this而言,您需要重新定义它:

$(window).bind("scroll.globalMessage", function() {
    $this = $('#the_selector_for_your_element'); // Maybe $(this)?
    $this.css("top", $(window).scrollTop());
});

答案 1 :(得分:0)

以正确的方式将vars传递给事件:

$(window).bind("scroll.globalMessage", {foo:'bar'}, function(e) {
   alert(e.data.foo); // alert 'bar'
});