【问题标题】:Submitting data from textarea by hitting "Enter"通过点击“Enter”从 textarea 提交数据
【发布时间】:2009-04-25 20:49:45
【问题描述】:

我有带有 JS 的动态网页。有一个<textarea> 和一个发送 按钮,但没有<form> 标记。如何在<textarea> 中按下Enter 时触发提交 按钮并清除<textarea>

【问题讨论】:

  • 很抱歉误导了您。我读了 textarea 但认为 input type="text" ......删除了我糟糕的答案:)
  • 人们在问为什么不使用输入[文本]而不是文本区域。对我来说,原因是我想让用户只输入一行文本,但我希望文本换行成多行。输入[文本] 不换行

标签: javascript html forms


【解决方案1】:

您可以为 textarea 使用 keyup 处理程序(尽管我不建议这样做*)。

[SomeTextarea].onkeyup = function(e){
  e = e || event;
  if (e.keyCode === 13) {
    // start your submit function
  }
  return true;
 }

*为什么不为此使用文本输入字段? Textarea 特别适用于多行输入,一个用于单行输入的文本输入字段。使用输入处理程序,您可以削弱多行输入。我记得曾经将它用于 XHR(又名 AJAX)聊天应用程序(因此 textarea 的行为类似于 MSN 输入区域),但使用 CTRL-enter 键重新启用了多行输入以换行。这对你来说可能是一个想法吗?监听器将像这样扩展:

[SomeTextarea].onkeyup = function(e){
  e = e || event;
  if (e.keyCode === 13 && !e.ctrlKey) {
    // start your submit function
  }
  return true;
 }

【讨论】:

  • 看起来不错,谢谢。你需要什么线 e = e ||事件; 为?
  • @Alex:firefox、opera 和 safari(以及其他嵌入 webkit 的浏览器)将事件作为参数传递给事件处理程序,但 IE 不会。在 IE 中,事件是全局对象的一个​​属性。令人高兴的是 || 的语义在 JS 中,解决这个问题真的很干净。在 JS 中,表达式a || b 的结果将是a 的值,或者如果a 被认为是假的,则结果将是b。因此,在这种情况下,e = e || event 要么将 e 作为参数传递给它自己,要么将 e 设置为 event,从而让这段代码在所有浏览器中工作。
【解决方案2】:

textarea 中按 Enter 会插入换行符,而不是提交父表单;即使使用常规的表单标签,这也不会以这种方式工作。

不建议尝试解决此行为,因为这会违反用户对文本区域控件在其他网站和其平台上的其他应用程序中的行为方式的期望。

【讨论】:

  • ++ 用于“不可取”的段落。始终知道输入键在网站文本区域中的作用是我在使用其他 GUI 时错过的许多小一致性之一。
  • 虽然我完全同意你的建议,但手头的问题是非常精确的,需要一个真正的答案而不是一个好的建议。仍然+1,但是您不能就如何将某种keyListener 附加到textarea 以按要求在Enter 上提交表单提出建议吗?我比较感兴趣……
  • 我很久以前就赞成这个答案,但在某些情况下,用户并没有真正意识到他正在输入文本区域。以 facebook 聊天的输入行为例。它从单行开始,随着用户键入的更多而垂直扩展。用户期望它在输入时提交是绝对合理的。
  • 这正是我的用例以及研究导致我这篇文章。
  • 这完全取决于 textarea 的使用方式。例如,在 StackOverflow 上,在评论框中按 enter 或 return,将提交评论。
【解决方案3】:

@Shog9 建议我将我的答案复制到此问题的重复版本: 这忽略的一个问题是用户运行输入法(编辑器) - 例如。非拉丁文本输入。我熟悉的 IME 是 OSX 上的 Kotoeri Hiragana IM,但还有许多其他的日语输入法(Kotoeri 单独有多种不同的输入模式,至少还有一种称为 ATOK 的主要输入模式),除了韩文模式,繁体中文和简体中文,以及许多其他鲜为人知的语言。这些输入法存在于所有主要平台(尤其是 Win、Mac 和 Linux)上。

从与您尝试的代码类似的代码的角度来看,他们引入的问题是,确切的物理按键不一定与用户输入的实际输入相对应。

例如,默认在平假名下键入字符序列toukyou<enter> 将产生字符串とうきょう,请注意结果文本中没有<enter>,因为输入确认组合文本。但除此之外,出现的实际字符序列会随着输入的输入而变化:

t // t
と // to
とう // tou
とうk // touk
とうky // touky
とうきょ // toukyo
とうきょう // toukyou

如果当我在 webkit 中实现此功能时记忆有用,则有必要将 keyDown 上的 keyCode 设置为 229,以便在 IME 中键入所有键(与 IE 兼容)——但我不记得 keyUp 的行为是什么。

还值得注意的是,在某些 IME 中,您不一定会收到 keydowns、keypress 或 keyup。否则您将收到多个。或者它们在输入结束时一起发送。

总的来说,这是目前 DOM 事件实现中非常...不干净...的一部分。

【讨论】:

  • 这表明很多人认为他们说的语言每次击键只有一个字符是理所当然的。我就是这么做的。
【解决方案4】:

这是我的解决方案:

在 Javascript 中:

function isEnterPressed(e){
var keycode=null;
if (e!=null){
    if (window.event!=undefined){
        if (window.event.keyCode) keycode = window.event.keyCode;
        else if (window.event.charCode) keycode = window.event.charCode;
    }else{
        keycode = e.keyCode;
    }
}
return (keycode == 13);}

在html中:

<input type="text" onkeyup="if(isEnterPressed(event)){/*do something*/}" />

【讨论】:

    【解决方案5】:

    您是否有理由不使用表单包装器?

    $('#input_id').keypress(function(e){
        if(e.which == 13){
            $('#form_id').submit();
            return false; //prevent duplicate submission
        }
    });
    

    【讨论】:

      【解决方案6】:

      textarea 允许用户输入多行文本,因此,按 Enter 只会在文本中插入新行。如果您想要这种行为,请改用普通文本字段

      【讨论】:

        猜你喜欢
        • 2017-04-08
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多