2013-12-22 2 views
-1

У меня есть одна страница с несколькими формами, отправляющая каждый из них с вызовом AJAX на тот же PHP-контроллер. В Chrome, когда я отправляю форму, я получаю сообщение beforeSend, а затем успешный вызов. В Safari, IE и Firefox он вместо этого обновляет страницу, что, похоже, идет прямо за призывом ajax, который не должен обновлять его.AJAX работает в Chrome, но не в Safari, Firefox или Internet Explorer

Формы этого типа:

<form method="post" class = "multi-form teacher_account_form" id="personal_form" name="personal_form"> 
    <div class = "form-group"> 
     <label for="phone">What is your phone number?*</label> 
     <input type="text" class="form-control bfh-phone" data-format="+86 ddd dddd dddd" name="phone" id="phone" value="<?=$this_user[0]['phone']?>"> 
    </div> 
    <div class="form-group"> 
     <button type="submit" class="btn btn-default btn-med account_submit" id="personal_submit" name="personal_submit">Update Personal</button> 
    </div>     
</form> 

JS, как это:

var which_button; 
$('.account_submit').click(function() { 
    which_button = $(this).attr('id'); 

    // Create empty jQuery objects - 
    var $jsOutput = $([]); 
    var $jsForm = $([]); 

    // url to submit to 
    var ajaxURL = "https://stackoverflow.com/users/p_teacher_account_work"; 

    // Assign jQuery selector objects 
    switch (which_button) { 
     case "work_submit": 
      $jsOutput = $('#pay_output'); 
      $jsForm = $('#pay_form'); 
      break; 
     case "edu_submit": 
      $jsOutput = $('#edu_output'); 
      $jsForm = $('#edu_form'); 
      break; 
     case "image_submit": 
      $jsOutput = $('#image_output'); 
      $jsForm = $('#image_form'); 
      break; 
     case "personal_submit": 
      $jsOutput = $('#personal_output'); 
      $jsForm = $('#personal_form'); 
      break; 
    } 

    // Lock and load the ajax request - 
    var ajax_options = { 
     type: 'post', 
     url: ajaxURL, 
     beforeSend: function() { 
      //Display a loading message while waiting for the ajax call to complete 
      $jsOutput.html("Updating..."); 
     }, 
     success: function(response) { 
      $jsOutput.html(response); 
     } 
    }; 
    $jsForm.ajaxForm(ajax_options); 


}); 

Мой PHP файлов запросов в базу данных и отправить обратно информацию на вид, который вторит к тому же страницу, на которой сидят.

+0

вы пытались Firebug плагин на Firefox, чтобы увидеть, если он показывает какую-либо ошибку или нет? – nur

+0

firebug: TypeError: установка свойства, которое имеет только getter ... bootstrap-formhelpers.min.js Строка 8. Я использую этот плагин только для некоторых из нескольких форм на странице, т, поэтому я думаю, что это не так. – compguy24

+2

О, нет, нет, нет, много чего здесь не так, с чего начать! im удивил, что хром отправляет это ..., у вас есть кнопка отправки, которую вы нажимаете, которая всегда будет отправлять с помощью или без аякса, поэтому вам нужно будет функционировать (e) {e.preventDefault; .... код .... Я всегда возвращаю false; просто выложите e ... не поймайте. два, которые вы даже не отправили ни одной из данных формы! и т. д., найти учебное пособие ... – cmorrissey

ответ

0

Он не работал из-за того, что выпадающее меню сборщика плагинов форвардера formhelpers http://bootstrapformhelpers.com/country/#jquery-plugins не правильно загружалось в проблемных браузерах. Для чего это стоит, вот код, который завелся работает (не включая удаление этого гнусного плагина):

var which_button; 
//$('.account_submit').click(function() { 
$('form.teacher_account_form').on('submit', function(e) { 
    e.preventDefault(); 
    which_button = $(this).attr('id'); 

    // Create empty jQuery objects - 
    var $jsOutput = $([]); 
    var $jsForm = $([]); 

    // url to submit to 
    var ajaxURL = "https://stackoverflow.com/users/p_teacher_account_work"; 

    // Assign jQuery selector objects 
    switch (which_button) { 
     case "pay_form": 
      $jsOutput = $('#pay_output'); 
      $jsForm = $('#pay_form'); 
      break; 
     case "edu_form": 
      $jsOutput = $('#edu_output'); 
      $jsForm = $('#edu_form'); 
      break; 
     case "image_form": 
      $jsOutput = $('#image_output'); 
      $jsForm = $('#image_form'); 
      break; 
     case "personal_form": 
      $jsOutput = $('#personal_output'); 
      $jsForm = $('#personal_form'); 
      break; 
    } 

    // empty data object 
    var form_data = {}; 

    // variables for data 
    $(this).find('[name]').each(function(index, value) { 
     var that = $(this), 
      name = that.attr('name'), 
      value = that.val(); 

     // load loaded variables into array 
     form_data[name] = value; 

    }); 

    $.ajax({ 
     type: 'post', 
     url: ajaxURL, 
     data: form_data, 
     beforeSend: function() { 
      //Display a loading message while waiting for the ajax call to complete 
      $jsOutput.html("Updating..."); 
     }, 
     success: function(response) { 
      $jsOutput.html(response); 
     } 

    }); 

    return false; 


}); 
0

Попробуйте использовать type = "button" вместо type = "submit".

Как и в:

<button type="button" class="btn btn-default btn-med account_submit" id="personal_submit" name="personal_submit">Update Personal</button> 

Это Hacky, но она работает в любом браузере, я пробовал. Тип = "submit" означает что-то особенное для большинства браузеров.

Редактировать: Подождите ... вы используете Malsup для «плагина формы jQuery»?

+0

Да, я. Изменение его на «кнопку» останавливает обновление страницы, но не отправляет этот запрос AJAX, а также не отправляет его в Chrome. – compguy24

+0

Да, этот трюк типа «type = button» не будет работать с ajaxForm от Malsup. Я могу просмотреть документацию для этого плагина, если вы намерены его использовать. В противном случае я могу отправить обычное решение jQuery для ванили. –

+0

Я приветствую все решения с равной благодарностью. – compguy24

0

две вещи:

1.) Включите ваш тип кнопки для button а-ля:

<button type="button" class="btn btn-default btn-med account_submit" id="personal_submit" name="personal_submit">Update Personal</button> 

2.) Измените обработчик событий для вызова $jsForm.ajaxSubmit(ajax_options); вместо $jsForm.ajaxForm(ajax_options);

По их docs, $jsForm.ajaxForm(ajax_options); фактически не отправляет форму. Тот факт, что это работает, как вы ожидали в Chrome, предполагает, что он делает что-то странное за кулисами при отправке форм.

+0

все еще не работает:/ – compguy24

0

Попробуйте это решение для простой, вариант JQuery:

var which_button; 

$('.account_submit').click(function() { 
    which_button = $(this).attr('id'); 

    // Create empty jQuery objects - 
    var $jsOutput = $([]); 
    var $jsForm = $([]); 

    // url to submit to 
    var ajaxURL = "https://stackoverflow.com/users/p_teacher_account_work"; 

    // Assign jQuery selector objects 
    switch (which_button) { 
     case "work_submit": 
      $jsOutput = $('#pay_output'); 
      $jsForm = $('#pay_form'); 
      break; 
     case "edu_submit": 
      $jsOutput = $('#edu_output'); 
      $jsForm = $('#edu_form'); 
      break; 
     case "image_submit": 
      $jsOutput = $('#image_output'); 
      $jsForm = $('#image_form'); 
      break; 
     case "personal_submit": 
      $jsOutput = $('#personal_output'); 
      $jsForm = $('#personal_form'); 
      break; 
    } 

    // Get the form data 
    var formData = $jsForm.serializeArray(); 

    // Lock and load and fire the ajax request - 
    $.ajax({ 
     type: 'POST', 
     url: ajaxURL, 
     data: formData, 
     contentType: "application/x-www-form-urlencoded", 
     dataType: "html", 
     cache: false, // this will save you a bunch of IE headaches 
     beforeSend: function() { 
      //Display a loading message while waiting for the ajax call to complete 
      $jsOutput.html("Updating..."); 
     }, 
     error: function(jqHXR, textStatus, errorThrown) { 
      alert("Sorry, something went wrong.\nDetails: " + textStatus + ". " + errorThrown); 
     }, 
     success: function(response) { 
      $jsOutput.html(response); 
     } 
    }); 
}); 

Теперь вы можете сделать «кнопку» типа кнопки = или даже заменить его элементом с OnClick действия события не по умолчанию, такие как интервал ,

+0

Сообщите мне, если вы получите какие-либо ошибки. Вам может потребоваться настроить contentType и dataType для удовлетворения ваших потребностей. –

+0

он никогда не проходит мимо beforeSend, «обновление ...» – compguy24

+0

Хорошо. Могу ли я получить информацию о сообщении об ошибке консоли? Возможно, нам придется изменить тип данных. Вы можете просмотреть консоль Chrome, щелкнув правой кнопкой мыши в любом месте страницы, затем нажмите «просмотреть элемент». Маленькое окно должно открыться ниже. Перейдите на вкладку «Консоль». Теперь нажмите кнопку ajax. Любые ошибки JavaScript должны отображаться здесь. Пожалуйста, опубликуйте их. Также перейдите на вкладку Сеть. Это покажет статус ваших запросов AJAX. Вы можете проверить статус каждого запроса AJAX, используя эту вкладку. Я обновлю свой пример, чтобы включить некоторые регистрации ошибок. –

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