提交表单而无需重新加载页面


91

我有一个分类广告网站,在显示广告的页面上,我正在创建“向朋友发送提示”表单...

因此,任何想要的人都可以将广告提示发送给某些朋友的电子邮件地址。

我猜表格必须提交到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 ...

谢谢


10
要发送表单,您必须发出HTTP请求,而在不加载页面的情况下发出HTTP请求就是Ajax的意思。最好不要开车去城镇。
昆汀2010年

7
“没有ajax或jquery”的声音听起来像“我想要一辆没有车轮的汽车”
您的常识2010年

12
@Keith差不多了,<iframe>target属性即可完成。
亚历克斯

您没有专门使用XmlHttpRequest,但仍使用javascript异步调用服务器。那属于Ajax。
基思·卢梭

10
我读了标题,以为“啊,他只需要Ajax”。我在夹咖啡和准备答案时正在进一步阅读问题。问题的最后,我的咖啡
随处可见

Answers:


68

您需要提交ajax请求来发送电子邮件,而无需重新加载页面。看看http://api.jquery.com/jQuery.ajax/

您的代码应类似于以下内容:

$('#submit').click(function() {
    $.ajax({
        url: 'send_email.php',
        type: 'POST',
        data: {
            email: 'email@example.com',
            message: 'hello world!'
        },
        success: function(msg) {
            alert('Email Sent');
        }               
    });
});

该表格将在后台提交到该send_email.php页面,该页面将需要处理请求并发送电子邮件。


4
如果还包含HTML,效果如何?
blueprintchris

6
send_email.php应该是“ send_email.php”?

1
仅使用带有JavaScript的原始AJAX,您将如何做到这一点?
亚当

.ajax不是与您所使用的解决方案几乎相同的函数错误。paste.ubuntu.com/p/GnHzY84DQ3

如果表单仍然令人耳目一新,请return false;在最后一个方括号之前添加
The Codesee

78

我发现我认为是更简单的方法。如果您在页面中放置了iframe,则可以在其中重定向操作的退出并使其显示。当然,你什么也做不了。在这种情况下,您可以将iframe显示设置为无。

<iframe name="votar" style="display:none;"></iframe>
<form action="tip.php" method="post" target="votar">
    <input type="submit" value="Skicka Tips">
    <input type="hidden" name="ad_id" value="2">            
</form>

2
我曾经用过action="about:blank"
ThorSummoner

2
这样,您是否仍可以获取以下值:$_POST["ad_id"]
William

想知道为什么没有选择它作为答案!救了头疼。

irishwill200,否
coldembrace

不幸的是,该解决方案对我不起作用,因为提交表单会导致javascript重新运行并调用文档就绪事件。
bgh

19

您可以使用AJAX或

  • 创建iframe并将其添加到文档
  • 将iframe名称设置为“ foo”
  • 将表单目标设置为“ foo”
  • 提交
  • 让表单动作使用'parent.notify(...)'渲染javascript以提供反馈
  • 您可以选择删除iframe

5
那仍然是Ajax。不是XHR,但仍然是Ajax。
昆汀

3
很棒的技巧,谢谢。样品的使用<form id="myGiswebForm" method="post" action="https://******/saveForm.asp" target="myiframe"><iframe style="display:none;" src="" name="myiframe"></iframe>
凯末尔

17

最快,最简单的方法是使用iframe。在页面底部放置一个框架。

<iframe name="frame"></iframe>

并以您的形式执行此操作。

<form target="frame">
</form>

并使该框架在您的CSS中不可见。

iframe{
  display: none;
}

6
应该display:none;和不应该border:0px。尝试过编辑,但我的编辑遭到审稿人的拒绝,这些审稿人似乎并不在乎编辑评论。请修改您的答案以修正代码。
AStopher

1
我建议通过id或class来调用CSS。
RaRdEvA

1
这是一个巨大的救生员。我有一个非常详细的表单,其中包含50多个输入字段,而且我担心在开发模式下每次都要重新填写该表单。现在,我不必。出于开发目的,强烈推荐此解决方案。
马修·沃尔曼

7

在不重新加载页面的情况下提交表单,并在同一页面中获取提交数据的结果

这是我在互联网上找到的一些可解决此问题的代码:

1.)IFRAME

提交表单后,该操作将被执行,并以指定的iframe重新加载为目标。

index.php

<iframe name="content" style="">
</iframe>
<form action="iframe_content.php" method="post" target="content">
<input type="text" name="Name" value="">
<input type="submit" name="Submit" value="Submit">
</form>

iframe_content.php

<?php
if (isset($_POST['Submit'])){
$Name = $_POST['Name'];
echo $Name;
}
?>

2.)AJAX

Index.php:

   <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/core.js">
    </script>
    <script type="text/javascript">
    function clickButton(){
    var name=document.getElementById('name').value;
    var descr=document.getElementById('descr').value;
    $.ajax({
            type:"post",
            url:"server_action.php",
            data: 
            {  
               'name' :name,
               'descr' :descr
            },
            cache:false,
            success: function (html) 
            {
               alert('Data Send');
               $('#msg').html(html);
            }
            });
            return false;
     }
    </script>
    <form >
    <input type="" name="name" id="name">
    <input type="" name="descr" id="descr">
    <input type="submit" name="" value="submit" onclick="return clickButton();">
    </form>
    <p id="msg"></p>

server_action.php

<?php 
$name = $_POST['name'];
$descr = $_POST['descr'];


echo $name;
echo $descr;

?>

标签:


1
谢谢您,先生,我动了我的心,请继续努力
对不起IwontTell

@MuhammadAli,很高兴来到这里:)。
Rhalp Darren Cabrera

我在互联网上搜索了很多次。我使用的是Jquery,但是Jquery有时可以工作,有时却不能,所以我认为ajax最好在您的答案中提及。
抱歉Iwont告诉

4

jquery-ajax在这种情况下,必须采取帮助。没有ajax,目前没有解决方案。

首先,在提交表单时调用JavaScript函数。刚刚设置onsubmit="func()"。即使调用了该函数,也会执行提交的默认操作。如果执行该操作,将无法阻止页面刷新或重定向。因此,下一个任务是阻止默认操作。在的开头插入以下行func()

event.preventDefault()

现在,将没有重定向或刷新。因此,您只需从发出ajax调用,func()然后在调用结束时做您想做的任何事情。

例:

形成:

<form id="form-id" onsubmit="func()">
    <input id="input-id" type="text">
</form>

Javascript:

function func(){
    event.preventDefault();
    var newValue = $('#input-field-id').val();
    $.ajax({
        type: 'POST',
        url: '...',
        data: {...},
        datatype: 'JSON',
        success: function(data){...},
        error: function(){...},
    });
}

4

这就是不用jQuery和AJAX就可以工作的方式,并且使用简单的iFrame可以很好地工作。我喜欢它,可以在Opera10,FF3和IE6中使用。由于上面的一些海报为我指明了正确的方向,所以这是我在此处发布的唯一原因:

<select name="aAddToPage[65654]" 
onchange="
    if (bCanAddMore) {
        addToPage(65654,this);
    }
    else {
        alert('Could not add another, wait until previous is added.'); 
        this.options[0].selected = true;
    };
" />
<option value="">Add to page..</option>
[more options with values here]</select>

<script type="text/javascript">
function addToPage(iProduct, oSelect){
    iPage = oSelect.options[oSelect.selectedIndex].value;
    if (iPage != "") {
        bCanAddMore = false;
        window.hiddenFrame.document.formFrame.iProduct.value = iProduct;
        window.hiddenFrame.document.formFrame.iAddToPage.value = iPage;
        window.hiddenFrame.document.formFrame.submit();
    }
}
var bCanAddMore = true;</script> 

<iframe name="hiddenFrame" style="display:none;" src="frame.php?p=addProductToPage" onload="bCanAddMore = true;"></iframe>

生成上面被调用页面的php代码:

if( $_GET['p'] == 'addProductToPage' ){  // hidden form processing
  if(!empty($_POST['iAddToPage'])) {
    //.. do something with it.. 
  }
  print('
    <html>
        <body>
            <form name="formFrame" id="formFrameId" style="display:none;" method="POST" action="frame.php?p=addProductToPage" >
                <input type="hidden" name="iProduct" value="" />
                <input type="hidden" name="iAddToPage" value="" />
            </form>
        </body>
    </html>
  ');
}

3
不要使用PHP print打印HTML代码。只需关闭php标签,?>然后添加html代码即可。并避免使用exit它是不必要的(致命错误,...)
Oriol 2013年

是的,谢谢你指出这一点。这只是一个必要的示例,我在系统中并没有真正做到这一点。
泰勒(Tyler)2013年

这个答案需要很多工作,但还有很多其他工作。
不是用户的用户

唯一的问题是其中的get(),因为我不希望表单状态簿可标记/可缓存。
drtechno

4

这应该可以解决您的问题。
在此代码中,单击“提交”按钮后,我们将其称为jquery ajax,并将URL传递给发布
类型POST / GET
数据:您可以选择输入字段或任何其他数据信息。
成功:如果服务器
功能参数文本,html或json 一切正常,则进行回调,如果服务器响应
成功,则可以写写警告(如果获取的数据处于某种状态),等等。或执行您的代码下一步该做什么。

<form id='tip'>
Tip somebody: <input name="tip_email" id="tip_email" type="text" size="30" onfocus="tip_div(1);" onblur="tip_div(2);"/>
 <input type="submit" id="submit" value="Skicka Tips"/>
 <input type="hidden" id="ad_id" name="ad_id" />
 </form>
<script>
$( "#tip" ).submit(function( e ) {
    e.preventDefault();
    $.ajax({
        url: tip.php,
        type:'POST',
        data:
        {
            tip_email: $('#tip_email').val(),
            ad_id: $('#ad_id').val()
        },
        success: function(msg)
        {

            alert('Email Sent');
        }               
    });
});
</script>

尽管此代码段可以解决问题,但并未说明原因或答案。请附上代码说明,因为这确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。举报人/审阅者: 对于仅限代码的答案,例如这一答案,请表决,不要删除!
Scott Weldon

3

您可以尝试将表单的target属性设置为隐藏的iframe,这样就不会重新加载包含表单的页面。

我尝试了文件上传(我们知道无法通过AJAX完成),并且效果很好。


2

您是否尝试过使用iFrame?没有ajax,将不会加载原始页面。

您可以在iframe中将提交表单显示为单独的页面,提交后,外部/容器页面将不会重新加载。该解决方案将不使用任何类型的Ajax。


1

如果您要提交到表单所在的同一页面,则可以编写表单标签而无需执行操作,它将像这样提交

<form method='post'> <!-- you can see there is no action here-->

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>

0

您将需要使用JavaScript而不会导致iframe(难看的方法)。

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

我建议您查看AJAX和发布。


0

另一种可能性是使JavaScript直接链接到您的函数:

<form action="javascript:your_function();" method="post">

...


-1

如果您不想使用javascript,则会重新加载页面


4
...或者做类似a <iframe name="ew" />和a的丑陋操作<form target="ew" />
alex

他们从未说过没有JS,而是“最好没有ajax或jquery”
不是用户的用户

-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的回答帮助我得出了这个答案。

注意:别忘 event.preventDefault(); 了在函数主体的开头。


-6

这是一些jQuery,用于发布到php页面并获取html:

$('form').submit(function() {
    $.post('tip.php', function(html) {
       // do what you need in your success callback
    }
    return false;
});

1
关心解释您为什么投票?没有阿贾克斯,你就做不到
基思·卢梭

@Keith没有我的反对,但是也许是因为您提到了jQuery,而他说没有jQuery。
亚历克斯

1
这些是post方法的错误参数,您不会从表单中收集任何数据,而是使用通用的“适用于所有表单”选择器以及“张贴至特定uri,而不是从表单中获取操作”发布电话。
昆汀

1
哦,真可悲。jQuery会进行类型检查,因此可以跳过参数。uck
昆汀

1
是的,他们到处都是。欢迎使用jQuery API
Keith Rousseau 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.