페이지를 다시로드하지 않고 양식 제출


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의 의미입니다. 차없이 시내까지 운전 해 볼 수도 있습니다.
Quentin

7
"without ajax or jquery"는 "나는 바퀴없는 차를 원한다"처럼 들린다
상식

12
@Keith Almost, <iframe>그리고 target속성이 그것을 할 것입니다.
alex

특별히 XmlHttpRequest를 사용하지 않지만 자바 스크립트를 사용하여 서버를 비동기 적으로 호출하고 있습니다. 그것은 Ajax에 속합니다.
Keith Rousseau

10
제목을 읽고 "아, 그는 Ajax가 필요해"라고 생각했습니다. 나는 커피를 마시고 머릿속에 답을 준비하면서 질문을 더 읽고 있었다. 질문의 끝에서 내 커피가 화면 전체에 있습니다 ...
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"여야합니까?
Bear

1
단순한 JavaScript로 바닐라 AJAX로 어떻게 이것을 할 수 있습니까?
Adam

.ajax는 사용 된 솔루션과 거의 동일한 기능 오류가 아닙니다. paste.ubuntu.com/p/GnHzY84DQ3

1
양식이 여전히 새로 고쳐 return false;지면 마지막 닫는 대괄호 앞에 추가하십시오
The Codesee

81

더 쉬운 방법이라고 생각하는 것을 찾았습니다. 페이지에 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

3
이것으로, 당신은 여전히 ​​다음과 같은 값을 잡을 수 있습니다 :$_POST["ad_id"]
William

왜 이것이 답으로 선택되지 않았는지 궁금합니다! 두통을 구했습니다.
네오

irishwill200, no
coldembrace

불행히도 양식을 제출하면 자바 스크립트가 다시 실행되고 문서 준비 이벤트가 호출되기 때문에이 솔루션이 작동하지 않습니다.
bgh

19

AJAX를 사용하거나

  • iframe 생성 및 문서에 추가
  • iframe 이름을 'foo'로 설정
  • 양식 대상을 'foo'로 설정
  • 제출
  • 양식 작업이 'parent.notify (...)'로 자바 스크립트를 렌더링하여 피드백을 제공하십시오.
  • 선택적으로 iframe을 제거 할 수 있습니다.

5
그것은 여전히 ​​Ajax입니다. XHR은 아니지만 여전히 Ajax.
Quentin

3
대단한 트릭 감사합니다. 샘플 사용 <form id="myGiswebForm" method="post" action="https://******/saveForm.asp" target="myiframe"><iframe style="display:none;" src="" name="myiframe"></iframe>
Kemal

18

가장 빠르고 쉬운 방법은 iframe을 사용하는 것입니다. 페이지 하단에 프레임을 넣으십시오.

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

그리고 당신의 형태로 이것을하십시오.

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

CSS에서 프레임을 보이지 않게 만듭니다.

iframe{
  display: none;
}

6
해야 display:none;하지 border:0px. 편집을 시도했지만 편집 주석을 보는 데 신경 쓰지 않는 검토 자에 의해 편집이 거부되었습니다. 코드를 수정하려면 답변을 수정하세요.
AStopher

1
나는 ID 또는 클래스로 CSS를 호출하는 것이 좋습니다.
RaRdEvA

1
이것은 엄청난 생명의 은인이었습니다. 50 개가 넘는 입력 필드가있는 매우 상세한 양식이 있었고 개발 모드에서 매번 다시 채워야 할까 두려웠습니다. 이제 그럴 필요가 없습니다. 개발 목적으로이 솔루션을 적극 권장합니다.
Matthew Wolman

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, 여기에 기뻐요 :).
Rhalp Darren Cabrera

인터넷에서 많이 검색했습니다. 나는 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>

자바 스크립트 :

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

네, 지적 해 주셔서 감사합니다. 이것은 단지 필요한 예일뿐입니다. 저는 제 시스템에서 이런 식으로 수행하지 않았습니다.
Tyler

이 답변에 대한 많은 작업이지만 다른 많은 작업이 있습니다.
사용자가 아닌 사용자

이것에 대한 유일한 부수적 인 문제는 그 안에있는 get ()이다. 왜냐하면 나는 상태 책을 markable / cacheable로 원하지 않기 때문이다.
drtechno 2014

4

이것은 당신의 문제를 해결할 것입니다.
제출 버튼을 클릭 한 후이 코드에서 jquery ajax를 호출하고
POST / GET
데이터 유형 을 게시하는 URL을 전달 합니다. 데이터 정보는 입력 필드 또는 기타 항목을 선택할 수 있습니다.
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>

이 코드 스 니펫은 문제를 해결할 수 있지만 질문에 대한 이유 또는 답을 설명하지 않습니다. 게시물의 품질을 높이는 데 도움이되므로 코드에 대한 설명을 포함 해주세요 . 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다. 신고자 / 검토 자 : 이 답변과 같은 코드 전용 답변의 경우 반대 투표, 삭제하지 마세요!
Scott Weldon 2016

3

양식의 대상 속성을 숨겨진 iframe으로 설정하여 양식이 포함 된 페이지가 다시로드되지 않도록 할 수 있습니다.

파일 업로드 (AJAX를 통해 수행 할 수 없음)로 시도해 보았고 아름답게 작동했습니다.


2

iFrame을 사용해 보셨습니까? 아약스가 없으며 원본 페이지가로드되지 않습니다.

제출 양식을 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

iframe(추악한 접근 방식) 결과없이 JavaScript를 사용해야 합니다.

JavaScript로 할 수 있습니다. jQuery를 사용하면 고통스럽지 않습니다.

AJAX 및 Posting을 확인하는 것이 좋습니다.


0

추가 가능성은 함수에 직접 자바 스크립트 링크를 만드는 것입니다.

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

...


-1

자바 스크립트를 사용하지 않으려면 페이지가 다시로드됩니다.


4
... 또는 a <iframe name="ew" />와 같은 못생긴 일을하세요<form target="ew" />
alex

그들은 더 JS, 오히려 "가급적 아약스 또는 JQuery와없이"말한 적
사용자 사용자가 아닙니다

-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 없이는 할 수 없습니다
Keith Rousseau

@Keith 나에게 반대표를 던지지는 않았지만 아마도 당신이 jQuery를 언급했고 그는 jQuery가 없다고 말했기 때문일 것입니다.
alex

1
이는 post 메소드에 대한 잘못된 인수이며, 양식에서 데이터를 수집하지 않으며, "폼에서 조치를 가져 오는 대신 특정 URI에 게시"와 함께 일반 "모든 양식에 적용"선택기를 사용합니다. 포스트 콜.
Quentin

1
오, 좋은 슬픔. jQuery는 유형 검사를 수행하므로 인수를 건너 뛸 수 있습니다. 왝.
Quentin

1
예, 그들은 모든 곳에서 그렇게합니다. jQuery API에 오신 것을 환영합니다
Keith Rousseau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.