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

82 html javascript php forms

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

所以任何想要的人都可以将广告提示发送给一些朋友的电子邮件地址.

我猜表单必须提交到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>
Run Code Online (Sandbox Code Playgroud)

提交表单时,页面会重新加载......我不希望这样......

有没有办法让它不重新加载仍然发送邮件?最好没有ajax或jquery ......

谢谢

小智 70

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

<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>
Run Code Online (Sandbox Code Playgroud)

  • 有了这个,你还可以获取诸如:`$_POST["ad_id"]` 之类的值吗? (4认同)
  • 我用`action ="about:blank"` (2认同)
  • 想知道为什么这没有被选为答案!省了头疼。 (2认同)

jki*_*ide 59

您需要提交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');
        }               
    });
});
Run Code Online (Sandbox Code Playgroud)

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

  • send_email.php应该是"send_email.php"吗? (6认同)
  • 如果您也包含HTML,这会是什么样子? (3认同)
  • 你将如何使用纯 JavaScript 的普通 AJAX 来做到这一点? (3认同)
  • 如果表单仍然刷新,请在最后一个右括号之前添加“return false;” (2认同)

Sea*_*sey 20

您要么使用AJAX,要么使用AJAX

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

  • 那仍然是Ajax.不是XHR,但仍然是Ajax. (5认同)
  • 很棒的技巧谢谢你.使用样本`<form id ="myGiswebForm"method ="post"action ="https://******/saveForm.asp"target ="myiframe">`和`<iframe style ="display:没有;" src =""name ="myiframe"></iframe> </ iframe>` (3认同)

Rha*_*era 11

无需重新加载页面即可提交表单,并在同一页面上获取提交数据的结果。

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

1.)框架

当表单被提交时,动作将被执行并针对特定的 iframe 重新加载。

索引.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>
Run Code Online (Sandbox Code Playgroud)

iframe_content.php

<?php
$Submit = isset($_POST['Submit']) ? $_POST['Submit'] : false;
$Name = isset($_POST['Name']) ? $_POST['Name'] : '';
if($Submit){
 echo $Name;
}
?>
Run Code Online (Sandbox Code Playgroud)

2.) AJAX

索引.php:

<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>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.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>
Run Code Online (Sandbox Code Playgroud)

server_action.php

<?php 
$name = isset($_POST['name']) ? $_POST['name'] : '';
$descr = isset($_POST['descr']) ? $_POST['descr'] : '';


echo $name;
echo $descr;

?>
Run Code Online (Sandbox Code Playgroud)

标签:


Sup*_*mer 10

没有 XHR 或 jQuery 的现代答案

现在是 2022 年,当我们有了Fetch APIFormData API时,我们就不需要使用 XHR 或 jQuery 等旧工具了!

我们需要做的第一件事是防止发生默认的表单提交行为event.preventDefault()

form.addEventListener("submit", function(event){
    event.preventDefault();
    // ...
});
Run Code Online (Sandbox Code Playgroud)

现在我们需要用我们自己的 AJAX 请求替换提交行为。Fetch API 使发布表单数据变得非常简单 - 只需创建一个新FormData对象,用表单的值填充它,并将其用作获取请求的正文:

fetch(form.action, {
    method: "post",
    body: new FormData(form)
});
Run Code Online (Sandbox Code Playgroud)

请注意,这会使用编码类型提交 HTTP 请求multipart/form-data。如果您需要使用该格式发布数据application/x-www-form-urlencoded,请从该对象创建一个新URLSearchParams对象FormData并将其用作提取的主体。1

fetch(form.action, {
    method: "post",
    body: new URLSearchParams(new FormData(form))
});
Run Code Online (Sandbox Code Playgroud)

最后,如果您想以 JSON 形式提交 HTTP 请求,请使用以下命令:2

fetch(form.action, {
    method: "post",
    headers: {
        "Content-Type": "application/json"
    },
    body: JSON.stringify(Object.fromEntries(new FormData(form)))
});
Run Code Online (Sandbox Code Playgroud)

这是完整的代码示例:

let form = document.querySelector("form");

form.addEventListener("submit", function(event){
    event.preventDefault();
  
    fetch(form.action, {
        method: "post",
        body: new URLSearchParams(new FormData(form)) // for application/x-www-form-urlencoded
        // body: new FormData(form) // for multipart/form-data
    });
});
Run Code Online (Sandbox Code Playgroud)
<form method="POST">
  <input name="name" placeholder="Name" />
  <input name="phone" type="tel" placeholder="Phone" />
  <input name="email" type="email" placeholder="Email" />
  <input name="submit" type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)


1 和 之间有什么区别?application/x-www-form-urlencodedmultipart/form-data

2基于“How to conversion FormData (HTML5 object) to JSON”答案的代码。请注意,如果键重复,则仅使用最后一个值。


Dra*_*vic 9

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

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

并以你的形式做到这一点.

<form target="frame">
</form>
Run Code Online (Sandbox Code Playgroud)

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

iframe{
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

  • 应该是`display:none;`而不是`border:0px`.尝试编辑,但我的编辑被评论者拒绝,他们似乎不太喜欢看编辑评论.请修改您的答案以修复代码. (3认同)
  • 我建议通过 id 或 class 调用 css。 (2认同)

小智 7

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

<form action="javascript:your_function();" method="post">
Run Code Online (Sandbox Code Playgroud)

...

  • 不敢相信这样一个简单的解决方案实际上有效,值得更多的支持。 (2认同)

tau*_*que 5

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

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

event.preventDefault()
Run Code Online (Sandbox Code Playgroud)

现在,不会有重定向或刷新。因此,您只需从 ajax 调用func()并在调用结束时做任何您想做的事情。

例子:

形式:

<form id="form-id" onsubmit="func()">
    <input id="input-id" type="text">
</form>
Run Code Online (Sandbox Code Playgroud)

Javascript:

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