如何在 Live() 上绑定滚动事件?

2024-04-26

不久前我为某人解决了一个问题希望他的文本区域变大 https://stackoverflow.com/questions/4717635/jquery-building-an-autoresizing-textarea-that-doesnt-flash-on-resize。我做了一个函数来监听scroll and keyup该区域的事件并重新计算行数。我想在另一个项目中使用该代码,但出现了问题。文本区域不知道为了解决这个问题,我正在使用live代替bind,这样未来的区域也将被绑定。

现在我发现live执行速度比bind。我已经创建了jsFiddle 上的简化示例 http://jsfiddle.net/KeesCBakker/2D8Kf/。上面的文本区域的行为符合我的要求,但由于信号延迟(我使用的是 Chrome),新添加的文本区域会闪烁。

我怎样才能使live一样快bind?问题是scroll不能与live陈述。有没有办法启用scroll for live?是否有一个 jQuery 事件向我发出信号,表明已添加新的 TextArea,以便我可以使用绑定来添加scroll在新创建的元素上?

我期待您的想法。

EDIT:更改了代码链接。删除了滚动代码。添加了另一个按钮来创建不同的文本区域。问题与“滚动”有关。它不着火。

澄清:我不知道什么函数将创建文本区域。我看到动态添加的框在闪烁Chrome.

对于未来的读者:

在 jQuery 1.3.x 中只有以下内容 JavaScript 事件(除了 自定义事件)可以绑定 。居住():click, dblclick, keydown, keypress, keyup, mousedown, mousemove, mouseout, mouseover, and mouseup。作为 jQuery 1.4 的 .live() 方法 支持自定义事件以及所有 冒泡的 JavaScript 事件。作为 jQuery 1.4.1 甚至可以进行焦点和模糊工作 与现场(映射到更多 适当的、冒泡的、事件集中的 和对焦)。从 jQuery 1.4.1 开始 可以指定悬停事件(映射 mouseenter 和 mouseleave,其中, 依次映射到鼠标悬停和 鼠标移开)。


答案很简单。scroll是防止闪烁的原因,因为它会在调整大小的第一刻触发。但scroll没有影响live(因为它不会冒泡),因此您新创建的文本区域将调整大小keyup但它会稍后触发(因此闪烁)。

Update:当然我也可以解决你的问题。你只需要问:)[Demo http://jsbin.com/jquery-autoresize/]

$('textarea.autoresize').live('keyup', function() {
    var el = $(this);
    if (!el.data("has-scroll")) {
        el.data("has-scroll", true);
        el.scroll(function(){
           resizeTextArea(el);
        });
    }
    resizeTextArea(el);
});

重点是它混合了live with bind. The keyup事件,在所有元素上触发(因为live),添加了独特的scroll有条件的事件。

Update 2:哦,顺便说一句,您的整个调整大小代码可以更好地编写为:

// resize text area (fixed version of Pointy's)
function resizeTextArea(elem) {
    elem.height(1); elem.scrollTop(0);
    elem.height(elem[0].scrollHeight - elem[0].clientHeight + elem.height())
}​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Live() 上绑定滚动事件? 的相关文章