Отправить форму без перезагрузки страницы


94

У меня есть сайт объявлений, и на странице, где показываются объявления, я создаю форму «Отправить отзыв другу» ...

Так что любой желающий может отправить отзыв о рекламе на адрес электронной почты друзей.

Я предполагаю, что форма должна быть отправлена ​​на страницу 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-запрос, создание HTTP-запросов без загрузки страницы - это то, что означает Ajax. С таким же успехом можно попробовать поехать в город без машины.
Квентин

7
«без ajax или jquery» звучит как «я хочу машину без колес»
ваш здравый смысл

12
@Keith Почти, <iframe>и targetатрибут сделает это.
Alex

Вы не используете XmlHttpRequest специально, но по-прежнему вызываете сервер асинхронно с помощью javascript. Это подпадает под Ajax.
Кейт Руссо,

10
Я прочитал заголовок и подумал: «А, ему просто нужен Аякс». Я читал вопрос дальше, попивая кофе и готовя ответ в своей голове. В конце вопроса, мой кофе весь на экране ...
BalusC

Ответы:


69

Вам нужно будет отправить запрос 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?
Adam

.ajax не является ошибкой функции с почти таким же используемым вашим решением. paste.ubuntu.com/p/GnHzY84DQ3

1
Если форма все еще обновляется, добавьте return false;перед последними закрывающими скобками
Codesee

81

Я нашел более простой способ. Если вы поместите 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

3
При этом вы все еще можете получить такие значения, как:$_POST["ad_id"]
Уильям,

интересно, почему это не было выбрано в качестве ответа! Спасла головная боль.
Neo

irishwill200, нет
coldembrace 02

К сожалению, это решение не сработает для меня, потому что при отправке формы снова запускается javascript и вызывается событие готовности документа.
bgh

20

Вы либо используете AJAX, либо

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

5
Это все еще Ajax. Не XHR, но все же Ajax.
Квентин

3
отличный трюк, спасибо. образец для использования <form id="myGiswebForm" method="post" action="https://******/saveForm.asp" target="myiframe">и<iframe style="display:none;" src="" name="myiframe"></iframe>
Кемаль

18

Самый быстрый и простой способ - использовать iframe. Поместите рамку внизу вашей страницы.

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

И в своей форме сделайте это.

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

и сделать фрейм невидимым в вашем css.

iframe{
  display: none;
}

6
Должно быть display:none;и нет border:0px. Пытался отредактировать, но мои правки отклонены рецензентами, которые, похоже, не удосуживаются просматривать комментарий редактирования. Измените свой ответ, чтобы исправить код.
AStopher

1
Предлагаю вызвать CSS по идентификатору или классу.
RaRdEvA

1
Это было огромным спасателем. У меня была очень подробная форма с более чем 50 полями ввода, и я боялся, что мне придется каждый раз заполнять ее заново в режиме разработки. Теперь мне не нужно. Настоятельно рекомендую это решение для разработки.
Мэтью Вулман,

8

Отправка формы без перезагрузки страницы и получение результатов отправленных данных на той же странице

Вот код, который я нашел в Интернете, который решает эту проблему:

1.) IFRAME

Когда форма отправлена, действие будет выполнено и нацелено на конкретный 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

5

В этом случае необходимо обратиться за помощью 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
data: информация о данных, вы можете выбрать поля ввода или любые другие.
sucess: обратный вызов, если все в порядке с
текстом параметра функции сервера , 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, и когда она будет отправлена, внешняя страница / страница контейнера не будет перезагружаться. Это решение не будет использовать какой-либо ajax.


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.


4
... или сделайте что-нибудь уродливое, как <iframe name="ew" />и<form target="ew" />
Алекс

Они никогда не говорили «без JS», а скорее «Желательно без ajax или jquery»
Пользователь, который не является пользователем

0

Вам нужно будет использовать JavaScript без iframe(уродливого подхода).

Вы можете сделать это в JavaScript; использование jQuery сделает это безболезненно.

Я предлагаю вам проверить AJAX и Posting.


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

Я много раз пробовал найти хорошее решение, и ответ @taufique помог мне прийти к этому ответу.

NB : Не забудьте поставить event.preventDefault(); в начале тела функции.


0

Еще одна возможность - сделать прямую ссылку javascript на вашу функцию:

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

...


-5

Вот несколько 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
Это неправильные аргументы для метода публикации, вы не собираете никаких данных из формы, и вы используете универсальный селектор «применяется ко всем формам» с «отправляет сообщения на определенный uri вместо получения действия из формы» почтовый звонок.
Квентин

1
О, хорошее горе. jQuery выполняет проверку типов, поэтому аргументы можно пропустить. Фу.
Квентин

1
Да, они делают это повсюду. Добро пожаловать в jQuery API
Кейт Руссо,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.