Подайте форму без перезавантаження сторінки


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-запит, що означає Ajax робити HTTP-запити без завантаження сторінки. Можна також спробувати доїхати до міста без транспортного засобу.
Квентін

7
"без ajax або jquery" звучить як "я хочу машину без коліс"
Ваш здоровий глузд

12
@Keith Майже, <iframe>і targetатрибут це зробить.
alex

Ви не використовуєте XmlHttpRequest спеціально, але ви все одно викликаєте сервер асинхронно за допомогою JavaScript. Це підпадає під Аякс.
Кіт Руссо,

10
Я прочитав заголовок і подумав "Ах, йому просто потрібен Аякс". Я читав запитання далі, клюючи каву і готуючи відповідь у своїй голові. В кінці запитання моя кава на всьому екрані ...
BalusC

Відповіді:


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
Як би ви зробили це за допомогою просто ванільного AJAX за допомогою простого JavaScript?
Адам

.ajax не є помилкою функції майже з таким самим вашим рішенням. paste.ubuntu.com/p/GnHzY84DQ3

Якщо форма все ще оновлюється, додайте return false;перед останніми заключними дужками
The Codesee

78

Я знайшов, на мій погляд, простіший спосіб. Якщо ви вставите на сторінку 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>

2
Я використовувавaction="about:blank"
ThorSummoner

2
За допомогою цього, ви все ще можете схопити такі значення, як:$_POST["ad_id"]
Вільям

цікаво, чому це не вибрано як відповідь! Врятував головний біль.
Нео

irishwill200, ні
холодні обійми

На жаль, це рішення для мене не спрацює, оскільки надсилання форми призводить до того, що javascript запускається знову, і викликається подія готовості до документу.
bgh

19

Ви або використовуєте AJAX, або ви

  • створити і додати в документ вставку
  • встановити ім'я iframes на 'foo'
  • встановити для цільової форми значення 'foo'
  • подати
  • мати форму, щоб відтворити javascript із 'parent.notify (...)', щоб надіслати відгук
  • за бажанням ви можете видалити iframe

5
Це все ще Аякс. Не 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
Я пропоную зателефонувати css за ідентифікатором або класом.
RaRdEvA

1
Це було величезним порятунком життя. У мене була дуже детальна форма з понад 50 полями введення, і я боявся, що мені доведеться заповнювати її щоразу, коли я перебуваю в режимі розробника. Тепер мені не потрібно. Настійно рекомендую це рішення для цілей розробки.
Метью Волман,

7

Подання форми без перезавантаження сторінки та отримання результатів поданих даних на тій самій сторінці

Ось деякий код, який я знайшов в Інтернеті, який вирішує цю проблему:

1.) РАМКА

Коли форма буде надіслана, дія буде виконана та націлена на вказаний 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, Радий, що це :).
Ральп Даррен Кабрера,

Я багато разів шукав в Інтернеті. Я використовував Jquery, але Jquery іноді працює, а іноді ні, тому я думаю, що найкращий ajax, про що згадується у вашій відповіді.
Вибачте, IwontTell

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

так, дякую, що вказали. Це лише необхідний приклад, я насправді не робив цього у своїй системі.
Тайлер

Це дуже багато роботи над цією відповіддю, але є багато інших.
Користувач, який не є користувачем

єдиною побічною проблемою цього є get () у ньому, оскільки я б не хотів, щоб книга державної форми розмічалася / кешувалася.
drtechno

4

Це має вирішити вашу проблему.
У цьому коді після натискання кнопки подання ми називаємо jquery ajax, і ми передаємо url для розміщення даних
типу POST / GET
: інформацію про дані ви можете вибрати поля введення або будь-які інші.
sucess: зворотний виклик, якщо з
параметром функції функції сервера текст text, 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>

Хоча цей фрагмент коду може вирішити проблему, він не пояснює, чому і як він відповідає на питання. Будь ласка, включіть пояснення до свого коду , оскільки це справді допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду. Флаггери / рецензенти: Для відповідей лише з кодом, таких як цей, голосувати проти - не видаляти!
Скотт Уелдон

3

Ви можете спробувати встановити цільовий атрибут вашої форми на прихований iframe, щоб сторінка, що містить форму, не перезавантажувалася.

Я спробував це з завантаженням файлів (які, як ми знаємо, неможливо зробити за допомогою AJAX), і це працювало чудово.


2

Ви пробували використовувати iFrame? Немає ajax, і оригінальна сторінка не завантажується.

Ви можете відобразити форму подання як окрему сторінку всередині iframe, і коли вона надійде, зовнішня / контейнерна сторінка не буде перезавантажена. Це рішення не використовуватиме будь-який вид аякс.


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
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 допомогла мені дійти до цієї відповіді.

NB : Не забудьте поставити 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.
alex

1
Це неправильні аргументи для методу post, ви не збираєте ніяких даних із форми, і ви використовуєте загальний селектор "застосовується до всіх форм" із "дописами до певного uri, замість того, щоб отримати дію з форми" післядзвінок.
Квентін

1
О, добре горе. jQuery виконує перевірку типу, щоб аргументи можна було пропустити. Гидота.
Квентін

1
Так, вони роблять це всюди. Ласкаво просимо до jQuery API
Кіт Руссо,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.