jquery ajax post отлично работает в IE, FF, Chrome, но не в Safari

#php #jquery #safari

#php #jquery #safari

Вопрос:

Я отправляю форму на удаленный сервер с помощью метода action, но вызываю функцию jquery для обновления базы данных до публикации — все работает нормально в IE, FF и т. Д. … Но Safari всегда не выполняет вставку базы данных jquery, когда return имеет значение true ИЛИ async: true, … еслиоба являются ложными (поэтому html-форме не удается опубликовать сообщение из-за ложного объявления), это работает отлично? Но при значении true форма будет просто отправлена, но сообщение jquery ajax не будет запущено?

Форма…

  <form action="http://anotherplace" method="post" id="myform" >

<button class="button-big" type="submit" id="myform-post" ><span>Continue</span></button>
  

Функция …

    $(document).ready(function() { //available when doc renders


   $("form#myform").submit(function(){

    var title = $("select#title").val();
    if (title == "") {
    $("select#title").css({backgroundColor:"#ccc"});        
    $("select#title").focus();
     return false;
   }

     var firstname = $("input#fname").val();
    if (firstname == "") {
     $("input#fname").css({backgroundColor:"#ccc"});
     $("input#fname").focus();
     return false;    }

      var surname = $("input#sname").val();
    if (surname == "") {
     $("input#sname").css({backgroundColor:"#ccc"});
     $("input#sname").focus();
     return false;    }



//Grab the form values to pass via AJAX for DB insert

var cameraMake = $("input#cameraMake").val();
var cameraModel = $("input#cameraModel").val();
var cameraValue = $("input#cameraValue").val();
var mp3Make = $("input#mp3Make").val();
var mp3Model = $("input#mp3Model").val();
var mp3Value = $("input#mp3Value").val();


        var dataString='amp;title='  title    'amp;firstname='   firstname   'amp;surname='   surname   'amp;add1='   add1   'amp;add2='   add2   'amp;add3='   add3   'amp;pcode='   pcode   'amp;email='   email   'amp;phone='   phone  'amp;username='   username   'amp;pword='   pword; 

var ajaxComplete = false;
if( !ajaxComplete ){
        $.ajax({
            async: true,              
            type: "POST",
            url: "process-.php",
            data: dataString,
            success: function() {
               // $('#details').html("<div id='post-message'></div>");
               // $('#post-message').html("<h2 style='color:#fff'>Thanks for getting in touch.</h2>")

                ajaxComplete = true;
                this.submit();

            }
        });
        return false; // Abort form submission by now
    }else{
        return true; // Submit normally
    }
});


}); //End of document.ready
  

Скрипт запускается методом «click» на основе идентификатора отправки (выполняет проверку, а затем публикацию AJAX).

Может ли кто-нибудь дать какие-либо советы по поводу сбоя в Safari (все протестированные версии) или предложить лучшее решение для выполнения того, что мне нужно? — что-то связано с асинхронностью / публикацией? Как я уже сказал, установите значение false, и оно работает нормально… НО мне нужна HTML-форма для публикации!

Большое спасибо!

Комментарии:

1. Примечание: это HTML 5? Идентификаторы не могут начинаться с чисел в HTML 4.

2. Проблема решена… кажется, что только $(«#myform-post»).trigger(«submit») в функции успеха будет работать в Safari

Ответ №1:

Если я правильно понимаю, вы хотите выгрузить страницу, пока есть ожидающий запрос AJAX. У этого мало шансов работать правильно, даже в браузерах, где он, похоже, работает.

Мой совет — сначала прервать POST-запрос формы ( return false; ) и добавить код в success обработчик, чтобы инициировать отправку формы при завершении AJAX-запроса. Вы можете использовать переменную флага, чтобы запрос AJAX запускался только в первый раз.

Обновить:

Немного быстрого, грязного и непроверенного кода. Я также понял, что вы пропустили начало блока кода, поэтому я просто изобрел его:

 var ajaxComplete = false;
$("form#3-form").submit(function(){
    if( !ajaxComplete ){
        $.ajax({
            async: true,              
            type: "POST",
            url: "process-.php",
            data: dataString,
            success: function() {
                $('#details').html("<div id='post-message'></div>");
                $('#post-message').html("<h2 style='color:#fff'>Thanks for getting in touch.</h2>")

                ajaxComplete = true;
                this.submit();

            }
        });
        return false; // Abort form submission by now
    }else{
        return true; // Submit normally
    }
});
  

Комментарии:

1. Привет, спасибо — я все еще немного запутался в том, как это реализовать? Не могли бы вы привести пример? Я действительно борюсь с этим! Спасибо

2. Привет, спасибо — я обновил начальный пост уменьшенной версией моего скрипта — я добавил ваш код, но он по-прежнему не работает в Safari? Он может либо просто опубликовать сообщение ajax, либо опубликовать HTML-форму, а не оба, как FF, IE. Надеюсь, мое обновление приведенного выше кода поможет решить проблему? Спасибо

3. @Marc: Очевидно, this.submit() ожидает форму, а не кнопку. Идея в том, что вы понимаете код, который мы публикуем, и адаптируете его к своему скрипту, а не копируете и вставляете вслепую и возвращаетесь к попрошайничеству.

4. Привет, извините — вышеприведенное было ошибкой.. Я внесу поправки. Я завернул его в onsubmit, поэтому функция вызывается в форме отправки HTML

Ответ №2:

вы должны использовать

 return false;
  

а затем перейдите к действию формы

 window.location.url = "YOUR URL";
  

Итак

 $.ajax({
    async: true,              
    type: "POST",
    url: "process-.php",
    data: dataString,
    success: function() {
        $('#details').html("<div id='post-message'></div>");
        $('#post-message').html("<h2 style='color:#fff'>Thanks for getting in touch.</h2>");
        window.location.url = "YOUR URL";
    }
});
return false;
  

Комментарии:

1. Привет, я попробовал выше (удалил сообщение action=»» из html-формы, чтобы действие было пустым)… сообщение ajax работает, но форма не отправляет HTML-код в окно. местоположение (удаленный сервер) — оно остается на странице формы в цикле?

2. @Marc не меняйте действие формы. просто замените мой код на ваш. и укажите URL-адрес действия вашей формы в окне. location.url