Javascript 行为上的奇怪变化-<;textarea>;在Windows 8.1中
我们的应用程序是针对Windows 8的HTML5/WinJS Google Talk应用程序。我们有一个用于聊天输入的文本区域。我们为它设置了一个最大高度,并通过编程将高度设置为最大值 因此,在达到该最大值后,它将overflowY设置为滚动。这一直很有效。然而,当我们在Windows8.1上测试我们的应用程序时,它有一个问题。每当我们在输入上键入Javascript 行为上的奇怪变化-<;textarea>;在Windows 8.1中,javascript,html,css,windows-8,windows-8.1,Javascript,Html,Css,Windows 8,Windows 8.1,我们的应用程序是针对Windows 8的HTML5/WinJS Google Talk应用程序。我们有一个用于聊天输入的文本区域。我们为它设置了一个最大高度,并通过编程将高度设置为最大值 因此,在达到该最大值后,它将overflowY设置为滚动。这一直很有效。然而,当我们在Windows8.1上测试我们的应用程序时,它有一个问题。每当我们在输入上键入时,键入的每个字符的高度都会增加3倍。所以当你打字的时候,这个盒子会越来越大,即使它只有5个字母,而且不需要换行。由于某些原因,滚动高度或高度未
时,键入的每个字符的高度都会增加3倍。所以当你打字的时候,这个盒子会越来越大,即使它只有5个字母,而且不需要换行。由于某些原因,滚动高度或高度未正确更新
这是绑定到oninput的函数。我们说,如果客户端高度超过350px,则将其设置为滚动
.inputField {
-ms-grid-row: 2;
-ms-grid-column: 2;
font-size: 19px;
height: 30px;
min-height: 30px;
max-height: 350px;
overflow: hidden;
}
我们使用“-5”,因为出于某种原因,卷轴的高度似乎总是比原来大5倍。这是我们的黑客解决方案。在8.1中,它似乎要高出8px。但是(在8.1中)当我们清除文本字段(Ctrl-A然后点击Backspace)时,它不会重置文本区域的高度,但在Windows8中确实如此
我认为我们在JavaScript方面的做法是错误的,完全可以接受建议
如果我能提供更多信息,请告诉我 我注意到,Windows8的javascript会导致css之间的大量冲突。我正在开发一个应用程序,其中一半的时间我只是试图修复由冲突的css或全局变量引起的视觉错误。您是否使用各种css文件并在它们之间声明相似的名称?(如中所示,假设您在其中声明了file1.css和.inputField,在本页中,您使用不同的atributes声明了file2.css和.inputField)而不是使用Javascript代码,我将创建一个添加溢出滚动的类
然后使用jquery检查文本区域的高度,当它达到最大高度时,添加类以使文本区域溢出滚动
代码应该更容易一眼就能理解
e、 g
希望这能解决你的问题。哦,移除高度并将其更改为min height:30px代码>我自己做了一些测试。不幸的是,我没有Win8.1,我只有Win8
所以我在chrome和IE10的Win8上进行了测试,结果一切都很奇怪!无论如何,如果我设置e.target.style.height=(e.target.scrollHeight-18)+“px”代码>接近字体大小
,它开始表现得更合理
现在它可以在chrome、firefox和IE10(Win8)中运行
这里是JSFIDLE,所有人都可以查看它:
因此,您可以在Win8.1中查看它,也许它对您来说足够好,可以保留它 我改进了Windkiller的小提琴
我包含了一个调试器div,它演示如何使用选定元素的数据属性来存储和检索数据,而不影响DOM
在最后一个字符长度大于当前字符长度的事件(即“输入”)中,高度被指定为初始高度的大小,然后被指定为scrollHeight的值
我在这个样本中也使用了“他们”单元
此外,我在css样式中添加(声明)了一个线条高度,并特别声明了overflow-x
HTML
<textarea class="inputField" style="height:2em;font-size: 19px;" id="inputField" placeholder="Type your message"></textarea>
<div id='debugger'>
<div>0 current characters</div>
<div>0 last characters</div>
</div>
jsiddle:.inputField
仅在此css文件中声明。不过,我认为我们目前的解决方案非常易变。我确实发现有一种类似“克隆”的方法,你有一个隐藏的div,你取它的值,在div中设置它,然后取div的高度,然后将div的高度设置为这个值。看起来有点粗糙,但是:/尝试先删除高度,然后选择最小高度
if ($('textarea').height => 350) { $('textarea').addClass('overflowY');}
<textarea class="inputField" style="height:2em;font-size: 19px;" id="inputField" placeholder="Type your message"></textarea>
<div id='debugger'>
<div>0 current characters</div>
<div>0 last characters</div>
</div>
$('#inputField').data('lastCharCount', 0);
$('#inputField').bind('input', function (e) {
$(this).data('CharCount', e.target.value.length);
$('#debugger').html('<div>' + $(this).data('CharCount') + ' current character(s)</div>');
if (e.target.clientHeight >= 350 && e.target.style.overflowY != "scroll") {
e.target.style.overflowY = "scroll";
} else if (e.target.clientHeight < 350) {
e.target.style.overflowY = "hidden";
}
if ($(this).data('CharCount') > $(this).data('lastCharCount')) {
e.target.style.height = ((e.target.scrollHeight) / e.target.style.fontSize.replace('px', '')) + "em";
/* A change in character length occurred */
} else if ($(this).data('CharCount') < $(this).data('lastCharCount')) {
e.target.style.height = '2em';
e.target.style.height = ((e.target.scrollHeight + 1) / e.target.style.fontSize.replace('px', '')) + "em";
/* A change in character length occurred */
} else {
/* No change in character length occurred. Possible character replaced */
}
$('#debugger').append('<div>' + $(this).data('lastCharCount') + ' last character(s)</div>');
$(this).data('lastCharCount', $(this).data('CharCount'));
});
body {
font-size:14px;
}
.inputField {
-ms-grid-row: 2;
-ms-grid-column: 2;
min-height: 2em;
max-height: 350px;
overflow: hidden;
overflow-x:hidden;
padding:0em;
line-height:1em;
}