【问题标题】:Generating Submit Button with Ajax Not Submitting Form Data使用 Ajax 生成提交按钮不提交表单数据
【发布时间】:2012-01-23 12:27:37
【问题描述】:

已解决:我将 $_SERVER['REQUEST_METHOD'] != 'post' 设为小写。那显然必须是资本……我一将其资本化,它就起作用了,这是唯一的变化。我投票给你,为你提供帮助的优秀小伙子。谢谢!

我在使用 Ajax 完成一个简单的数学问题后生成了一个提交按钮。 Ajax 工作正常。我可以使用 var_dump/print_r 验证 $_POST 和 $_SESSION 数据是否正确传递。提交按钮就像我期望的那样在输出 div 中。

但是,当我按下提交按钮时,它会重新加载页面,但不会触发提交。它返回表单,$_POST 变量为空/根本没有设置。

提交按钮位于表单标签中。为什么它提交表单而不是数据/我如何让它工作?

我认为您不需要代码来回答问题,但是,这里是代码的简化版本:

// In a server request method block on test.php:
     if( $_SERVER['REQUEST_METHOD'] != 'POST' ){
<form  id="addUserId"  name="addUser"  method="post"  action="test.php" >
<table id="formCreatoraddUserIdTableId"  cellpadding="2"  cellspacing="2"  width="100%" >
    <tr id="formCreatorRowId0" >
        <td valign="top" ><font>3 minus 1: </font></td>
        <td valign="top" ><input type="text"  id="validatorId"  name="validate"  onkeyup="makeAjaxRequest('./ajax/captchaSubmitButtonCheck.php', 'captcha='+encodeURIComponent(document.getElementById('validatorId').value),'captchaOutputDiv', '1');" autocomplete="off"  />          
        </td>
    </tr>
    <tr id="formCreatorRowId1" >
        <td valign="top" ><font></font></td>
        <td valign="top" >
            <div  id="captchaOutputDiv" ></div>
        </td>
    </tr>
  </table>
    <input type="hidden"  name="refreshPostPrevention"  />
</form>
   }else{

     print_r( $_POST ); // will be empty
   }
     // in an ajax file captchaSubmitButtonCheck.php:
<?PHP
if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
    printr( $_POST );
    printr( $_SESSION, 'SESSION' );
    if( $_POST['captcha'] == $_SESSION['captcha'] ){
        echo '<input type="submit" value="Save" />';    
    }else{
        echo '<font class="red">Your math was wrong. Try again.</font>';    
    }
}
?>

     // the JS

function makeAjaxRequest(url, params, output, image) {
  var getdate = new Date();  //Used to prevent caching during ajax call
  if( image == 1 ){
      document.getElementById(output).innerHTML='<img src="./images/template/ajax-loader.gif"></img>'; 
  }
  if(xmlhttp) { 
    xmlhttp.open("POST",url,true); 
    xmlhttp.onreadystatechange = function(){
       if (xmlhttp.readyState == 4) {
         if(xmlhttp.status == 200) {
           document.getElementById(output).innerHTML=xmlhttp.responseText; //Update the HTML Form element 
         }
         else {
            alert("Error during AJAX call. Please try again");
         }
       }    
    }
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.send(params); //Posting txtname to PHP File
  }
}

【问题讨论】:

  • 在下面查看我的答案,但是代码中的提交按钮在哪里?你试图用 显示什么意思是 ?检查:w3schools.com/tags/att_input_type.asp
  • 验证器名称中有一个 type-o。假设是输入类型=“文本”而不​​是输入类型=“输入”。晚了。在 ajax 处理之后,提交按钮出现在 captchaOutputDiv 中。
  • 唯一的 JS 是 makeAjaxRequest 函数,它只是链接到您非常标准的 ajax 请求。没有 jquery 或其他任何特殊的东西。
  • printr( $_POST )printr( $_SESSION, 'SESSION' ); 应该是 print_r();
  • printr 是我为 echo '
    ' 提供的功能;打印_r();回声'
    ';只是节省一些打字

标签: php ajax


【解决方案1】:

当您使用 AJAX 驱动的接口时,您可能不想使用提交按钮,仅在禁用 JS 时显示提交按钮作为后备按钮。因为当您将提交按钮放在表单中时,它总是会尝试提交,除非您通过覆盖表单上的提交操作来明确阻止它这样做。

我的解决方案是仅使用普通输入 type='button' 或任何实际执行 AJAX 操作 onClick 的元素,然后使用 serialization 提交表单数据或手动将数据发送到 AJAX 脚本。这样,您还可以更好地控制发送的内容和方式。

//使用jQuery

function ajaxSubmit(){
    var data  = $("form").serialize();
    //Ajax code here
}

<span class='action' onclick='ajaxSubmit'>Send the data</a>

或者用 jQuery 覆盖提交操作:

$('form').submit(function() {
  alert($(this).serialize());
  return false;
});

【讨论】:

  • 我没有将所有表单数据传递给 ajax。我仍在使用表单操作转到页面的新实例来处理数据。我使用 ajax 只是为了打开提交按钮。它不一定是提交按钮。它可能是 onclick 中带有 form.submit() 的按钮。无论哪种方式,我都会得到相同的结果。这很令人抓狂,因为我这样做并且它在另一个站点上工作,但它在这里不起作用(相同的主机/相同的设置......)
  • 对。您是否尝试过隐藏提交按钮而不是通过 AJAX 将其添加到 HTML 中。然后在验证码通过时显示它?这可能会解决问题,因为提交按钮从一开始就位于表单标签内,而不是稍后添加。
  • 我现在正在尝试。我认为 ajax 不会像那样影响 dom 元素。至少,我无法将 javascript 放入 ajax 并让它甚至给我一个警报。
【解决方案2】:

你确定makeAjaxRequest();是post方法吗?

【讨论】:

  • 是的,我添加了它,所以你也可以看到。
【解决方案3】:

我遇到了同样的问题并最终修复了它。我在 jQuery Ajax 验证码中注意到的一件事如果我们在 ajaxCaptcha 验证后手动提交表单,则 $_POST 变量将不会在结果中包含 type="submit" 对象,在此如果我们无法在服务器端使用提交按钮名称进行验证,我们可以使用验证码名称进行验证。

就我而言,$_POST 包含验证码文本框上方的所有值。

【讨论】:

    【解决方案4】:

    提交按钮在表单之外;正在隐式创建一个空表单以使 HTML 有效。

    将您的按钮放入它应该提交的表单中。

    (另外,我认为您的意思是 input type="text" 用于验证码。)

    【讨论】:

    • 提交进入验证码输出 div 内部,该 div 位于表单标签内部。它不在外面。您在输入 type="text" 上是正确的。时间不早了。
    • @phpmeh:不,不是。我不能以原子方式将它传递给 jsfiddle.net 并看到我眼前的问题。我必须搞乱伪造 PHP 文件、猜测事情等等。将问题分解为其组成部分。
    • @phpmeh:那么问题不应该出现在这个网站上,这是针对基于代码的关于编程语言的问题。
    • 你真的要告诉我上面的问题不适合stackoverflow吗?我真的很感谢你试图帮助,但现在去帮助别人。
    • @phpmeh:没错。概念问题不属于这里。阅读常见问题解答。
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多