Не удается отменить действие по умолчанию при отправке формы ajax

#php #jquery #ajax #forms #internet-explorer

#php #jquery #ajax #формы #internet-explorer

Вопрос:

У меня есть форма и фрагмент javascript кода для создания AJAX форм. Странно то, что когда я отправляю свою форму в Internet Explorer, отображается только [object Object] . Форма отлично работает в Google Chrome. Вот мой код:

Заголовок формы:

 <form id="page-details-form" class="ajax-form" name="page-details-form" method="POST" action="/pages/save/1">
  

Прослушиватель Javascript:

 <script>
    $(function(){

        $(document).on("submit",".ajax-form",function(e){
            if (window.event) {
                window.event.returnValue = false;
            }           
            e.preventDefault ? e.preventDefault() : e.returnValue = false;

            $('.form-message').remove();

            if($('#onSubmitJsEval').html() amp;amp; $('#onSubmitJsEval').html().length > 0)
            {
                eval($('#onSubmitJsEval').html());
            }

            var submitBtnValue  = $('#submitBtn').html();
            var formId          = $(this).attr('id');
            var postData        = $(this).serializeArray();

            $('#submitBtn')     .html('<img src="images/ajax-loader.gif" />');
            $('p.has-error')    .remove();
            $('div.has-error')  .removeClass('has-error');

            $.post($(this).attr('action'), postData, function(jsonResponse)
            {
                var jsonObject = jQuery.parseJSON(jsonResponse);

                if(jsonObject.success == true)
                {
                    $('<div class="<?=MESSAGE_SUCCESS_CLASS?>"><?=MESSAGE_SUCCESS_PREFIX?>' jsonObject.message '</div>' ).insertBefore( "#"   formId   " h2" );
                    if(jsonObject.insertedId > 0)
                    {
                        var stringPath = window.location.pathname.substr(window.location.pathname.length - 1);

                        document.location.href = window.location.pathname   ((stringPath != "/") ? "/" : "")   jsonObject.insertedId;
                    }
                }
                else
                {
                    $('<div class="<?=MESSAGE_ERROR_CLASS?>"><?=MESSAGE_ERROR_PREFIX?>' jsonObject.message '</div>' ).insertBefore( "#"   formId   " h2" );
                    $.each(jsonObject.errors, function(index, value){

                        $('[name=' index ']').parent().addClass('has-error');
                        $('[name=' index ']').after('<p class="has-error help-block">' value '</p>');
                    })

                }

                $('#submitBtn').html(submitBtnValue);
            });

        });


    }); 

</script>
  

Я попробовал несколько вариантов, помимо текущего варианта:

  • if (e.preventDefault) e.preventDefault();
  • e.returnValue = false
  • e.returnValue = false после e.preventDefault

У кого-нибудь есть идея? Если мне нужно опубликовать больше кода, пожалуйста, дайте мне знать. Я могу опубликовать весь код, если вы хотите.

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

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

1. e.returnValue = false;; двойные точки с запятой?? и почему бы вам просто не попробовать с e.preventDefault(); ? зачем вам для этого нужно условие if?

2. Извините, я просто неправильно вставил код. Я обновляю его, используя полный код javascript.

3. Вы пробовали простое return false; ?

4. Похоже, e.preventDefault ? e.preventDefault() : e.returnValue = false; это работает для предотвращения по умолчанию, потому что оно не перенаправляет на SITE / save / details / 1, но вместо этого отображает [object Object]

Ответ №1:

Вам понадобится комбинация e.preventDefault() и return false с промежуточным кодом обработки.

 $(document).on("submit", ".ajax-form", function(e) {
    e.preventDefault();
    //Do your stuff here
    return false;
});
  

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

1. Это все еще не работает. Я добавил return false добавить конец и e.preventDefault(); в качестве первого правила. Но результат теперь другой. Internet Explorer теперь печатает ответ JSON вместо [object Object] . Таким образом, это предполагает, что он просто отправляет форму, потому что она переходит на САЙТ / страницы / сохранить / 1.

2. Похоже, e.preventDefault ? e.preventDefault() : e.returnValue = false; это работает для предотвращения по умолчанию, потому что оно не перенаправляет на SITE / save / details / 1, но вместо этого оно отображает [object Object] . Итак, когда я отправляю форму, отображается Internet Explorer [object Object] , но мне просто нужно выполнить вызов AJAX и действие после вызова AJAX. Конкретный вопрос заключается в том, почему Internet Explorer показывает это сообщение вместо того, чтобы ничего не делать с текущим окном?

3. Почему бы не использовать стандартную функцию jQuery getJSON ( api.jquery.com/jquery.getjson ) для загрузки данных в формате JSON? Или взгляните на api.jquery.com/jquery.ajax Я хочу сказать, что jQuery обеспечивает хорошую совместимость между большинством браузеров.

4. Пример приведенного выше стандартного вызова ajax для загрузки данных JSON: $.ajax({ type: ‘GET’, url: ‘get.php ‘, данные: { // переменные}, тип содержимого: ‘application / json; кодировка=utf-8’, тип данных: ‘json’, успех: функция (данные) { //обработка}, ошибка: функция() { // обработка ошибок } });