【发布时间】:2011-01-10 14:33:39
【问题描述】:
是否可以在 jQuery 中创建一个可以绑定到任何样式更改的事件侦听器?例如,如果我想在元素更改尺寸或样式属性中的任何其他更改时“做”某事,我可以这样做:
$('div').bind('style', function() {
console.log($(this).css('height'));
});
$('div').height(100); // yields '100'
真的很有用。
有什么想法吗?
更新
很抱歉我自己回答了这个问题,但我写了一个可能适合其他人的简洁解决方案:
(function() {
var ev = new $.Event('style'),
orig = $.fn.css;
$.fn.css = function() {
$(this).trigger(ev);
return orig.apply(this, arguments);
}
})();
这将临时覆盖内部prototype.css 方法,并在最后使用触发器重新定义它。所以它是这样工作的:
$('p').bind('style', function(e) {
console.log( $(this).attr('style') );
});
$('p').width(100);
$('p').css('color','red');
【问题讨论】:
-
是的,不错的解决方案,但在实际应用程序中,我怀疑这可能会占用大量资源,甚至会使浏览器看起来跟不上用户的交互速度。我很想知道是不是这样。
-
@pixeline:我看不出它应该慢得多。无论如何,jQuery 仍然调用 css 原型,我只是向它添加了一个触发器。所以它基本上只是一个额外的方法调用。
-
我明白:似乎在用户与应用程序交互的流程中,css() 被调用了很多时间。根据您对该触发器的操作(如果它只是一个控制台日志,我想您当然是安全的),这可能会产生问题。我是在想。这也取决于应用程序。我个人倾向于在我的东西中做很多视觉反馈。
-
要使其与现有的 jquery css 调用一起工作,还需要做更多的事情:1)您希望从新的 css 函数中返回元素,否则它将破坏流畅的样式 css 调用。例如。 $('p').css('display', 'block').css('color','black');等 2)如果它是对属性值的调用(例如,'obj.css('height');')你会想要返回原始函数的返回值 - 我通过检查参数列表来做到这一点因为该函数只包含一个参数。
-
我为这种方法制作了一个更强大的版本,当 style 属性本身 被删除时也可以使用。它将为以这种方式删除的每种样式抛出一个“样式”事件。 gist.github.com/bbottema/426810c21ae6174148d4
标签: javascript jquery