2014-06-19 139 views
0

我是AJAX新手,並且正在將某些常規HTML表單轉換爲AJAX。AJAX表單提交沒有Javascript後退

我現有的實現如下 - form(在page1.php上)發佈到page2.php,它對發佈數據做了一些驗證,如果缺少某些內容,則重定向到錯誤頁面。如果輸入正常,它會包含page3.php,它將處理請求並重定向回page1.php。

PHP/page1.php中

<form method="post" action="/php/page2.php" > 
    <input type="text" name="input1" placeholder="Howdy..." /> 
    <input type="text" name="input2" placeholder="Howdy..." /> 

    <input type="submit" value="Submit" />  
</form> 

PHP /使page2.php

<?php 

    // perform some validation on inputs 
    if (empty($_POST['input1'])) 
    { 
    $location ='Location: /php/error.php'; 
    header($location); 
    exit; 
    } 

    // Inputs are fine 
    include('/php/page3.php'); 

?> 

page3.php

<?php 

    // do some form processing 


    // redirect back to page1.php 
    $location = 'Location: /php/page1.php"; 
    header($location); 
    exit; 
?> 

要轉換到AJAX,我使用@ SSL的解決方案上此SO鏈接How to show loading gif when request goes Ajax http://jsfiddle.net/clickthelink/Uwcuz/1/

來自驗證和成功頁面的錯誤都通過回調函數顯示在page1.php中。

PHP /使page2.php

<?php 

    // perform some validation on inputs 
    if (empty($_POST['input1'])) 
    { 
    // Echo erorr code isntead of redirect 
    echo "Please enter input1"; 
    return; 

    //$location ='Location: /php/error.php'; 
    //header($location); 
    //exit; 
    } 

    // Inputs are fine 
    include('/php/page3.php'); 

?> 

page3.php

<?php 

    // do some form processing 

    // Echo success instead of redirect 
    echo "SUCCESS"; 

    // redirect back to page1.php 
    //$location = 'Location: /php/page1.php"; 
    //header($location); 
    //exit; 
?> 

這部分工作的罰款。

我的問題(最後)是我如何處理禁用JavaScript的用戶?我知道表單會被正確提交,但如果出現錯誤或成功,我不會得到重定向。我想在這種情況下也保留header()重定向類型的功能。這可能嗎?我將不勝感激。

+0

您可以很容易地識別請求是否是AJAX調用,導致它設置HTTP標頭。因此,如果沒有js的表單提交,應該可以讓PHP後端以不同的方式響應。 – gpgekko

+0

不確定爲什麼這個問題是downvoted?如果這個人放棄了評論,我會很感激,所以我知道我做錯了什麼。順便說一下,我確實發現了一些有關AJ關於AJAX回退的問題,沒有JS,但沒有具體的重新回到原始頁面。 – user3573508

+0

@gpgekko感謝您的快速響應。你是否建議與quoo建議的相同?或不同的東西 – user3573508

回答

0

保留目前的形式設置爲-是,如果是爲你工作沒有JavaScript的。

對於啓用JavaScript的瀏覽器,您可以劫持表單上的「提交」事件。捕獲事件並通過ajax將表單發佈到腳本/頁面,該腳本/頁面以易於使用的JavaScript格式處理和返回數據以供最終使用。

例如,使用jQuery:

<form method="post" action="/php/page2.php" id="js-form" > 
    <input type="text" name="input1" placeholder="Howdy..." /> 
    <input type="text" name="input2" placeholder="Howdy..." /> 
    <input type="submit" value="Submit" />  
</form> 

<script> 
$(document).ready(function(){ 
    $('#js-form').on('submit',function(e){ 

     // logic to submit ajax form and handle response 

     // return false to cancel native browser form submission. 
     return false; 
    }); 
}); 
</script> 

另一個想法是讓你已有的頁面,但是送一個標記與Ajax請求禁用瀏覽器重定向頭。例如,通過ajax提交表單時添加'src = ajax'。然後在腳本中使用邏輯來說:

<?php 
    if(!empty($_REQUEST['src'] && $_REQUEST['src'] == 'ajax') { 
     // add redirect logic here. 
    } 
?> 
+0

感謝。我真的很喜歡你可以添加一個新的標誌來識別ajax提交的想法,你可以通過這個ajax實現來說明如何做到這一點http://jsfiddle.net/clickthelink/Uwcuz/1/ – user3573508

+0

試試這個,注意防止瀏覽器窗體的方法提交和手動添加src = ajax查詢參數http://jsfiddle.net/Uwcuz/1300/ – mspaly

+0

非常感謝!我非常感謝。因此'src'應該可以通過$ _POST訪問,對嗎?關於你的好處用xhr標題的方法唱這首歌?至於防止瀏覽器默認表單提交,e.preventDefault();這樣做..看到這篇文章http://css-tricks.com/return-false-and-prevent-default爲preventDefault()和返回false之間的差異。 – user3573508

1

您想檢測這是否是xhr請求,如果不是,則默認爲非ajax行爲。

我想看看$_SERVER['HTTP_X_REQUESTED_WITH']

+0

謝謝@quoo。這看起來很有希望..然而,在這篇文章中有一個免責聲明,「$ _SERVER ['HTTP_X_REQUESTED_WITH']是一張黃金票,但並不是所有的服務器都提供這個變量,所以有其他檢查是很重要的。」謹慎評論?還有一些擔心在評論中提出的安全性。這可以欺騙嗎?也是這個跨瀏覽器兼容 - atleast ie8 + – user3573508

+0

我不太確定他指的是什麼其他檢查,但本文詳細闡述了發送正確的標題:http://heera.it/detect-ajax-request-php-框架#.U6L0HI1dW5I – quoo

+0

再次感謝您的鏈接 - 這很好地闡明瞭事情。在.ajax()調用之前提交(函數(e){}代碼塊)(我指的是我的小提琴原帖)再次 – user3573508