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

Kee*_*ker 6 javascript jquery textarea live autoresize

不久之前,我已经为那些希望他的textarea成长的人解决了一个问题.我做了监听的功能scrollkeyup领域的活动,并重新计算的行数.我想在另一个项目中使用代码,但是有一个问题.textarea不知道为了解决这个问题,我正在使用live而不是bind,所以未来的区域也将被束缚.

现在我发现live执行速度比a慢很多bind.我在jsFiddle上创建了一个简化的例子.上面的textarea表现得像我想要的那样,但由于后期信令(我正在使用Chrome),新添加的内容会闪烁.

我怎样才能做得live那么快bind问题是scroll不能与live声明一起使用.有没有一种方法,使scrolllive是否有一个jQuery事件告诉我已经添加了一个新的TextArea,所以我可以使用bind来添加scroll新创建的元素?

我期待着你的想法.

编辑:更改了代码的链接.删除了scrollingCode.添加了另一个按钮来创建不同的textarea.问题与'滚动'有关.它不会开火.

澄清:我不知道什么函数会创建textarea的.我看到Chrome中动态添加的框闪烁.

对于未来的读者:

在jQuery 1.3.x中,只有以下JavaScript事件(除了自定义事件)才能与.live()绑定:click, dblclick, keydown, keypress, keyup, mousedown, mousemove, mouseout, mouseover, and mouseup.从jQuery 1.4开始,.live()方法支持自定义事件以及所有冒泡的JavaScript事件.从jQuery 1.4.1开始,即使是使用live进行聚焦和模糊(映射到更合适,冒泡,聚焦和聚焦的事件).从jQuery 1.4.1开始,可以指定悬停事件(映射到mouseenter和mouseleave,然后映射到mouseover和mouseout).

gbl*_*zex 4

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

\n\n

更新:当然我可以解决你的问题。你只需要问:) [演示]

\n\n
$(\'textarea.autoresize\').live(\'keyup\', function() {\n    var el = $(this);\n    if (!el.data("has-scroll")) {\n        el.data("has-scroll", true);\n        el.scroll(function(){\n           resizeTextArea(el);\n        });\n    }\n    resizeTextArea(el);\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

重点是,它livebind. 该keyup事件在所有元素上触发(因为live),有条件地添加唯一scroll事件。

\n\n

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

\n\n
// resize text area (fixed version of Pointy\'s)\nfunction resizeTextArea(elem) {\n    elem.height(1); elem.scrollTop(0);\n    elem.height(elem[0].scrollHeight - elem[0].clientHeight + elem.height())\n}\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n