2014-06-19 2 views
0

Я новичок в AJAX и в процессе преобразования некоторых обычных форм HTML в AJAX.Нет Javascript Fallback для отправки формы AJAX

Моя существующая реализация выглядит следующим образом: form (на странице1.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 на это СО ссылка How to show loading gif when request goes Ajax http://jsfiddle.net/clickthelink/Uwcuz/1/

Ошибка с страницы проверки и успешности отображается на странице1.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? Я знаю, что форма будет отправлена ​​соответствующим образом, но я не получу перенаправление в случае ошибки или успеха. В этом случае я хотел бы сохранить тип перенаправления заголовка(). Это возможно? Я был бы признателен за помощь.

+0

Вы можете легко узнать, является ли запрос вызовом AJAX или нет, поэтому он устанавливает HTTP-заголовок. Поэтому должно быть возможно, чтобы ваш PHP-сервер реагировал по-разному в случае отправки формы без js. – gpgekko

+0

Не знаете, почему этот вопрос ниспровергнут? Был бы признателен, если бы человек, оказавшийся в стороне, оставил комментарий, чтобы я знал, что я делаю неправильно.Кстати, я нашел несколько вопросов о SO об 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, чтобы отключить браузер перенаправляет заголовки. Например, добавьте 'src = ajax' при отправке формы через 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, правильно? Можете ли вы прокомментировать о преимуществах u петь это по сравнению с хрш-заголовком? Что касается предотвращения отправки формы по умолчанию в браузере, e.preventDefault(); делал это. См. это сообщение http://css-tricks.com/return-false-and-prevent-default для различий между preventDefault() и return 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- frameworks. .U6L0HI1dW5I – quoo

+0

Еще раз спасибо за ссылку - это хорошо объясняет ситуацию. Я добавляю вызов xhr.setRequestHeader() внутри $ ("form [ajax = true]"). Submit (function (e) {} codeblock перед вызовом .ajax()? (Я имею в виду скрипту в моем оригинальное сообщение) – user3573508

Смежные вопросы