【问题标题】:How can PHP determine if the user pressed the Enter key or Submit button?PHP 如何判断用户是否按下了 Enter 键或 Submit 按钮?
【发布时间】:2010-10-22 03:53:01
【问题描述】:

我遇到的问题是我在一个表单中有多个提交输入。这些提交输入中的每一个都有不同的值,我更愿意将它们保留为提交。

每当用户按下 Enter 时,就好像按下了最上面的提交输入,因此它会导致代码检查哪个输入被点击了问题。

有没有办法让 PHP 确定输入是否被点击,或者只是用户按下 Enter 键时选择的输入?

【问题讨论】:

标签: php forms submit form-submit


【解决方案1】:

如果您的 HTML 结构正确,您可以确定使用了哪个按钮

<input type="submit" name="action" value="Edit">
<input type="submit" name="action" value="Preview">
<input type="submit" name="action" value="Post">

$_POST 数组(或$_GET/$_REQUEST)将包含键“action”和所执行按钮的值(无论是否单击)。

现在,“点击”显然是一种客户端行为 - 如果您想区分点击和按键,您需要在表单中添加一些脚本来帮助确定。

编辑

或者,您可以“偷偷摸摸”并使用隐藏的提交,该提交应该正确识别提交的按键,但这可能会对可访问性产生一些重大影响。

<?php

if ( 'POST' == $_SERVER['REQUEST_METHOD'] )
{
    echo '<pre>';
    print_r( $_POST );
    echo '</pre>';
}

?>
<form method="post">

    <input type="text" name="test" value="Hello World">

    <input type="submit" name="action" value="None" style="display: none">
    <input type="submit" name="action" value="Edit">
    <input type="submit" name="action" value="Preview">
    <input type="submit" name="action" value="Post">

</form>

【讨论】:

  • 这仅在您单击按钮时有效。当您在其中一个文本输入中按 Enter 时,它不起作用。
  • 嗯...是的。源顺序的第一个将被浏览器“选择”为提交参与者。
  • 是由浏览器而不是用户选择的。
  • Roberto,按下回车键时选择源中的第一个提交按钮。因此,无论用户是否知道,用户都可以通过按 Enter 来选择它。
  • 好吧,首先,如果您没有将可访问性作为当前要求的一部分,请不要担心。用您网站的单一功能解决它是愚蠢的,但在您的结构中的其他任何地方都忽略它。其次 - 我不确定。我不是可访问性专家 - 我只是对网络问题的“聪明”解决方案非常谨慎,因为它们经常给这些类型的受众带来麻烦。
【解决方案2】:

罗伯托,

PHP 是服务器端技术,因此在服务器上运行 - 因此它无法确定在客户端(也就是用户)按下了哪些键。也就是说,当然,除非您专门对客户端进行编码以在服务器请求中包含此类信息(发布表单数据也是一种请求形式)。

实现这一目标的一种方法是在您的客户端代码中使用 Javascript。

查看此页面作为有关使用 Javascript 处理表单提交事件的起点。 http://www.w3schools.com/jsref/jsref_onSubmit.asp

您可能还必须为页面上的按键事件添加侦听器,以便捕获用户按下 Enter 键并记录此信息。 http://www.howtocreate.co.uk/tutorials/javascript/domevents 提供了关于在 Javascript 中添加/删除事件侦听器的主题的讨论,但是在使用事件时必须非常小心,因为使用不当可能会导致内存泄漏,这很难调试并导致用户不满意 :)

【讨论】:

    【解决方案3】:

    单独的 PHP 无法确定表单提交事件是如何触发的,因为这发生在客户端,而 PHP 是一种服务器端语言。您必须实现 Javascript 来监听 - 并记录到服务器端 - 按键和鼠标点击,然后分析这些数据以找到您要查找的内容。

    现在,PHP 可以告诉哪个提交输入被触发了,因为它会出现在表单数据中,而其他的则不会。大多数浏览器将第一个提交输入设置为默认值(在 Enter 按键上触发的那个)。您可以重新排序所有提交,以控制触发哪个提交。

    【讨论】:

    • 我猜我认为浏览器会将有关表单提交方式的信息传递给 PHP。您的解决方案是我正在考虑的解决方案,现在似乎是唯一的解决方案。
    【解决方案4】:

    PHP 无法真正知道客户端发生了什么。

    我建议使用 javascript。当用户执行操作时,将其捕获并将其存储在将与表单一起提交的隐藏字段中。您还可以跟踪哪些输入处于活动状态并将其存储在隐藏字段中。

    代码会有点像这样(我没有检查语法)

    <input type="text" onfocus="setCurrent(this)" id="1" />
    <input type="hidden" id="hid" />
    
    function setCurrent(o){
      $('hid').value = o.id;
    }
    

    我认为玩弄事件捕获和隐藏字段应该会给你想要的结果。

    希望有帮助

    【讨论】:

      【解决方案5】:

      这是您在客户端编写标记的方式。

      例如,您可以使用以下一种(非 XHTML)方法:

      在 HTML 文件中:

      <form method="post" action="myform.php" id="myform">
        ... form items here ...
      
      <input type="submit" name="enter_key" value="true" style="display:none">
      <input type="hidden" name="pressed_button" id="pressed_button" value="false">
      <input type="button" value="Submit"
        onclick="document.getElementById('pressed_button').value='true';document.getElementById('myform').submit();">
      </form>
      

      在 myform.php 中:

      if ($_POST['pressed_button']=='false') {
         // Logic for enter key
      } else {
         // Logic for button press
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 2016-01-03
        • 2015-03-29
        • 2010-11-02
        • 1970-01-01
        • 2013-05-12
        相关资源
        最近更新 更多