0

所以我有一个由mousedown, mouseup and mousemove事件组成的自定义拖动方法,就像这样。我的方法是——move()

$(document).on('mousedown', function() {drag = true });
$(document).on('mouseup', function() {drag = false });
$(document).on('mousemove', function() { if (drag) move() });

这一切都很完美,但想象一下这个move()声明:

function move() {
  confirm('Do you blablabla...?');
}

现在顺序是这样的:

  1. 我点击文件
  2. 我移动鼠标
  3. 我得到一个确认模态框
  4. 我单击确定/取消
  5. 我移动鼠标
  6. 我得到一个确认模态框

尽管我释放了鼠标按钮,但我得到了确认模式框。事实证明,在显示模式框时没有报告任何事件。

我的问题 -如何解决这个问题?

我虽然只有一种可能的解决方案 - 使用自定义模式框(如 jQuery UI Modal)覆盖 window.alert/window.confirm 但在这种情况下,我想保留默认值并且应用程序足够成熟,因此用户习惯于默认外观模态的。

我是如何解决的?

我这样做了:

  var _alert = window.alert;
  var _confirm = window.confirm;

  window.alert = function() {
    drag = false;
    return _alert.apply(this, arguments);
  }

  window.confirm = function() {
    drag = false;
    return _confirm.apply(this, arguments);
  }

它对我来说非常有用,而且不会引入新的错误。不过,我将不胜感激任何对此解决方案的了解。

4

2 回答 2

1

模式将导致事件停止,因为您不再单击页面/正文。

最好的解决方案是您自己的带有样式的滚动对话框。

试试http://jqueryui.com/dialog/

于 2013-10-15T13:38:10.710 回答
0

我用非常简单的代码解决了我的问题。尽管害怕修改原始方法,但我试图保留原始方法。

一旦显示模式或警报,代码只需将拖动标志设置为 false。

  var _alert = window.alert;
  var _confirm = window.confirm;

  window.alert = function() {
    drag = false;
    return _alert.apply(this, arguments);
  }

  window.confirm = function() {
    drag = false;
    return _confirm.apply(this, arguments);
  }
于 2013-10-15T15:23:41.857 回答