Sayfayı yeniden yüklemeden formu gönderin


96

Bir seri ilanlar web sitem var ve reklamların gösterildiği sayfada "Bir arkadaşıma ipucu gönder" formu oluşturuyorum ...

Böylece, isteyen herkes bazı arkadaşlarına e-posta-adrese ilan hakkında bir ipucu gönderebilir.

Formun bir php sayfasına gönderilmesi gerektiğini tahmin ediyorum, değil mi?

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

Formu gönderirken sayfa yeniden yükleniyor ... Bunu istemiyorum ...

Yeniden yüklenmemesini ve yine de postayı göndermesini sağlamanın bir yolu var mı? Tercihen ajax veya jquery olmadan ...

Teşekkürler


10
Bir form göndermek için HTTP isteğinde bulunmanız gerekir, sayfayı yüklemeden HTTP isteklerinde bulunmak Ajax'ın anlamıdır. Kasabaya araçsız gitmeyi deneyebilirsin.
Quentin

8
"ajax veya jquery olmadan" gibi sesler "Ben tekerlekler olmadan bir araba istiyoruz"
Sizin Sağduyuya

12
@Keith Almost, <iframe>ve targetöznitelik bunu yapacak.
alex

Özellikle XmlHttpRequest kullanmıyorsunuz, ancak yine de sunucuyu javascript ile eşzamansız olarak çağırıyorsunuz. Bu Ajax'ın kapsamına girer.
Keith Rousseau

10
Başlığı okudum ve "Ah, sadece Ajax'a ihtiyacı var" dedim. Kahvemi kıstırırken ve kafamda bir cevap hazırlarken soruyu biraz daha okudum. Soru sonunda
kahvem

Yanıtlar:


69

Sayfayı yeniden yüklemeden e-postayı göndermek için bir ajax isteği göndermeniz gerekir. Bir göz atın http://api.jquery.com/jQuery.ajax/

Kodunuz şu satırlarda olmalıdır:

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

Form send_email.php, talebi ele alması ve e-postayı göndermesi gereken sayfaya arka planda gönderilecektir.


4
HTML'yi de dahil etseydiniz bu nasıl görünürdü?
blueprintchris

6
bu send_email.php "send_email.php" olmalıdır?
Ayı

1
Bunu sadece JavaScript içeren vanilya AJAX ile nasıl yaparsınız?
Adam

.ajax, kullanılan çözümünüzle hemen hemen aynı olan bir işlev hatası değildir. paste.ubuntu.com/p/GnHzY84DQ3

1
Form hala yenileniyorsa, return false;son kapanış parantezlerinin önüne ekleyin
The Codesee

81

Daha kolay olduğunu düşündüğüm şeyi buldum. Sayfaya bir Iframe koyarsanız, eylemin çıkışını oraya yönlendirebilir ve görünmesini sağlayabilirsiniz. Elbette hiçbir şey yapamazsınız. Bu durumda, iframe görüntüsünü yok olarak ayarlayabilirsiniz.

<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
Kullandımaction="about:blank"
ThorSummoner

3
Bununla, aşağıdaki gibi değerleri hala yakalayabilir misiniz:$_POST["ad_id"]
William

neden bunun cevap olarak seçilmediğini merak ediyorum! Baş ağrısını kurtardı.
Neo

irishwill200, hayır
coldembrace

Maalesef bu çözüm benim için işe yaramayacak çünkü formu göndermek javascript'in yeniden çalışmasına ve belge hazır olayı başlatılmasına neden oluyor.
bgh

20

Ya AJAX kullanıyorsunuz ya da

  • belgeye bir iframe oluşturun ve ekleyin
  • iframe adını 'foo' olarak ayarlayın
  • form hedefini 'foo' olarak ayarlayın
  • Sunmak
  • geribildirim vermek için formlar eyleminin 'parent.notify (...)' ile javascript oluşturmasını sağlayın
  • isteğe bağlı olarak iframe'i kaldırabilirsiniz

5
Bu hala Ajax. XHR değil, ama yine de Ajax.
Quentin

3
harika numara teşekkür ederim. kullanım için örnek <form id="myGiswebForm" method="post" action="https://******/saveForm.asp" target="myiframe">ve<iframe style="display:none;" src="" name="myiframe"></iframe>
Kemal

18

En hızlı ve en kolay yol, bir iframe kullanmaktır. Sayfanızın altına bir çerçeve koyun.

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

Ve kendi formunuzda bunu yapın.

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

ve çerçeveyi css'nizde görünmez yapmak için.

iframe{
  display: none;
}

6
Olmalı display:none;ve olmamalı border:0px. Düzenlemeyi denedim, ancak düzenlemelerim, düzenleme yorumuna bakmaktan rahatsız görünmeyen gözden geçirenler tarafından reddedildi. Kodu düzeltmek için lütfen cevabınızı değiştirin.
AStopher

1
Css'i id veya sınıfa göre çağırmanızı öneririm.
RaRdEvA

1
Bu çok büyük bir hayat kurtarıcıydı. 50'den fazla giriş alanına sahip oldukça ayrıntılı bir formum vardı ve geliştirme modundayken her seferinde yeniden doldurmak zorunda kalacağımdan korkuyordum. Şimdi buna gerek yok. Bu çözümü geliştirme amacıyla şiddetle tavsiye ederiz.
Matthew Wolman

8

Sayfayı Yeniden Yüklemeden Form Gönderme ve Gönderilen Verilerin Sonucunu Aynı Sayfada Alma

İşte bu sorunu çözen internette bulduğum kodlardan bazıları:

1.) IFRAME

Form gönderildiğinde, eylem yürütülür ve yeniden yüklenecek belirli iframe'i hedefler.

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;

?>

Etiketler:


1
Teşekkürler efendim, kalbimi
kazandınız

@MuhammadAli, Buna sevindim :).
Rhalp Darren Cabrera

İnternette çok aradım. Jquery kullanıyordum, ancak Jquery bazen çalışıyor ve bazen çalışmıyor. Bu yüzden cevabınızda en iyisinin ajax olduğunu düşünüyorum.
Üzgünüm IwontTell

5

jquery-ajaxBu durumda yardım almak şart . Olmadan ajaxşu anda bir çözüm yok.

İlk olarak, form gönderildiğinde bir JavaScript işlevi çağırın. Sadece ayarlayın onsubmit="func()". İşlev çağrılsa bile, gönderimin varsayılan eylemi gerçekleştirilecektir. Bu yapılırsa, sayfayı yenilemekten veya yeniden yönlendirmekten alıkoymanın bir yolu olmayacaktır. Dolayısıyla, bir sonraki görev varsayılan eylemi önlemektir. Aşağıdaki satırı başlangıcına ekleyin func().

event.preventDefault()

Şimdi, yönlendirme veya yenileme olmayacak. Yani, sadece bir ajax araması func()yaparsınız ve arama bittiğinde yapmak istediğinizi yaparsınız.

Misal:

Form:

<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 ve AJAX olmadan tam olarak bu şekilde çalışabilir ve basit bir iFrame kullanarak çok iyi çalışır. SEVİYORUM, Opera10, FF3 ve IE6'da çalışıyor. Bana doğru yönü gösteren yukarıdaki posterlerden bazıları sayesinde, buraya yazmamın tek nedeni bu:

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

yukarıda çağrılan sayfayı oluşturan php kodu:

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
printHTML kodunu yazdırmak için PHP kullanmayın . Sadece php etiketini kapatın ?>ve html kodunu sonrasına ekleyin. Ve kullanmaktan kaçının exitgerekli değil (ölümcül hatalar, ...)
Oriol

evet, gösterdiğin için teşekkürler. Bu sadece gerekli bir örnek, sistemimde gerçekten bu şekilde yaptırmadım.
Tyler

Bu cevap üzerinde çok çalışma var, ancak başka pek çok şey var.
ReinstateMonica3167040

Bunun tek yan sorunu, içindeki get () 'dir çünkü form durum kitabının işaretlenebilir / önbelleğe alınabilir olmasını istemezdim.
drtechno

4

Bu probleminizi çözmeli.
Gönder düğmesine tıkladıktan sonra bu kodda jquery ajax diyoruz ve url'yi
POST / GET
veri tipine iletiyoruz : veri bilgileri giriş alanlarını veya diğerlerini seçebilirsiniz.
başarılı: geri arama, sunucu
işlevi parametre metni, html veya json'dan her şey yolundaysa, sunucudan
başarıyla gelen yanıt, aldığınız veriler bir tür durumdaysa vb. yazma uyarıları yazabilirsiniz. veya daha sonra ne yapmanız gerektiğini kodunuzu çalıştırın.

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

Bu kod parçacığı sorunu çözebilirken, soruyu neden veya nasıl yanıtladığını açıklamaz. Lütfen kodunuz için bir açıklamaya yer gerçekten Yayınınızla kalitesini artırmak için yardımcı olarak,. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. İşaretleyiciler / gözden geçirenler: Bunun gibi salt kod yanıtları için, olumsuz oy verin, silmeyin!
Scott Weldon

3

Formunuzun hedef özelliğini gizli bir iframe olarak ayarlamayı deneyebilirsiniz, böylece formu içeren sayfa yeniden yüklenmez.

Bunu dosya yüklemeleriyle denedim (AJAX ile yapılamayacağını biliyoruz) ve çok güzel çalıştı.


2

İFrame kullanmayı denediniz mi? Ajax yok ve orijinal sayfa yüklenmeyecek.

Gönderme formunu iframe içinde ayrı bir sayfa olarak görüntüleyebilirsiniz ve gönderildiğinde dış / kapsayıcı sayfası yeniden yüklenmez. Bu çözüm herhangi bir ajax kullanmayacaktır.


1

Yukarıdaki jquery'ye benzer bir şey yaptım, ancak form verilerimi ve grafik eki tuvallerimi sıfırlamam gerekiyordu. İşte bulduğum şey:

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

Bu benim için iyi çalışıyor, sadece bir html formu uygulamanız için, bu jquery kodunu şu şekilde basitleştirebiliriz:

       <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 kullanmak istemiyorsanız sayfa yeniden yüklenecek


4
... ya da a <iframe name="ew" />ve gibi çirkin bir şey yap<form target="ew" />
alex

Onlar hiçbir JS ziyade "preferrably ajax veya jquery olmadan" demedi
ReinstateMonica3167040

0

JavaScript'i iframe(çirkin bir yaklaşımla) sonuçlanmadan kullanmanız gerekecek .

Bunu JavaScript ile yapabilirsiniz; jQuery kullanmak onu ağrısız hale getirecektir.

AJAX ve Posting'e göz atmanızı öneririm.


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

İyi bir çözüm için defalarca denedim ve @taufique tarafından verilen cevap bu cevaba ulaşmama yardımcı oldu.

Not : event.preventDefault(); Fonksiyonun gövdesinin başına koymayı unutmayın .


0

Formun bulunduğu aynı sayfaya gönderiyorsanız, form etiketlerini bir eylem olmadan yazabilirsiniz ve form şu şekilde gönderilir

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

0

Bir başka olasılık da, işlevinize doğrudan bir javascript bağlantısı oluşturmaktır:

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

...


0

JavaScript bilmiyorum ve PHP öğrenmeye yeni başladım, bu yüzden tüm bu yanıtlardan bana yardımcı olan şey şuydu:

  1. İnedx.php oluşturun ve ekleyin:
<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. E-posta.php oluşturun ve verileri alıp almadığınızı kontrol etmek için bu kodu ekleyin (bunu iframe içinde index.php'de görmelisiniz):
    <?php
    if (isset($_POST['Submit'])){
    $email = $_POST['email'];
    echo $email;
    }
    ?>
  1. Her şey yolundaysa, email.php'deki kodu şu şekilde değiştirin:
    <?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);
    }
    ?>

Umarım bu benim gibi diğer tüm çaylaklara yardımcı olur :)


-5

Bir php sayfasına gönderip html'yi geri almak için bazı jQuery'ler:

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

1
Neden olumsuz oy verdiğinizi açıklar mısınız? Ajax olmadan yapamazsınız
Keith Rousseau

@Keith Benden olumsuz oy yok, ama belki jQuery'den bahsetmiş ve jQuery yok demiş olmanız olabilir.
alex

1
Bunlar gönderme yöntemi için yanlış argümanlardır, formdan herhangi bir veri toplamazsınız ve eylemi formdan almak yerine belirli bir uri'ye gönderen genel bir "tüm formlar için geçerlidir" seçicisi kullanırsınız. çağrı sonrası.
Quentin

1
Aman tanrım. jQuery, bağımsız değişkenlerin atlanabilmesi için tür denetimi yapar. Yuck.
Quentin

1
Evet, bunu her yerde yapıyorlar. JQuery API'ye hoş geldiniz
Keith Rousseau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.