ページをリロードせずにフォームを送信する


91

クラシファイド広告のWebサイトを持っていて、広告が表示されるページで、「友達にヒントを送る」フォームを作成しています...

したがって、誰でも広告のヒントを友達にメールで送信できます。

フォームを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属性は、それを行います。
アレックス、

具体的にはXmlHttpRequestを使用していませんが、JavaScriptを使用してサーバーを非同期で呼び出しています。それはAjaxに該当します。
キース・ルソー

10
タイトルを読んで「ああ、Ajaxが必要だ」と思った。私は私のコーヒーをつかんで、頭の中で答えを準備している間、質問をさらに読みました。質問の最後に、私のコーヒーは画面
いっぱいに広がっ

回答:


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"であるべきですか?
2017

1
単なるJavaScriptを使用したバニラAJAXでこれをどのように行いますか?
Adam

.ajaxは、使用しているソリューションとほぼ同じ機能エラーではありません。paste.ubuntu.com/p/GnHzY84DQ3

フォームがまだreturn false;
更新されている

78

もっと簡単な方法だと思います。ページにiframeを配置すると、アクションの終了をそこにリダイレクトして表示させることができます。もちろん、何もできません。その場合、iframe表示をなしに設定できます。

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

2
これで、次のような値を取得できますか?$_POST["ad_id"]
William

なぜこれが答えとして選ばれなかったのだろう。頭痛を救った。
Neo

irishwill200、いいえ
コールドエンブレム2017年

残念ながら、フォームを送信するとJavaScriptが再度実行され、ドキュメント対応イベントが呼び出されるため、このソリューションは機能しません。
bgh 2018年

19

AJAXを使用するか、

  • iframeを作成してドキュメントに追加する
  • iframe名を「foo」に設定します
  • フォームのターゲットを「foo」に設定します
  • 参加する
  • フォームアクションに「parent.notify(...)」を使用してJavaScriptをレンダリングし、フィードバックを提供する
  • オプションで、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>
Kemal

17

最も速くて簡単な方法は、iframeを使用することです。ページの下部にフレームを配置します。

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

そしてあなたのフォームでこれをしてください。

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

そしてあなたのCSSでフレームを見えなくする。

iframe{
  display: none;
}

6
である必要がdisplay:none;ありborder:0pxます。編集を試しましたが、編集コメントを見てわざわざいないレビュアーが私の編集を拒否しました。回答を修正してコードを修正してください。
AStopher 2016年

1
IDまたはクラスでCSSを呼び出すことをお勧めします。
RaRdEvA

1
これは巨大な命の恩人でした。私は50を超える入力フィールドを持つ非常に詳細なフォームを持っていて、開発モードのときに毎回それを再入力する必要があるのではないかと心配しました。今、私はする必要はありません。開発目的でこのソリューションを強くお勧めします。
マシューウォルマン

7

ページをリロードせずにフォームを送信し、同じページで送信されたデータの結果を取得する

この問題を解決するためにインターネットで見つけたコードの一部を次に示します。

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、ここに喜んでいる:)。
Rhalp Darren Cabrera

私はインターネットで何度も検索しました。私はJqueryを使用していましたが、Jqueryが動作することも動作しないこともあります。
申し訳ありませんが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を使用すると非常にうまく機能します。I LOVE IT、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 2013

そう、指摘してくれてありがとう。これは必要な例にすぎませんが、実際にはシステムでこのように実行していません。
タイラー

これはこの答えについては多くの作業ですが、他にもたくさんあります。
ユーザーではないユーザー

これに対する唯一の問題は、フォームステートブックをマーク可能/キャッシュ可能にする必要がないため、その中のget()です。
drtechno

4

これで問題が解決するはずです。
このコードでは、送信ボタンをクリックした後、jquery ajaxを呼び出し、投稿
タイプのPOST / GET
データにURLを渡します。入力フィールドまたはその他のデータ情報を選択できます。
成功:サーバー
関数のパラメーターテキスト、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>

このコードスニペットは問題を解決する可能性がありますが、なぜまたはどのように質問に答えるかは説明していません。コードの説明を含めてください。これは、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。報告者/レビュアー: このようなコードのみの回答の場合は、投票しないでください。削除しないでください。
Scott Weldon

3

フォームのtarget属性を非表示の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

iframe(醜いアプローチ)につながることなくJavaScriptを使用する必要があります。

JavaScriptでそれを行うことができます。jQueryを使用すると、簡単になります。

AJAXとPostingをチェックすることをお勧めします。


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の回答がこの回答にたどり着きました。

注意event.preventDefault(); 関数の本体の最初に置くことを忘れないでください 。


-6

以下は、phpページに投稿してhtmlを取得するためのjQueryです。

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

1
なぜ反対票を投じたのか説明してください。あなたはAjaxをせずにそれを行うことはできません
キース・ルソー

@キース私からの反対投票はありませんが、それはあなたがjQueryについて言及し、彼がjQueryを言わなかったためかもしれません。
アレックス

1
これらは、postメソッドの誤った引数であり、フォームからデータを収集せず、「フォームからアクションを取得する代わりに、特定のURIへの投稿」で汎用の「すべてのフォームに適用」セレクターを使用しますポストコール。
クエンティン

1
ああ、良い悲しみ。jQueryは型チェックを行うので、引数をスキップできます。ああ。
Quentin

1
はい、彼らはあちこちでそれをします。jQuery APIへようこそ
キース・ルソー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.