提交表单而不重新加载页面

119
我有一个分类广告网站,在展示广告的页面上,我正在创建一个“给朋友发送提示”的表单...
所以任何想要的人都可以将广告的提示发送给一些朋友的电子邮件地址。
我猜这个表单必须提交到一个php页面,对吗?
<form name="tip" method="post" action="tip.php">
  Tip somebody: 
  <input 
    name="tip_email"
    type="text" 
    size="30" 
    onfocus="tip_div(1);" 
    onblur="tip_div(2);"
  />
  <input type="submit" value="Skicka Tips" />
  <input type="hidden" name="ad_id" />
</form>

当提交表单时,页面会重新加载...我不想要那样...
有没有办法让它不重新加载但仍然发送邮件? 最好不要使用ajax或jquery...

13
要发送表单,您必须发出HTTP请求。而不加载页面进行HTTP请求就是Ajax的含义。这就像试图在没有车辆的情况下驾车去城镇一样困难。 - Quentin
12
“不用 ajax 或者 jquery”听起来就像是“我想要一辆没有轮子的车”。 - Your Common Sense
13
@Keith,几乎可以使用<iframe>target属性来实现。 - alex
16
我看了标题,想到“啊,他只需要Ajax”。当我一边啜着咖啡一边继续阅读问题并在脑海中准备回答时,问题结束时我的咖啡洒满了屏幕... - BalusC
使用以下jQuery插件来实现此功能:https://github.com/jinujd/jQuery-Async-Form - Jinu Joseph Daniel
显示剩余5条评论
19个回答

3
你可以尝试将表单的目标属性设置为隐藏的iframe,这样包含表单的页面就不会重新加载。
我已经尝试过上传文件(我们知道无法通过AJAX完成),效果非常好。

2

您尝试过使用iFrame吗?不需要ajax,原始页面也不会加载。

您可以在iFrame内显示提交表单作为单独的页面,当它被提交时,外部/容器页面不会重新加载。这种解决方案不需要使用任何类型的ajax。


1

我做了类似于上面的jquery,但我需要重置表单数据和图形附件画布。所以我想出了以下解决方案:

    <script>
   $(document).ready(function(){

   $("#text_only_radio_button_id").click(function(){
       $("#single_pic_div").hide();
       $("#multi_pic_div").hide();
   });

   $("#pic_radio_button_id").click(function(){
      $("#single_pic_div").show();
      $("#multi_pic_div").hide();
    });

   $("#gallery_radio_button_id").click(function(){
       $("#single_pic_div").hide();
       $("#multi_pic_div").show();
                 });
    $("#my_Submit_button_ID").click(function() {
          $("#single_pic_div").hide();
          $("#multi_pic_div").hide();
          var url = "script_the_form_gets_posted_to.php"; 

       $.ajax({
       type: "POST",
       url: url,
       data: $("#html_form_id").serialize(), 
       success: function(){  
       document.getElementById("html_form_id").reset();
           var canvas=document.getElementById("canvas");
    var canvasA=document.getElementById("canvasA");
    var canvasB=document.getElementById("canvasB");
    var canvasC=document.getElementById("canvasC");
    var canvasD=document.getElementById("canvasD");

              var ctx=canvas.getContext("2d");
              var ctxA=canvasA.getContext("2d");
              var ctxB=canvasB.getContext("2d");
              var ctxC=canvasC.getContext("2d");
              var ctxD=canvasD.getContext("2d");
               ctx.clearRect(0, 0,480,480);
               ctxA.clearRect(0, 0,480,480);
               ctxB.clearRect(0, 0,480,480);        
               ctxC.clearRect(0, 0,480,480);
               ctxD.clearRect(0, 0,480,480);
               } });
           return false;
                });    });
           </script>

对于仅使用HTML表单的应用程序,这样的代码对我很有效,我们可以将这个jQuery代码简化为以下内容:
       <script>
        $(document).ready(function(){

    $("#my_Submit_button_ID").click(function() {
        var url =  "script_the_form_gets_posted_to.php";
       $.ajax({
       type: "POST",
       url: url,
       data: $("#html_form_id").serialize(), 
       success: function(){  
       document.getElementById("html_form_id").reset();
            } });
           return false;
                });    });
           </script>

1
function Foo(){  
   event.preventDefault(); 
 $.ajax(   {  
      url:"<?php echo base_url();?>Controllername/ctlr_function",
      type:"POST",
      data:'email='+$("#email").val(),
      success:function(msg)      {  
         alert('You are subscribed');
      }
   }   );
}

我尝试了很多次寻找一个好的解决方案,@taufique给了我帮助,让我得出了这个答案。

NB:不要忘记在函数体的开头加上event.preventDefault();


-1
如果您要提交给表单所在的同一个页面,您可以编写没有 action 的表单标签,这样它就会自动提交,如下所示:
<form method='post'> <!-- you can see there is no action here-->

这样的提交仍然会重新加载页面,因此它并没有回答问题。 - Hashim Aziz

-1

您需要使用JavaScript而不是iframe(丑陋的方法)。

您可以使用JavaScript来完成;使用jQuery将使其变得轻松。

我建议您查看AJAX和发布。


-1

如果您不想使用JavaScript,页面将重新加载


4
或者做一些丑陋的事情,比如 <iframe name="ew" /><form target="ew" /> - alex
他们从未说过不使用JS,而是“最好不要使用ajax或jquery”。 - ReinstateMonica3167040

-1

我不懂JavaScript,刚开始学习PHP,所以对我有帮助的是所有回复中的:

  1. 创建index.php并插入以下内容:
<iframe name="email" style=""></iframe>
<form action="email.php" method="post" target="email">
<input type="email" name="email" >
<input type="submit" name="Submit" value="Submit">
</form>
  1. 创建email.php并插入以下代码以检查是否获取到数据(您应该在iframe中的index.php中看到它):
    <?php
    if (isset($_POST['Submit'])){
    $email = $_POST['email'];
    echo $email;
    }
    ?>
  1. 如果一切正常,请将email.php上的代码更改为:
    <?php
    if (isset($_POST['Submit'])){
    $to = $_POST['email'];
    $subject = "Test email";
    $message = "Test message";
    $headers = "From: test@test.com \r\n";
    $headers .= "Reply-To: test@test.com \r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    
    mail($to, $subject, $message, $headers);
    }
    ?>

希望这对像我一样的其他新手有所帮助 :)

-5
这是一些jQuery代码,用于向php页面发出请求并获取返回的HTML:
$('form').submit(function() {
    $.post('tip.php', function(html) {
       // do what you need in your success callback
    }
    return false;
});

1
请解释一下你为什么踩了这个问题?没有Ajax你无法实现它。 - Keith Rousseau
1
这些是错误的POST方法参数,您没有从表单中收集任何数据,并且使用了一个通用的“适用于所有表单”的选择器,而不是从表单中获取操作的特定URI进行POST调用。 - Quentin
不是这样的。第二个参数不应该是回调函数。 - Quentin
1
哦,天啊。jQuery 进行类型检查,因此可以跳过参数。呸。 - Quentin
1
是的,他们在各个地方都这样做。欢迎使用jQuery API。 - Keith Rousseau
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接