我的第一个插件使用了正确的架构,但我坚持如何将事件监听器应用于$(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);
答案 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'
});