Кнопка JQuery UI отключена при обновлении

Я спросил об этом на форуме jquery несколько недель назад без везения, поэтому я попробую еще раз:)

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

Проще всего объяснить это с помощью примера реализации. http://decko.dk/buttontest

На странице есть 3 кнопки. Первый - мой понижающий виджет. Следующий - обычная отключенная кнопка (A), а последняя - обычная кнопка включения (B). Если вы затем обновите страницу (нажмите F5 или что-то еще), активированная кнопка теперь таинственно отключена. Я не знаю, почему это происходит, но если кнопка A не отключена для начала, кнопка B не будет отключена при обновлении. Кроме того, если я удалю вызов для insertAfter в моем виджет-коде, кнопка не будет отключена. Может ли кто-нибудь пролить свет на то, почему это странное поведение происходит?

Кстати, я только смог воспроизвести это в Firefox.

Ответ 1

Я считаю, что это ошибка в том, как Firefox запоминает значения полей и управляющих значений формы:

  • После загрузки первой страницы в документе есть три элемента <button>, а <button id="button_a"> отключен. (Когда кнопка стиля jQuery UI включена или отключена, она устанавливает базовый элемент в одно и то же состояние.)
  • Firefox помнит, что второй <button> отключен.
  • После обновления страницы, прежде чем запускать какие-либо скрипты, Firefox восстанавливает поля формы и элементы управления. Он отключает второй <button>, но поскольку не выполняется script, вторая кнопка <button id="button_b">.
  • Когда jQuery UI создает стилизованную кнопку для <button id="button_b">, она видит, что она отключена и продолжает стирать ее как отключенную.

Здесь есть две проблемы:

  • Как Firefox запоминает, какие элементы отключены. Он не учитывает динамические элементы. Я предлагаю подачу ошибки с Mozilla для этого.
  • Элементы формы остаются отключенными после обновления страницы. Я не уверен, что это правильное поведение, но есть два bugzilla сообщает об этом.

Тест может упростить до простого добавления элемента <button> и отключить <button id="button_a">, не требуется jQuery/jQuery UI:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>disabled button test</title>
    <script type="text/javascript">
    window.onload = function () {
        var a = document.getElementById('button_a'),
            menu = document.createElement('button');
        menu.appendChild(document.createTextNode('Menu'));
        document.body.insertBefore(menu, a);
        a.disabled = true;
    };
    </script>
</head>
<body>
    <button id="button_a">A</button>
    <button id="button_b">B</button>
</body>
</html>

Ответ 2

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

перед:

//set up the buttons
$("button").button();

после

//set up the buttons (and make sure firefox behaves)
$("button").button().attr("autocomplete", "off");

Ответ 3

Установив заголовок Expires HTTP в дату в прошлом, решил проблему для меня в Firefox 6.0.

Ответ 4

Вот решение, которое я нашел, работает очень хорошо во всех браузерах...

Я даю каждой кнопке (которая может быть отключена) класс 'js_submit'

Затем я снова включаю любые отключенные кнопки с классом "js_submit" в событии, которое запускается при выгрузке страницы.

Я переношу назначение события внутри try catch, чтобы предотвратить браузеры, которые не поддерживают это событие, отбрасывания ошибки (например, IE).

Вот код:

<input id="button" type="button" value="Submit" class="js_submit" />


// Fix for firefox bfcache:
try {
    window.addEventListener('pagehide', PageHideHandler, false);
} catch (e) { }

//Fires when a page is unloaded:
function PageHideHandler() {
    //re-enable disabled submit buttons:
    $('.js_submit').attr('disabled', false);
}

Ответ 5

В моем случае это была ошибка Bootstrap

<input id="appointmentBtn" type="button" 
ng-click="addAppointment()" class="btn btn-primary btn-xs 
disabled" value="Add Appointment"> 

Вместо этого он должен был

<input id="appointmentBtn" type="button" 
ng-click="addAppointment()" class="btn-primary btn-xs 
disabled" value="Add Appointment">