Kirimkan formulir tanpa memuat ulang halaman

94

Saya memiliki situs iklan baris, dan di halaman tempat iklan ditampilkan, saya membuat formulir "Kirim tip ke teman" ...

Jadi siapa pun yang mau bisa mengirim tip iklan ke beberapa alamat email teman.

Saya menebak formulir harus dikirimkan ke halaman php bukan?

<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>

Saat mengirimkan formulir, halaman akan dimuat ulang ... Saya tidak ingin itu ...

Apakah ada cara untuk membuatnya tidak memuat ulang dan tetap mengirim email? Lebih disukai tanpa ajax atau jquery ...

Terima kasih

FruDe
sumber
10
Untuk mengirim formulir, Anda harus membuat permintaan HTTP, membuat permintaan HTTP tanpa memuat halaman adalah maksud Ajax. Sebaiknya coba berkendara ke kota tanpa kendaraan.
Quentin
7
"tanpa ajax atau jquery" terdengar seperti "Saya ingin mobil tanpa roda"
Your Common Sense
12
@Ke Almost, <iframe>dan targetatribut akan melakukannya.
alex
Anda tidak menggunakan XmlHttpRequest secara khusus, tetapi Anda masih memanggil server secara asinkron dengan javascript. Itu berada di bawah Ajax.
Keith Rousseau
10
Saya membaca judulnya dan berpikir "Ah, dia hanya butuh Ajax". Saya membaca pertanyaan itu lebih lanjut sambil menyesap kopi saya dan menyiapkan jawaban di kepala saya. Di akhir pertanyaan, kopi saya ada di layar ...
BalusC

Jawaban:

69

Anda harus mengirimkan permintaan ajax untuk mengirim email tanpa memuat ulang halaman. Melihat http://api.jquery.com/jQuery.ajax/

Kode Anda harus berupa sesuatu di sepanjang baris:

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

Formulir akan dikirimkan di latar belakang ke send_email.phphalaman yang akan dibutuhkan untuk menangani permintaan dan mengirim email.

jkilbride.dll
sumber
4
Bagaimana tampilannya jika Anda menyertakan HTML juga?
blueprintchris
6
send_email.php itu harus "send_email.php"?
Beruang
1
Bagaimana Anda melakukan ini hanya dengan vanilla AJAX dengan JavaScript belaka?
Adam
.ajax bukan kesalahan fungsi dengan solusi yang hampir sama dengan yang Anda gunakan. paste.ubuntu.com/p/GnHzY84DQ3
1
Jika formulir masih menyegarkan, tambahkan return false;sebelum tanda kurung tutup terakhir
The Codesee
81

Saya telah menemukan apa yang menurut saya lebih mudah. Jika Anda meletakkan Iframe di halaman, Anda dapat mengarahkan keluar dari tindakan di sana dan membuatnya muncul. Anda tidak dapat melakukan apapun, tentu saja. Dalam hal ini, Anda dapat menyetel tampilan iframe ke tidak ada.

<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>
Juan Diego
sumber
2
Saya menggunakanaction="about:blank"
ThorSummoner
3
Dengan ini, Anda masih dapat mengambil nilai seperti:$_POST["ad_id"]
William
bertanya-tanya mengapa ini tidak dipilih sebagai jawaban! Menyelamatkan sakit kepala.
Neo
irishwill200, no
coldembrace
Sayangnya solusi ini tidak akan berfungsi untuk saya karena mengirimkan formulir menyebabkan javascript berjalan kembali dan acara siap dokumen dipanggil.
bgh
20

Anda bisa menggunakan AJAX atau Anda

  • membuat dan menambahkan iframe ke dokumen
  • setel nama iframes ke 'foo'
  • setel target formulir ke 'foo'
  • Kirimkan
  • memiliki bentuk aksi render javascript dengan 'parent.notify (...)' untuk memberikan umpan balik
  • opsional, Anda dapat menghapus iframe tersebut
Sean Kinsey
sumber
5
Itu masih Ajax. Bukan XHR, tapi tetap Ajax.
Quentin
3
trik bagus terima kasih. sampel untuk penggunaan <form id="myGiswebForm" method="post" action="https://******/saveForm.asp" target="myiframe">dan<iframe style="display:none;" src="" name="myiframe"></iframe>
Kemal
18

Cara tercepat dan termudah adalah dengan menggunakan iframe. Letakkan bingkai di bagian bawah halaman Anda.

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

Dan dalam bentuk Anda lakukan ini.

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

dan untuk membuat bingkai tidak terlihat di css Anda.

iframe{
  display: none;
}
Dragan Marjanovic
sumber
6
Harus display:none;dan tidak border:0px. Sudah mencoba mengedit tetapi hasil edit saya ditolak oleh pengulas yang sepertinya tidak repot-repot melihat komentar edit. Harap ubah jawaban Anda untuk memperbaiki kode.
AStopher
1
Saya sarankan untuk memanggil css dengan id atau class.
RaRdEvA
1
Ini adalah penyelamat yang sangat besar. Saya memiliki formulir yang sangat detail dengan lebih dari 50 bidang masukan dan saya takut saya harus mengisinya kembali setiap saat saat dalam mode pengembang. Sekarang saya tidak perlu. Sangat merekomendasikan solusi ini untuk tujuan pengembangan.
Matthew Wolman
8

Mengirimkan Formulir Tanpa Memuat Ulang Halaman Dan Mendapatkan Hasil Dari Data Yang Dikirim Di Halaman Yang Sama

Berikut beberapa kode yang saya temukan di internet yang memecahkan masalah ini:

1.) IFRAME

Saat formulir dikirim, Tindakan akan dijalankan dan menargetkan iframe tertentu untuk dimuat ulang.

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;

?>

Tag:

Rhalp Darren Cabrera
sumber
1
Terima kasih Pak, Anda mendapatkan hati saya, pertahankan
Maaf saya tidak beritahu
@MuhammadAli, Senang sekali :).
Rhalp Darren Cabrera
Saya sudah sering mencari di internet. Saya menggunakan Jquery, tetapi Jquery terkadang berfungsi dan terkadang tidak, Jadi menurut saya ajax adalah yang terbaik yang disebutkan dalam jawaban Anda.
Maaf, saya tidak akan memberi tahu
5

Suatu keharusan untuk mengambil bantuan jquery-ajaxdalam kasus ini. Tanpanya ajax, saat ini tidak ada solusi.

Pertama, panggil fungsi JavaScript saat formulir dikirimkan. Setel saja onsubmit="func()". Bahkan jika fungsinya dipanggil, tindakan default pengiriman akan dilakukan. Jika ini dilakukan, tidak ada cara untuk menghentikan halaman dari refresh atau redirect. Jadi, tugas selanjutnya adalah mencegah tindakan default. Sisipkan baris berikut di awal func().

event.preventDefault()

Sekarang, tidak akan ada pengalihan atau penyegaran. Jadi, Anda cukup melakukan panggilan ajax dari func()dan melakukan apa pun yang ingin Anda lakukan saat panggilan berakhir.

Contoh:

Bentuk:

<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(){...},
    });
}
taufique
sumber
4

ini persis bagaimana itu BISA bekerja tanpa jQuery dan AJAX dan bekerja dengan sangat baik menggunakan iFrame sederhana. I LOVE IT, bekerja di Opera10, FF3 dan IE6. Berkat beberapa poster di atas yang menunjukkan arah yang benar, itulah satu-satunya alasan saya memposting di sini:

<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>

kode php yang menghasilkan halaman yang disebut di atas:

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>
  ');
}
Tyler
sumber
3
Jangan gunakan PHP printuntuk mencetak kode HTML. Tutup saja tag php ?>dan tambahkan kode html setelahnya. Dan hindari menggunakannya exittidak perlu (kesalahan fatal, ...)
Oriol
ya, terima kasih telah menunjukkannya. Ini hanya contoh yang diperlukan, saya tidak benar-benar melakukannya dengan cara ini di sistem saya.
Tyler
Itu banyak pekerjaan untuk jawaban ini, tetapi ada banyak lainnya.
Pengguna yang bukan pengguna
satu-satunya masalah sampingan untuk ini adalah get () di dalamnya karena saya tidak ingin buku status bentuk dapat ditandai / dapat disimpan dalam cache.
drtechno
4

Ini seharusnya menyelesaikan masalah Anda.
Dalam kode ini setelah tombol submit klik kita memanggil jquery ajax dan kita meneruskan url ke
jenis posting POST / GET
data: informasi data Anda dapat memilih kolom input atau lainnya.
sucess: callback jika semuanya baik-baik saja dari
teks parameter fungsi server , html atau json, respon dari server
berhasil Anda dapat menulis peringatan tertulis jika data yang Anda dapatkan dalam keadaan tertentu dan seterusnya. atau jalankan kode Anda apa yang harus dilakukan selanjutnya.

<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>
Matas Lesinskas
sumber
Meskipun cuplikan kode ini dapat menyelesaikan masalah, cuplikan kode ini tidak menjelaskan mengapa atau bagaimana menjawab pertanyaan tersebut. Harap sertakan penjelasan untuk kode Anda , karena itu sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda. Penanda / peninjau: Untuk jawaban hanya kode seperti ini,
Scott Weldon
3

Anda dapat mencoba mengatur atribut target formulir Anda ke iframe tersembunyi, sehingga halaman yang berisi formulir tidak akan dimuat ulang.

Saya mencobanya dengan unggahan file (yang kami tahu tidak dapat dilakukan melalui AJAX), dan berhasil dengan baik.

wtaniguchi
sumber
2

Sudahkah Anda mencoba menggunakan iFrame? Tidak ada ajax, dan halaman asli tidak akan dimuat.

Anda dapat menampilkan formulir pengiriman sebagai halaman terpisah di dalam iframe, dan ketika dikirimkan, halaman luar / penampung tidak akan dimuat ulang. Solusi ini tidak akan menggunakan ajax jenis apa pun.

DanC
sumber
1

jika Anda mengirimkan ke halaman yang sama di mana formulirnya Anda dapat menulis tag formulir tanpa tindakan dan itu akan dikirim, seperti ini

<form method='post'> <!-- you can see there is no action here-->
M.abdelrhman
sumber
1

Saya melakukan sesuatu yang mirip dengan jquery di atas, tetapi saya perlu mengatur ulang data formulir dan kanvas lampiran grafis saya. Jadi inilah yang saya dapatkan:

    <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>

Itu berfungsi dengan baik untuk saya, untuk aplikasi Anda hanya dalam bentuk html, kami dapat menyederhanakan kode jquery ini seperti ini:

       <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>
drtechno
sumber
0

Halaman akan dimuat ulang jika Anda tidak ingin menggunakan javascript

baloo
sumber
4
... atau lakukan sesuatu yang jelek seperti <iframe name="ew" />dan<form target="ew" />
alex
Mereka tidak pernah mengatakan tidak ada JS, melainkan "Lebih disukai tanpa ajax atau jquery"
Pengguna yang bukan pengguna
0

Anda perlu menggunakan JavaScript tanpa menghasilkan iframe(pendekatan jelek).

Anda dapat melakukannya di JavaScript; menggunakan jQuery akan membuatnya tidak menyakitkan.

Saya sarankan Anda memeriksa AJAX dan Posting.

alex
sumber
0
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');
      }
   }   );
}

Saya mencoba berkali-kali untuk solusi yang baik dan jawaban oleh @taufique membantu saya sampai pada jawaban ini.

NB : Jangan lupa letakkan event.preventDefault(); di awal body fungsinya.

Dayz
sumber
0

Kemungkinan lebih lanjut adalah membuat tautan javascript langsung ke fungsi Anda:

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

...


sumber
-5

Berikut adalah beberapa jQuery untuk memposting ke halaman php dan mendapatkan kembali html:

$('form').submit(function() {
    $.post('tip.php', function(html) {
       // do what you need in your success callback
    }
    return false;
});
Keith Rousseau
sumber
1
Mau menjelaskan mengapa Anda tidak memilih? Anda tidak dapat melakukannya tanpa Ajax
Keith Rousseau
@Keith Tidak ada downvote dari saya, tapi mungkin itu karena Anda menyebutkan jQuery dan dia mengatakan tidak ada jQuery.
alex
1
Itu adalah argumen yang salah untuk metode posting, Anda tidak mengumpulkan data apa pun dari formulir, dan Anda menggunakan pemilih "berlaku untuk semua formulir" generik dengan "posting ke uri tertentu alih-alih mendapatkan tindakan dari formulir" pasca panggilan.
Quentin
1
Oh, astaga. jQuery melakukan pemeriksaan tipe sehingga argumen dapat dilewati. Yuck.
Quentin
1
Ya, mereka melakukan itu di semua tempat. Selamat datang di jQuery API
Keith Rousseau