3

问题

如果您有一个微调器并使用对话框中断旋转过程,例如上一个字段的模糊,或微调器的焦点,当对话框关闭时,微调器继续旋转过程,就好像鼠标被按住旋转一样按钮,就像一个无限循环。

我创建了一个jsfiddle来说明这一点,它由 2 个微调器和一个更改事件中的确认对话框组成。

为了看到无限旋转:

  1. 如示例页面所述触发确认对话框。
  2. 清除对话框(可以使用“确定”或“取消”按钮)。
  3. 将鼠标悬停在微调器控件的按钮上。
  4. 看旋转器去!

\Edit - 有没有触发的 mouseleave 代码,我认为这就是问题所在。打算看看我是否可以手动实现这一点


尝试过的变通方法

  • 我曾尝试在显示确认之前禁用其他微调器,然后重新启用它们,希望它会清除状态,但这不起作用。
  • 在我的情况下,我在订购单上使用微调器。我使用确认进行最大数量检查:如果用户确认,则允许该值,否则将其设置回之前的值。我尝试将确认放入旋转事件,但是当用户使用键盘更新输入字段时,这不会触发。
  • 我还在停止事件中尝试过,每次按下鼠标/按键后都会触发。但是,这效果不佳,因为我的微调器的最大数量是 999,并且确认显示在不同的值上,这些值都很低,例如 12。因此,如果用户想输入 130,他们会在输入时得到确认对话框3,这不是预期的行为。请注意,这可能最终成为我的解决方法,因为这种情况最不可能发生。
  • 我还尝试设置一个标志来检查旋转事件,以便可以取消第二个旋转器的旋转。这确实有效并防止它旋转,但是一旦取消设置标志,问题就会发生。将焦点和模糊应用于第二个微调器(或任何其他微调器)无济于事,对实际微调器按钮应用模糊也无济于事。

我想我已经在 jQuery UI 1.9 微调器中发现了一个错误,它影响了所有浏览器,并且出现在里程碑 8 中。我希望有更多知识的人可以给我一个解决方法(拜托!),直到修复发出...

因为我相信这是 jQuery UI 库中的一个错误,所以我在jQuery 论坛上提出了这个问题,所以如果我在那里听到任何消息,我会及时更新这个问题。

4

1 回答 1

1

解释

这是一个 ui.spinner 错误(很可能),可能值得通知 jQuery UI 开发人员。

注意:如果您不想向 jQuery UI 团队提交请求,请告诉我,我会提交。如果我有时间,我什至可能会提供一个补丁。

问题是微调器正在启动mousedown(在这种情况下,它也从mousewheeeland启动keydown),不幸的是它直到在 confirm() 之后才被触发。

confirm()FireFox 中,它还有一个很酷的副作用,即confirm()在打开时停止所有文档事件。微调器在微调器/微调器按钮上mouseupmouseout(和)上停止,但这些事件永远不会触发。keyup因此,微调器会持续运行,直到您移回微调器并触发停止事件之一。

解决方法

在 jQuery UI 团队解决这个问题之前,我有两个解决方法。这取决于你需要做什么处理。一种是设置confirm()超时,另一种是在超时时触发mouseup所有微调器按钮上的事件。

哪一个有用(如果有的话)取决于您尝试对confirm().

两者都不漂亮,但这些是我能想到的最好的解决方法。

解决方法 1 - 假事件超时

var spinner = $( ".mySpinner" ).spinner({
    max: 100,
    min: -100,
    change: function( event, ui ) {
        confirm("Pressing cancel breaks the other spinner");
        setTimeout(function(){
            $('.ui-spinner-button').trigger('mouseup');
        },1);
    }
});

解决方法 2 - Confirm() 超时

var spinner = $( ".mySpinner" ).spinner({
    max: 100,
    min: -100,
    change: function( event, ui ) {
        setTimeout(function(){confirm("Pressing cancel breaks the other spinner");},1);
    }
});

其他黑客

可以获取微调器的内部私有实例以访问该spinnining属性,将其标记为 true,然后调用_stop()成员函数。然而,这是一个非常侵入性的修复。另一种方法是只清除停止使用的超时,但又是侵入性的,而且这些都不是未来的证明。因此,我不会提供这些黑客的例子。

于 2012-07-03T18:08:39.860 回答