Prześlij formularz bez ponownego ładowania strony

95

Mam witrynę z ogłoszeniami drobnymi i na stronie, na której wyświetlane są reklamy, tworzę formularz „Wyślij napiwek znajomemu” ...

Więc każdy, kto chce, może wysłać wskazówkę dotyczącą ogłoszenia do znajomych na adres e-mail.

Domyślam się, że formularz należy przesłać na stronę php, prawda?

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

Podczas wysyłania formularza strona jest ponownie ładowana ... Nie chcę tego ...

Czy jest jakiś sposób, aby nie ładować ponownie i nadal wysyłać pocztę? Najlepiej bez ajax lub jquery ...

Dzięki

FruDe
źródło
10
Aby wysłać formularz, musisz wysłać żądanie HTTP, a wysyłanie żądań HTTP bez ładowania strony jest tym, co oznacza Ajax. Równie dobrze mógłbym spróbować jechać do miasta bez pojazdu.
Quentin
8
„bez ajax lub jquery” brzmi jak „Chcę samochód bez kół”
Twój zdrowy rozsądek
12
@Keith prawie, <iframe>a targetatrybut to zrobi.
alex
Nie używasz w szczególności XmlHttpRequest, ale nadal asynchronicznie wywołujesz serwer za pomocą javascript. To podlega Ajaxowi.
Keith Rousseau
10
Przeczytałem tytuł i pomyślałem: „Ach, po prostu potrzebuje Ajax”. Czytałem dalej pytanie, nadgryzając kawę i przygotowując odpowiedź w głowie. Na koniec pytanie moja kawa jest na całym ekranie ...
BalusC

Odpowiedzi:

69

Aby wysłać wiadomość e-mail bez ponownego ładowania strony, musisz przesłać żądanie AJAX. Spójrz na http://api.jquery.com/jQuery.ajax/

Twój kod powinien wyglądać następująco:

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

Formularz zostanie przesłany w tle do send_email.phpstrony, która będzie musiała obsłużyć żądanie i wysłać e-mail.

jkilbride
źródło
4
Jak by to wyglądało, gdybyś dołączył również kod HTML?
blueprintchris
6
że send_email.php powinno być „send_email.php”?
Bear
1
Jak byś to zrobił, używając zwykłego AJAX-a ze zwykłym JavaScriptem?
Adam
.ajax nie jest błędem funkcji z prawie takim samym rozwiązaniem. paste.ubuntu.com/p/GnHzY84DQ3
1
Jeśli formularz jest nadal odświeżany, dodaj return false;przed ostatnimi nawiasami zamykającymi
The Codesee
81

Znalazłem łatwiejszy sposób. Jeśli umieścisz ramkę iframe na stronie, możesz przekierować tam zakończenie działania i sprawić, że się pojawi. Oczywiście nic nie możesz zrobić. W takim przypadku możesz ustawić wyświetlanie elementu iframe na brak.

<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
źródło
2
Użyłemaction="about:blank"
ThorSummoner
3
Dzięki temu nadal możesz pobrać wartości, takie jak:$_POST["ad_id"]
William
zastanawiam się, dlaczego to nie zostało wybrane jako odpowiedź! Uratowałem ból głowy.
Neo
irishwill200, no
coldembrace
Niestety to rozwiązanie nie zadziała, ponieważ wysłanie formularza powoduje ponowne uruchomienie javascript i wywołanie zdarzenia gotowości dokumentu.
bgh
20

Używasz AJAX lub siebie

  • utwórz i dołącz ramkę iframe do dokumentu
  • ustaw nazwę iframe na „foo”
  • ustaw cel formularza na „foo”
  • Zatwierdź
  • Niech akcja formularzy renderuje javascript z 'parent.notify (...)', aby przekazać opinię
  • opcjonalnie możesz usunąć ramkę iframe
Sean Kinsey
źródło
5
To wciąż Ajax. Nie XHR, ale Ajax.
Quentin
3
świetna sztuczka, dziękuję. próbka do użytku <form id="myGiswebForm" method="post" action="https://******/saveForm.asp" target="myiframe">i<iframe style="display:none;" src="" name="myiframe"></iframe>
Kemal
18

Najszybszym i najłatwiejszym sposobem jest użycie elementu iframe. Umieść ramkę u dołu strony.

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

I zrób to w swojej formie.

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

i uczynić ramkę niewidoczną w twoim css.

iframe{
  display: none;
}
Dragan Marjanovic
źródło
6
Powinien być display:none;i nie border:0px. Próbowałem edytować, ale moje zmiany są odrzucane przez recenzentów, którzy wydają się nie przejmować się przeglądaniem komentarza do edycji. Zmodyfikuj swoją odpowiedź, aby naprawić kod.
AStopher
1
Proponuję zadzwonić do css po id lub class.
RaRdEvA
1
To był ogromny ratunek dla życia. Miałem bardzo szczegółowy formularz z ponad 50 polami wejściowymi i bałam się, że będę musiał go ponownie wypełniać za każdym razem, gdy będę w trybie programisty. Teraz nie muszę. Gorąco polecam to rozwiązanie do celów programistycznych.
Matthew Wolman
8

Przesyłanie formularza bez ponownego ładowania strony i uzyskiwanie wyników przesłanych danych na tej samej stronie

Oto część kodu, który znalazłem w Internecie, który rozwiązuje ten problem:

1.) IFRAME

Po przesłaniu formularza akcja zostanie wykonana i będzie skierowana do określonego elementu iframe do ponownego załadowania.

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;

?>

Tagi:

Rhalp Darren Cabrera
źródło
1
Dzięki sir, masz moje serce, tak trzymaj
Przepraszam, że powiem
@MuhammadAli, Cieszę się, że tutaj :).
Rhalp Darren Cabrera
Wiele razy szukałem w internecie. Używałem Jquery, ale Jquery czasami działa, a czasami nie, więc myślę, że Ajax jest najlepszy, o czym wspomina się w Twojej odpowiedzi.
Przepraszam, IwontTell
5

W jquery-ajaxtym przypadku trzeba skorzystać z pomocy . Bez ajaxtego obecnie nie ma rozwiązania.

Najpierw wywołaj funkcję JavaScript po przesłaniu formularza. Po prostu ustaw onsubmit="func()". Nawet jeśli funkcja zostanie wywołana, zostanie wykonana domyślna akcja przesyłania. Jeśli zostanie wykonana, nie będzie możliwości powstrzymania odświeżania lub przekierowywania strony. Zatem następnym zadaniem jest zapobieganie domyślnej akcji. Wstaw następujący wiersz na początku func().

event.preventDefault()

Teraz nie będzie przekierowań ani odświeżania. Więc po prostu wykonujesz wywołanie Ajax od func()i robisz cokolwiek zechcesz po zakończeniu połączenia.

Przykład:

Formularz:

<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
źródło
4

dokładnie tak to MOŻE działać bez jQuery i AJAX i działa bardzo dobrze przy użyciu prostej ramki iFrame. I LOVE IT, działa w Opera10, FF3 i IE6. Dzięki niektórym z powyższych plakatów wskazujących mi właściwy kierunek, to jedyny powód, dla którego zamieszczam tutaj:

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

kod php generujący wywoływaną stronę:

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
źródło
3
Nie używaj PHP printdo drukowania kodu HTML. Po prostu zamknij tag php ?>i dodaj kod HTML po. I unikaj używania exitgo, nie jest to konieczne (błędy krytyczne, ...)
Oriol
tak, dzięki za wskazanie tego. To tylko niezbędny przykład, tak naprawdę nie mam tego w moim systemie.
Tyler
To dużo pracy nad tą odpowiedzią, ale jest wiele innych.
Użytkownik, który nie jest użytkownikiem,
Jedynym problemem pobocznym jest funkcja get (), ponieważ nie chciałbym, aby książka stanu była oznaczalna / buforowana.
drtechno
4

To powinno rozwiązać twój problem.
W tym kodzie po kliknięciu przycisku wysyłania wywołujemy jquery ajax i przekazujemy adres URL do posta
typu POST / GET
data: informacje o danych można wybrać pola wejściowe lub dowolne inne.
sucess: wywołanie zwrotne, jeśli wszystko jest w porządku z
tekstu parametru funkcji serwera , html lub json, odpowiedź z serwera
w przypadku powodzenia możesz napisać ostrzeżenia o zapisie, jeśli otrzymane dane są w jakimś stanie i tak dalej. lub wykonaj swój kod, co dalej.

<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
źródło
Chociaż ten fragment kodu może rozwiązać problem, nie wyjaśnia, dlaczego ani jak odpowiada na pytanie. Dołącz wyjaśnienie swojego kodu , ponieważ naprawdę pomaga to poprawić jakość Twojego postu. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Osoby zgłaszające / recenzenci: w przypadku odpowiedzi zawierających tylko kod, takich jak ta, głosuj przeciw, nie usuwaj!
Scott Weldon
3

Możesz spróbować ustawić atrybut target formularza na ukrytą ramkę iframe, aby strona zawierająca formularz nie została ponownie załadowana.

Wypróbowałem to z przesyłaniem plików (czego wiemy, że nie można tego zrobić przez AJAX) i działało pięknie.

wtaniguchi
źródło
2

Czy próbowałeś użyć iFrame? Brak Ajax, a oryginalna strona się nie załaduje.

Możesz wyświetlić formularz przesyłania jako oddzielną stronę wewnątrz elementu iframe, a po jego przesłaniu strona zewnętrzna / kontenera nie zostanie załadowana ponownie. To rozwiązanie nie będzie wykorzystywało żadnego rodzaju AJAX.

DanC
źródło
1

jeśli przesyłasz na tę samą stronę, na której znajduje się formularz, możesz napisać tagi formularza bez działania, a zostanie on przesłany, w ten sposób

<form method='post'> <!-- you can see there is no action here-->
M.abdelrhman
źródło
1

Zrobiłem coś podobnego do powyższego jQuery, ale musiałem zresetować dane formularza i obrazy załączników graficznych. Oto co wymyśliłem:

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

To działa dobrze dla mnie, dla twojego zastosowania tylko formularza HTML, możemy uprościć ten kod jquery w następujący sposób:

       <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
źródło
0

Strona zostanie ponownie załadowana, jeśli nie chcesz używać javascript

baloo
źródło
4
... albo zrób coś brzydkiego jak <iframe name="ew" />i<form target="ew" />
alex
Nigdy nie powiedzieli, że nie ma JS, ale raczej „Najlepiej bez ajax lub jquery”
użytkownik, który nie jest użytkownikiem
0

Będziesz musiał używać JavaScript bez iframe(brzydkiego podejścia).

Możesz to zrobić w JavaScript; użycie jQuery sprawi, że będzie to bezbolesne.

Proponuję sprawdzić AJAX i Posting.

Alex
źródło
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');
      }
   }   );
}

Wiele razy próbowałem znaleźć dobre rozwiązanie, a odpowiedź @taufique pomogła mi dojść do tej odpowiedzi.

Uwaga : nie zapomnij umieścić event.preventDefault(); na początku treści funkcji.

Dayz
źródło
0

Kolejną możliwością jest utworzenie bezpośredniego linku javascript do swojej funkcji:

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

...


źródło
-5

Oto kilka jQuery do wysyłania na stronę php i odzyskiwania html:

$('form').submit(function() {
    $.post('tip.php', function(html) {
       // do what you need in your success callback
    }
    return false;
});
Keith Rousseau
źródło
1
Chcesz wyjaśnić, dlaczego przegłosowałeś? Nie możesz tego zrobić bez Ajaxa
Keitha Rousseau
@Keith Brak opinii ode mnie, ale może to dlatego, że wspomniałeś o jQuery, a on powiedział, że nie ma jQuery.
alex
1
To są złe argumenty dla metody postu, nie zbierasz żadnych danych z formularza i używasz ogólnego selektora „dotyczy wszystkich formularzy” z „wysyła do określonego URI zamiast pobierania akcji z formularza” połączenie pocztowe.
Quentin
1
Och, dobry smutek. jQuery sprawdza typy, więc argumenty można pominąć. Fuj.
Quentin
1
Tak, robią to wszędzie. Witamy w API jQuery
Keith Rousseau