【问题标题】:Combine multiple text input box's合并多个文本输入框
【发布时间】:2013-11-19 08:03:29
【问题描述】:

所以我有 3 个文本输入区域。这样做的原因是因为我需要一条黑线分隔每一行文本。

我需要想办法让这些文本框看起来像是一个巨大的文本区域。

即- 当您键入时,它会在没有剩余空间时移至下一行,当您删除文本时,它会在需要时将其推回上一行。

有没有人知道我可以实现这一目标的任何变通方法或方法?


我基本上需要做一个人们可以输入的框,看起来和图片一模一样,但是人们只能在蓝色区域输入和编辑。文本“人们将键入的内容的标签”。不能更改、编辑、删除等。

【问题讨论】:

  • 错误的做事方式。使用文本区域。有什么理由让您发现数百个输入比单个文本区域更好?
  • 文本区域通常是方形的。从上图中,由于标签,我需要在第一行缩进文本区域。 @RokoC.Buljan
  • @bryan:你要花几天时间来实现插入、删除、移动、剪切和粘贴文本的每一个行为......我说这在很多层面上都是错误的。你是想模仿纸质表格还是什么?
  • @some 我正在模拟一个必须以某种方式显示的表单。我不介意尝试使用文本区域。我知道这会更容易。它只需要在第一行有那个标签。我可以看到工作并具有非方形文本区域的唯一方法是使用输入框。我愿意接受任何和所有建议。
  • @brian 从你的图片我真的不明白你所说的“缩进”是什么意思

标签: javascript html css textinput


【解决方案1】:

你可以像这样使用纯javascript:

<script type="text/javascript">
function ValidatePassKey(tb) {
  if (tb.TextLength >= 4)
    document.getElementById(tb.id + 1).focus();
  }
  if (tb.TextLength == 0 & tb.id !== 1){
       document.getElementById(tb.id - 1).focus();
  }
}
</script>

<input id="1" type="text" onchange="ValidatePassKey(this)" maxlength="4">
<input id="2" type="text" onchange="ValidatePassKey(this)" maxlength="4">
<input id="3" type="text" onchange="ValidatePassKey(this)" maxlength="4">
<input id="4" type="text" maxlength="4">

这只是在您当前所在的文本框已满时将光标移动到下一个文本框。

【讨论】:

  • 感谢您的建议!但是,如果我决定在 id1 和 id3 上有文本时删除 id2 中的一些文本怎么办?我需要将 id3 中的文本推送到上一行。
  • @bryan -- 再添加一个条件,如果length为0且input不是ID 1,则关注前一个。
  • @tymeJV 聚焦是一回事,在删除时将文本移动到上一行或将文本向前推到下一行并添加文本是我试图解决的另一个怪物。
  • 更多条件检查,如果ID = 2且长度为0且ID 3的值> 0,则从ID 3中取val,放入2,将3的值留空
  • @tymeJV 看起来真的很复杂。因为我必须移动 X 个字符,而不是整行,具体取决于添加或删除的内容。我基本上需要它来充当文本区域。
【解决方案2】:

如果您只为线条使用 3 个 texbox,而不是那样,为什么不使用带有背景图像的 textarea?

看看这个:jsfiddle.net/felipemiosso/Rh82q/

更新:jsfiddle.net/felipemiosso/Rh82q/4/

【讨论】:

  • 我想过这个问题,但是对于文本第一行的必要缩进,我该怎么办? @FelipeMiosso
  • 如果缩进只是第一行。添加一些  进入文本区域。我更新了我的小提琴。
  • 它需要是万无一失的。如果   以某种方式被删除,那么我的文字会越过标签,如果我什至可以弄清楚如何拥有标签的话。我需要模仿上图。
  • 你是对的。事实上,这看起来像废话。我制作了一个脚本来模拟可能对你有用的东西。我现在有一个会议,但如果你愿意,我稍后会添加 cmets。 :)
  • 感谢您的帮助!这看起来真的很有趣,但要让它按照我想要的方式工作,这远远超出了我的专业水平
【解决方案3】:

我认为使用许多文本区域或输入字段是错误的做法。

您可以在下面找到满足缩进的尝试,如果不存在则在开头添加空格。它还添加了一个带有许多

  • 元素的
      元素,以允许您在行下方有线条。如果 textarea 中的文本过多,它也会滚动背景。

      在 Chrome30、FF25 和 IE10 中进行了测试,旨在作为概念验证。如果你要实现这个,你可能应该根据需要动态添加尽可能多的

    • 元素。并且事件应该被正确绑定。

      jsfiddle

      <!doctype html>
      <html>
        <head>
          <style>
            div.mytext {
              position:relative;
              overflow:hidden;
              width:400px;
              height:200px;
            }
            div.mytext > ul {
              position:absolute;
              top:5px;
              left:2px;
              font-weight:bold;
              color:#f00;
              list-style:none;
              width:100%;
              padding:0;
              margin:0;
              z-index:0;
            }
      
            div.mytext >ul> li {
              border-bottom:1px solid #000;
              width:100%;
              height:19px;
            }
      
            div.mytext > ul,
            div.mytext > textarea {
              font-size:12px;
              line-height:20px;
              font-family:courier;
              height:100%;
              width:100%;
              overflow:hidden;
              max-width:100%;
              max-height:100%;
              -moz-box-sizing: border-box;
               box-sizing: border-box;
            }
      
            div.mytext > textarea {
              position:relative;
              background:transparent;
            }
      
          </style>
          <script>
            function update(area) {
              if (!area.value.match(/^[ ]{8}/)) {
                area.value = '        ' +  area.value.replace(/^\s+/,"");
              }
              if (area.selectionStart < 8) {
                area.selectionStart = 8;
              }
            }
      
            function scroll(area) {
              area.parentElement.firstElementChild.scrollTop = area.scrollTop;
            }
          </script>
        </head>
        <body>
          <div class='mytext'>
            <ul>
                <li>Label:</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
                <li>&nbsp;</li>
            </ul>
            <textarea onkeydown='update(this)' onscroll='scroll(this)'></textarea>
          </div>
        </body>
      </html>
      

      解释:

      • 创建一个具有 position:relative 的 div 以设置子元素位置的引用。
      • 创建一个具有 position:absolute 的 ul,其中包含尽可能多的 li 元素。标签进入第一个标签,其他标签有一个不间断的空间以允许进行样式设置。
      • 当我按下一个键时,将调用一个函数,该函数使用正则表达式测试 textarea 的值是否以一定数量的空格开头,如果缺少则添加它们。
      • 如果滚动文本区域,则会调用另一个函数来滚动背景。

      免责声明:这只是一个概念证明,如果要用于生产,还需要做更多的工作。

  • 【讨论】:

    • 这绝对是最接近我要找的东西谢谢!它肯定需要大量的玩耍,但这应该可以帮助我至少进入一个坚实的方向。关于让光标永远不会越过标签的任何提示?
    • @bryan。 element.selectionStart(请参阅此处和 jsfiddle 上的更新代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多