Функция PHP по-разному реагирует на отправку после protectDefault () - PullRequest
2 голосов
/ 19 мая 2011

Я использую файл PHP (как часть плагина wordpress), который содержит несколько функций.
Один из них создает HTML-форму, а другой имеет дело с отправленной формой.
Я добавил к функции, которая создает форму, функцию submit(), в которой я вызываю асинхронную функцию.
Чтобы завершить ее до отправки формы, я использую preventDefault() и вызов submit(), когда завершается асинхронная функция.
Проблема в том, что мой вызов 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'])) ложно, и как я могу это исправить? редактировать: вот 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

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Когда вы отправляете форму обычными методами, устанавливается submit-reg.Когда вы используете protectDefaul () и отправляете форму асинхронно, тогда значение никогда не устанавливается, потому что форма никогда не отправляется, хотя обрабатывается асинхронно.Вы должны использовать другой метод, чтобы проверить, обрабатывается или создается форма.Возможно, скрытое поле.или другой флаг, установленный динамически на странице.

Из W3C

17.13.3 Обработка данных формы

Когда пользователь отправляет(например, путем активации кнопки отправки ), пользовательский агент обрабатывает ее следующим образом.

Шаг первый: определение успешных элементов управления

Шаг второй: создание набора данных формы

Набор данных формы - это последовательность пар имя элемента управления / текущее значение, созданная из успешных элементов управления

Шаг третий: Кодирование набора данных формы

Затем набор данных формы кодируется в соответствии с типом содержимого, указанным атрибутом enctype элемента FORM.

Шаг четвертый: Отправьте закодированную форму * набор данных *

Наконец, закодированные данные отправляются обработчику, назначенному атрибутом действия, с использованием протокола, указанного ватрибут метода.

Эта спецификация не определяет все valid методы представления или типы контента, которые могут использоваться с формами.Однако пользовательские агенты HTML 4 должны поддерживать установленные соглашения в следующих случаях:

  • Если метод "get", а действие - HTTP URI, пользовательский агент принимает значение действия, добавляета?к нему затем добавляется набор данных формы, закодированный с использованием типа контента application / x-www-form-urlencoded.Затем пользовательский агент пересекает ссылку на этот URI.В этом случае данные формы ограничены кодами ASCII.
  • Если используется метод "post", а действие является HTTP URI, пользовательский агент выполняет HTTP-транзакцию «post», используя значение атрибута action, и сообщение, созданное в соответствии с типом содержимого, заданным параметроматрибут enctype.Для любого другого значения действия или метода поведение не определено.

Пользовательские агенты должны обработать ответ от HTTP-транзакций "get" и "post".

Когдавы используете preventDefault(), вы предотвращаете это, делая переменную «submit-reg» не существующей, потому что она никогда не устанавливается.

Больше информации с сайта jQuery

Теперь, когда форма отправлена, сообщение оповещается.Это происходит до фактической отправки, поэтому мы можем отменить действие отправки, вызвав .preventDefault () для объекта события или вернув false из нашего обработчика.

2 голосов
/ 19 мая 2011

Если PHP ведет себя по-другому, то его входные данные различны.сделайте print_r($_POST) в обеих ситуациях и посмотрите, что отличается.PHP не заботится о том, что вы запустили Javascript на странице.Все, что он увидит, - это какие-то значения формы.

Если будут введены разные значения, то он будет вести себя по-другому.Так что проверьте эти входные данные и выясните, почему ваш Javascript изменяет данные формы.

...