【发布时间】:2009-10-19 04:19:37
【问题描述】:
我想为用户提供一个调整大小的 textarea 控件。我已经尝试过并查看了许多其他实现,但我似乎找不到满足我所有要求的实现。具体来说,我想要一个控件:
- 当页面以标准兼容模式(即非 quirks 模式)呈现时,可在 Windows 上的 IE6、IE7、IE8 以及 Windows 和 OS X 上的 Firefox 3 和 3.5 中运行。
- 不会弄乱撤消缓冲区/撤消堆栈。对于 IE,这是一个特别讨厌的问题——添加节点、删除节点和一些其他 DOM 操作将重置输入缓冲区,这意味着如果实现依赖这些技术,撤消将不会像在标准文本区域控件中那样表现。除了this note 之外,我无法找到有关此错误的更多信息。像 jQuery Auto Growing Plugin 这样的实现会遇到这个问题 - 尝试在 IE 中撤消更改并将其工作方式与标准文本区域进行比较。我添加了一个 example page 来向 JSBin 演示这个问题。
- 具有控件无法增长的最大高度。
- 在删除内容时适当收缩。
- 在按键时不会闪烁或出现异常动作。例如当控件增长到超出其初始大小时,jQuery Auto Growing Textarea 控件的行为会很奇怪,至少在 IE7 中。
- 不要求控件使用固定宽度/等宽字体。
我见过的最接近这种工作方式的是 Facebook 的状态更新字段,它被实现为内容可编辑的 div 元素,但我对使用这样的元素有一些保留,因为使用 div 意味着:
- 需要明确设置边框的样式,这意味着我们最终会得到一个看起来与原生文本区域不同的边框。
- 需要将内容与真实文本区域同步(可能双向同步?)。
- 相对于文本区域的位置放置提示和其他元素时增加了复杂性。
- 虽然这种方法适用于 Facebook 状态更新之类的东西,但它在包含数百个标准输入元素的表单中效果如何?
我在上面列出的内容代表了“最终调整文本区域的大小”——解决了我认为现有方法存在的问题。这样的控制存在吗?能不能写出这样的控件?
【问题讨论】:
-
“它在包含数百个标准输入元素的表单中效果如何?”很多这样的超级文本区域会在同一个页面上使用吗?
-
可能,是的。 Facebook(甚至是 Google Docs)的问题在于,它们只需要处理页面上的单个 contentEditable 元素,这显然比处理 20+ 元素要简单得多。
标签: javascript widget