Javascript 调整textarea的事件大小?
当前版本的Firefox和Chrome包含一个拖动处理程序,用于调整Javascript 调整textarea的事件大小?,javascript,jquery,html,events,Javascript,Jquery,Html,Events,当前版本的Firefox和Chrome包含一个拖动处理程序,用于调整框的大小。我需要捕获调整大小事件,我认为使用jQuery的resize()事件会很容易,但它不起作用 我还尝试了正常的onResize事件,但结果是一样的 是否有方法捕获它?在发出调整大小事件之前,您需要首先使textarea可调整大小。您可以通过使用jQuery UI来实现这一点,并在其中调用resize事件 $("textarea").resizable({ resize: function() {
框的大小。我需要捕获调整大小事件,我认为使用jQuery的resize()
事件会很容易,但它不起作用
我还尝试了正常的onResize
事件,但结果是一样的
是否有方法捕获它?在发出调整大小事件之前,您需要首先使textarea可调整大小。您可以通过使用jQuery UI来实现这一点,并在其中调用resize事件
$("textarea").resizable({
resize: function() {
$("body").append("<pre>resized!</pre>");
}
});
$(“textarea”)。可调整大小({
调整大小:函数(){
$(“body”).append(“resized!”);
}
});
检查上的工作示例这是一个老问题,但其他人在IRC中有相同的问题,所以我决定在这里解决它: Chrome不会捕获resize事件,Chrome也不会捕获mousedown,因此您需要设置init状态,然后通过mouseup处理更改:
<textarea></textarea>
<textarea></textarea>
HTML
注意:
resize:vertical
锁定移动
对于更高级的内容,您需要添加其他侦听器,可能是队列和间隔扫描程序;或者使用mousemove,正如我相信jQuery Resizeble所做的那样——问题是,您对性能和性能的评价是多少更新:此后,浏览器的UI发生了变化。现在,双击角可以将文本框收缩为默认大小。因此,您可能还需要捕获此事件前后的更改。另一种方法是绑定到textarea上的mouseup事件。然后您可以检查大小是否更改 textarea不存在调整大小事件 可调整大小的jQueryPlugin看起来不是本地的,所以我们必须使用替代方法 模拟它的一种方法是使用mousedown/click事件。 如果您想要实时事件触发,可以这样做: 2013年11月11日更新:
$(document).ready(function(){
$('textarea').bind('mouseup mousemove',function(){
if(this.oldwidth === null){this.oldwidth = this.style.width;}
if(this.oldheight === null){this.oldheight = this.style.height;}
if(this.style.width != this.oldwidth || this.style.height != this.oldheight){
$(this).resize();
this.oldwidth = this.style.width;
this.oldheight = this.style.height;
}
});
});
演示:我将vol7ron的答案稍微混合了一下,只是用普通的“调整大小”事件的简单触发器替换了“此处调整大小操作”,这样您就可以“像往常一样”将任何想要发生的事情附加到调整大小事件上: 我添加了mousemove事件,因此在调整大小时拖动鼠标时也会触发调整大小,但请记住,当您移动鼠标时,它会经常触发 在这种情况下,您可能希望在实际触发或处理调整大小事件时稍微延迟一点,例如。 替换上述内容:
if(this.resize_timeout){clearTimeout(this.resize_timeout);}
this.resize_timeout = setTimeout(function(){$(this).resize();},100);
与:
示例用法,使第二个文本区域与第一个文本区域一起增长和收缩:
$('textarea_container').bind('mouseup', function()
{ YourCode ; } ) ;
感谢MoonLite-您的脚本工作正常,但有时,如果您快速增加大小,鼠标指针位于mouseup上的文本区域之外,并且不会触发所需的功能。因此,我在包含元素上添加了一个mouseup事件,以使其工作可靠 .
$('textarea_container').bind('mouseup',function()
{YourCode;})
“FireFox现在支持文本区域上的MutationObserver事件,这似乎工作得很好。不幸的是,Chrome仍然需要一个解决方案 根据本页上的其他答案,这里有一个重构和更新版本,当调整
textarea
的大小时,它会触发一个窗口调整事件
我还为离开窗口的鼠标添加了一个事件监听器,iFrame中需要该监听器来检测textarea
何时变大
(function(textAreaChanged){
function store(){
this.x = this.offsetWidth;
this.y = this.offsetHeight;
}
function textAreaEvent(){
if (this.offsetWidth !== this.x || this.offsetHeight !== this.y) {
textAreaChanged();
store.call(this);
}
}
Array.prototype.forEach.call(
document.querySelectorAll('textarea'),
function (el){
el.addEventListener('mouseup', textAreaEvent);
el.addEventListener('mouseout', textAreaEvent);
}
);
window.addEventListener('mouseup',textAreaEvent)
})(function(){
//trigger window resize
var event = document.createEvent('Events');
event.initEvent('resize', true, false);
window.dispatchEvent(event);
});
在IE9及以上版本中,我们可以在不使用jQuery的情况下执行相同的操作
let el = document.querySelector('textarea')
let resizeFn = ()=>{}
let timeout = null
el.addEventListener('mousemove',()=>{
timeout && clearTimeout(timeout)
timeout = setTimeout(resizeFn,250)
})
处理元素大小调整的标准方法是Resize Observer api,可在所有现代web浏览器版本中使用
函数outputsize(){
width.value=textbox.offsetWidth
height.value=textbox.offsetHeight
}
outputsize()
新的ResizeObserver(outputsize)。观察(文本框)
宽度:0
高度:0
调整我的大小。
我对同一问题的另一个版本给出了这个答案。看来这是老新闻了。无论出于什么原因,我都喜欢使用vanilla js,因此这里有一个简洁的vanilla小解决方案:
功能存储维度(元素){
element.textWidth=element.offsetWidth;
element.text高度=element.offsetHeight;
element.value=“它会改变吗?我们还不知道…”;
}
函数onresizeMaybe(元素){
if(element.textWidth==element.offsetWidth
&&element.textHeight==element.offsetHeight)
element.value=“无更改。\n”;
else element.value=“已调整大小!\n”;
元素值+=
`宽度:${element.textWidth}\n`
+`高度:${element.textHeight}`;
}
我发现mousemove事件和setTimeout组合在一起可以很好地解决这个问题
看起来不错,在我的浏览器中看起来不像本地文本区,但这没关系。您仍然需要使用resizeable()来获得跨浏览器支持。我认为这不再有效(目前在JQuery 1.8中进行测试,这在Firefox或Chrome中对我都不起作用。文本区域看起来很糟糕,而且调整大小的句柄根本没有出现。我使用的是JQuery 1.9.1和JQuery UI 1.10.0。尽管小提琴显示了样式表,但你应该提到,这个样式表是必要的。没有样式表,它就不起作用了…)出于某种原因,您的JSFIDLE示例没有调整右侧文本区域和左侧文本区域的大小。我刚刚测试了它。您使用的浏览器是什么?我在一个网站上使用它,没有收到任何投诉。我使用的是Chrome最新版本,在调整大小时没有出现mousedown事件…只有一次鼠标点火。太奇怪了。我被激怒了
$('textarea').eq(0).resize(function(){
var $ta2 = $('textarea').eq(1);
$('textarea').eq(1).css('width',$ta2.css('width')).css('height',$ta2.css('height'));
});
$('textarea_container').bind('mouseup', function()
{ YourCode ; } ) ;
(function(textAreaChanged){
function store(){
this.x = this.offsetWidth;
this.y = this.offsetHeight;
}
function textAreaEvent(){
if (this.offsetWidth !== this.x || this.offsetHeight !== this.y) {
textAreaChanged();
store.call(this);
}
}
$('textarea').each(store).on('mouseup mouseout',textAreaEvent);
$(window).on('mouseup',textAreaEvent);
})(function(){
$(window).trigger('resize');
});
(function(textAreaChanged){
function store(){
this.x = this.offsetWidth;
this.y = this.offsetHeight;
}
function textAreaEvent(){
if (this.offsetWidth !== this.x || this.offsetHeight !== this.y) {
textAreaChanged();
store.call(this);
}
}
Array.prototype.forEach.call(
document.querySelectorAll('textarea'),
function (el){
el.addEventListener('mouseup', textAreaEvent);
el.addEventListener('mouseout', textAreaEvent);
}
);
window.addEventListener('mouseup',textAreaEvent)
})(function(){
//trigger window resize
var event = document.createEvent('Events');
event.initEvent('resize', true, false);
window.dispatchEvent(event);
});
let el = document.querySelector('textarea')
let resizeFn = ()=>{}
let timeout = null
el.addEventListener('mousemove',()=>{
timeout && clearTimeout(timeout)
timeout = setTimeout(resizeFn,250)
})