10

几周前我在 jquery 论坛上问过这个问题,但没有运气,所以我会在这里再试一次:)

我为我正在处理的项目制作了一个简单的小部件,但遇到了一个奇怪的问题。

用一个示例实现来解释它是最容易的。 http://decko.dk/buttontest

页面上有 3 个按钮。第一个是我的下拉小部件。下一个是常规禁用按钮 (A),最后一个是常规启用按钮 (B)。如果您然后刷新页面(按 F5 或其他),则启用的按钮现在神秘地被禁用。我不知道为什么会发生这种情况,但是如果按钮 A 没有被禁用,那么按钮 B 在刷新时不会被禁用。此外,如果我在我的小部件代码中删除对 insertAfter 的调用,则不会禁用该按钮。谁能解释为什么会发生这种奇怪的行为?

顺便说一句,我只能在 Firefox 中重现它。

4

5 回答 5

12

我相信这是 Firefox 如何记住表单字段/控件值和状态的错误:

  1. 第一个页面加载后,文档中有三个<button>元素,并且<button id="button_a">被禁用。(当启用或禁用 jQuery UI 样式按钮时,它会将底层元素设置为相同的状态。)
  2. Firefox 记得第二个<button>被禁用。
  3. 页面刷新后,在运行任何脚本之前,Firefox 会恢复表单字段和控件。它禁用了第二个<button>,但由于没有运行任何脚本,所以第二个按钮是<button id="button_b">
  4. 当 jQuery UI 创建样式按钮时<button id="button_b">,它会看到它被禁用并继续将其样式设置为禁用。

这里有两个问题:

  1. Firefox 如何记住哪些元素被禁用。它没有考虑动态元素。我建议为此向 Mozilla 提交一个错误。
  2. 页面刷新后表单元素保持禁用状态。我不确定这是否是正确的行为,但有两个关于此的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>
于 2010-04-27T09:52:38.870 回答
5

我也遇到了这个问题,并发现它归结为 Firefox 中的愚蠢行为,我的修复是这样的:

前:

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

后:

//set up the buttons (and make sure firefox behaves)
$("button").button().attr("autocomplete", "off");
于 2010-10-15T22:45:55.860 回答
0

这是我发现的解决方案在所有浏览器中都非常有效......

我给每个按钮(可以禁用)一个类'js_submit'

然后,我在卸载页面时触发的 pagehide 事件上重新启用任何具有类“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);
}
于 2012-02-18T18:53:55.083 回答
0

ExpiresHTTP 标头设置为过去的日期,为我在 Firefox 6.0 中解决了这个问题。

于 2011-08-25T21:55:32.213 回答
-2

就我而言,这是一个引导错误

<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">
于 2015-06-01T17:07:02.630 回答