簡體   English   中英

PHP函數在preventDefault()之后提交響應有所不同

[英]PHP function respondes differently to submit after preventDefault()

我正在使用一個PHP文件(作為wordpress插件的一部分),其中包含一些功能。
其中一個建立一個html表單,另一個建立提交的表單。
我已將添加到構建表單的函數submit()函數中,在該函數中我調用了異步函數。
為了它完成之前提交表單我使用preventDefault() ,並調用submit()當異步函數完成。
問題在於,我對preventDefault() submit()之后的preventDefault()在處理提交表單的PHP函數中導致的結果與原始提交時不同。

這是PHP代碼:

if(isset($_POST['submit-reg']))
{
    $output = sreg_process_form($atts); 
    return $output;
}
else
{
    $data = array();
    $form = simplr_build_form($data, $atts);        
    return $form;               
}

當我不使用preventDefault()submit() ,條件為肯定,並且表單正常提交。
當我使用它們時,將執行第二部分,並且正在重建表單而不是提交表單。
因此,問題是: preventDefault()之后再submit()原因是isset($_POST['submit-reg']))為false,我該如何解決?
編輯:這是JS:

$('#simplr-reg').submit(function(event)
{           
    event.preventDefault();
    codeAddress(function(success){}); //callback from googlemaps
});

function codeAddress(callback)
{               
    var geocoder = new google.maps.Geocoder();

    geoCodingStarted = true;

    geocoder.geocode( { 'address': address}, function(results, status)
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {   
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
            $("input[name=latitude]").val(latitude); 
            $("input[name=longitude]").val(longitude);      

            $('#simplr-reg').submit();          
        }                   
    });         
}  // end of code address

當您通過常規方法提交表單時,則會設置submit-reg 當您使用preventDefaul()並異步發送表單時,則永遠不會設置該值,因為永遠不會提交表單,盡管它是異步處理的。 您應該使用另一種方法檢查表單是否正在處理或構建。 也許是一個隱藏的領域。 或在頁面上設置了其他標記。

從W3C

17.13.3處理表格數據

當用戶提交表單時(例如,通過激活提交按鈕 ),用戶代理將按以下方式進行處理。

第一步:確定成功的控制措施

第二步:建立表單數據集

表單數據集是由成功的控件構造的一系列控件名稱/當前值對

第三步:對表單數據集進行編碼

然后根據FORM元素的enctype屬性指定的內容類型對表單數據集進行編碼。

第四步:提交編碼形式 * 數據集 *

最后,使用方法屬性指定的協議將編碼數據發送到操作屬性指定的處理代理。

本規范未指定可與表單一起使用的所有有效提交方法或內容類型。 但是,在以下情況下,HTML 4用戶代理必須支持已建立的約定:

  • 如果方法是"get" ,並且操作是HTTP URI,則用戶代理將使用action的值,並附加一個“?” 然后,向其附加使用“ application / x-www-form-urlencoded”內容類型編碼的表單數據集。 然后,用戶代理遍歷此URI的鏈接。 在這種情況下,表單數據僅限於ASCII碼。
  • 如果方法是"post" ,而操作是HTTP URI,則用戶代理將使用action屬性的值和根據enctype屬性指定的內容類型創建的消息來執行HTTP“ post”事務。 對於動作或方法的任何其他值,未指定行為。

用戶代理應從HTTP“獲取”和“發布”事務中呈現響應。

當您使用preventDefault()可以防止這種情況發生,因為變量“ submit-reg”不存在,因為它從未設置。

jQuery網站的更多信息

現在,提交表單后,將提示該消息。 這發生在實際提交之前,因此我們可以通過在事件對象上調用.preventDefault()或從處理程序中返回false來取消提交操作。

如果PHP的行為不同,則其輸入也不同。 在兩種情況下都執行print_r($_POST) ,看看有什么不同。 PHP不在乎您在頁面上運行了一些Javascript。 它只會看到一些表單值。

如果輸入不同的值,則其行為將有所不同。 因此,請檢查這些輸入並找出為什么Javascript更改了表單數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM