【问题标题】:No Javascript Fallback for AJAX Form submissionAJAX 表单提交没有 Javascript 回退
【发布时间】:2025-12-13 21:50:01
【问题描述】:

我是 AJAX 新手,正在将一些常规 HTML 表单转换为 AJAX。

我现有的实现如下 - 表单(在 page1.php 上)发布到 page2.php,它对发布数据进行一些验证,如果缺少某些内容,则重定向到错误页面。如果输入正常,它包括 page3.php,它处理请求并重定向回 page1.php。

php/page1.php

<form method="post" action="/php/page2.php" >
   <input type="text" name="input1" placeholder="Howdy..." />
   <input type="text" name="input2" placeholder="Howdy..." />

   <input type="submit" value="Submit" />      
</form>

php/page2.php

<?php

  // perform some validation on inputs
  if (empty($_POST['input1']))
  {
     $location ='Location: /php/error.php';
     header($location);
     exit;
  }

  // Inputs are fine
  include('/php/page3.php');

?>

page3.php

<?php

  // do some form processing


  // redirect back to page1.php
  $location = 'Location: /php/page1.php";
  header($location);
  exit;
?>

要转换为 AJAX,我在此 SO 链接 How to show loading gif when request goes Ajax 上使用 @SSL 的解决方案 http://jsfiddle.net/clickthelink/Uwcuz/1/

验证和成功页面的错误都通过回调函数显示在page1.php上。

php/page2.php

<?php

  // perform some validation on inputs
  if (empty($_POST['input1']))
  {
     // Echo erorr code isntead of redirect
     echo "Please enter input1";
     return;

     //$location ='Location: /php/error.php';
     //header($location);
     //exit;
  }

  // Inputs are fine
  include('/php/page3.php');

?>

page3.php

<?php

  // do some form processing

  // Echo success instead of redirect
  echo "SUCCESS";

  // redirect back to page1.php
  //$location = 'Location: /php/page1.php";
  //header($location);
  //exit;
?>

这部分工作正常。

我的问题(最后)是如何处理禁用 javascript 的用户?我知道表单会正确提交,但如果出现错误或成功,我不会得到重定向。在这种情况下,我也想保留 header() 重定向类型的功能。这可能吗?我将不胜感激。

【问题讨论】:

  • 您可以轻松识别请求是否为 AJAX 调用,因为它设置了 HTTP 标头。因此,在没有 js 的表单提交的情况下,您的 PHP 后端应该可以做出不同的响应。
  • 不确定为什么这个问题被否决?如果投反对票的人发表评论,我将不胜感激,这样我就知道我做错了什么。顺便说一句,我确实在 SO 上找到了一些关于没有 JS 的 AJAX 回退的问题,但没有特定于重定向回原始页面的问题。
  • @gpgekko 感谢您的快速回复。您的建议与 quoo 建议的相同吗?或不同的东西

标签: javascript php ajax


【解决方案1】:

您想检测这是否是一个 xhr 请求,如果不是,则默认为非 ajax 行为。

我会看$_SERVER['HTTP_X_REQUESTED_WITH']

【讨论】:

  • 谢谢@quoo。这看起来很有希望。但是帖子中有一个免责声明“$_SERVER['HTTP_X_REQUESTED_WITH'] 是黄金票,但并非所有服务器都提供此变量,因此进行其他检查很重要。”愿意发表评论吗?还有一些关于 cmets 的安全问题的担忧。这可以被欺骗吗?这也是跨浏览器兼容的 - 至少 ie8+
  • 我不太确定他指的是什么其他检查,但本文详细说明了发送正确的标头:heera.it/detect-ajax-request-php-frameworks#.U6L0HI1dW5I
  • 再次感谢您的链接 - 这很好地澄清了事情。我是否在 .ajax() 调用之前在 $("form[ajax=true]").submit(function(e) {} 代码块中添加 xhr.setRequestHeader() 调用?(我指的是我的小提琴原帖)
  • 再次感谢您的回复。我接受@mspaly 响应是因为我有点担心服务器与这种方法的不一致。传递 ajax 参数似乎更直接,风险更小
【解决方案2】:

保持您当前的表单设置不变,如果它在没有 javascript 的情况下为您工作。

对于启用 javascript 的浏览器,您可以劫持表单上的“提交”事件。捕获事件并通过 ajax 将表单发布到脚本/页面,这些脚本/页面以 javascript 友好的格式处理和返回数据以供最终使用。

例如,使用 jquery:

<form method="post" action="/php/page2.php"  id="js-form" >
    <input type="text" name="input1" placeholder="Howdy..." />
    <input type="text" name="input2" placeholder="Howdy..." />
    <input type="submit" value="Submit" />      
</form>

<script>
$(document).ready(function(){
    $('#js-form').on('submit',function(e){

        // logic to submit ajax form and handle response

        // return false to cancel native browser form submission.
        return false;
    }); 
});
</script>

另一个想法是保留您已经拥有的页面,但发送一个带有 ajax 请求的标志以禁用浏览器重定向标头。例如,通过 ajax 提交表单时添加 'src=ajax'。然后在脚本里用逻辑说:

<?php
    if( !empty($_REQUEST['src'] && $_REQUEST['src'] == 'ajax' ) {
        // add redirect logic here.
    }
?>

【讨论】:

  • 感谢您的详细回复。我真的很喜欢你添加一个新标志来识别 ajax 提交的想法。您能否阐明如何使用此 ajax 实现来做到这一点。 jsfiddle.net/clickthelink/Uwcuz/1
  • 试试这个。注意防止浏览器表单提交的方法和手动添加 src=ajax 查询参数。 jsfiddle.net/Uwcuz/1300
  • 非常感谢!我很感激。所以 'src' 应该可以通过 $_POST 访问,对吧?你能评论一下使用它而不是 xhr 标头方法的好处吗?至于防止浏览器默认表单提交,e.preventDefault();正在这样做..有关 preventDefault() 和 return false 之间的区别,请参阅此帖子 css-tricks.com/return-false-and-prevent-default