Javascript:取消还是让事件继续?

Javascript:取消还是让事件继续?,javascript,events,kendo-ui,dom-events,Javascript,Events,Kendo Ui,Dom Events,我的场景涉及剑道UI,但我认为它可能普遍适用于JavaScript,因此使用JavaScript标记 我有一个剑道调度程序,编辑事件选项设置为function 在functionA中,我创建了一个剑道窗口(基本上是一个模式),向用户提问;在一种情况下,编辑事件应该继续并冒泡起来,就像模态从未出现过一样,在另一种情况下,它应该防止默认值并返回 问题是该模式是非阻塞的,因此出现确认模式,但事件逻辑继续并冒泡到编辑器的内置编辑事件 我如何捕获并暂停当前事件,并且仅在我的剑道窗口中获得所需结果时才继续它

我的场景涉及剑道UI,但我认为它可能普遍适用于JavaScript,因此使用JavaScript标记

我有一个剑道调度程序,编辑事件选项设置为function

在functionA中,我创建了一个剑道窗口(基本上是一个模式),向用户提问;在一种情况下,编辑事件应该继续并冒泡起来,就像模态从未出现过一样,在另一种情况下,它应该防止默认值并返回

问题是该模式是非阻塞的,因此出现确认模式,但事件逻辑继续并冒泡到编辑器的内置编辑事件

我如何捕获并暂停当前事件,并且仅在我的剑道窗口中获得所需结果时才继续它

我知道由于JavaScript的单线程特性,我不能也不应该让剑道窗口阻塞,但是有没有办法让这个事件暂停,并且只有在我这么说的情况下才能恢复它


基本上,我想做一些类似于
事件.Hold()
的事情,如果满足条件,
事件.Resume()
,否则,执行
事件.preventDefault()

更新

我测试了我之前发布的代码,发现它不太正确。这是经过测试的,完全按照您的要求工作,再加上它是一个内置解决方案:

var event_store;

function handle_click(event) {
    event.stopPropagation();
    event_store = event;

    //Open the modal here
    //If it's possible, pass the event pointer to the modal's confirm callback
    //instead of using event_store and pass that pointer to fire_event() when
    //it's confirmed
}

function confirm_handle() {
    resume_event("click");
}

function resume_event(type) {
    if (event_store.target.parentNode) {
        var event;

        if (document.createEvent) {
            event = document.createEvent("HTMLEvents");
            event.initEvent(type, true, true);
        } else {
            event = document.createEventObject();
            event.eventType = type;
        }

        event.eventName = type;

        if (document.createEvent) { //Not IE
            event_store.target.parentNode.dispatchEvent(event);
        } else { //IE
            event_store.target.parentNode.fireEvent("on" + event.eventType, event);
        }
    }
}
以前的

您可以使用类似的方法“暂停”冒泡的事件。它取消事件传播,并在调用click处理程序时显示模式,并将show_model变量设置为false。确认调用了fire_event()并触发原始事件后,这次不显示模式,然后将show_model重置为true。在用户未确认模式的情况下,还应将show_model恢复为true

var show_modal = true;
var event_store;

function handle_click(event) {
    event.stopPropagation();
    event_store = event;

    show_modal = !show_modal;
    if (show_modal) {
        //Open the modal here
        //If it's possible, pass the event pointer to the modal's confirm callback
        //instead of using event_store and pass that pointer to fire_event() when
        //it's confirmed
    }
}

function fire_event() {
    if (document.createEvent) { //Not IE
        element.dispatchEvent(event_store);
    } else { //IE
        element.fireEvent("on" + event_store.eventType, event_store);
    }
}

你真正应该做的是

  • 在显示对话框之前,在处理程序中调用e.preventDefault()
  • 当对话框被确认(或拒绝,我不知道要求)时,使用API方法开始编辑调度程序事件
  • 这应该让您开始(仅适用于第一次编辑;您需要在某处重置
    \u确认的
    条件):


    ()

    我知道它不被普遍接受,但可以扩展本机事件对象以支持这样的暂停,并使用event.hold()和event.resume()非常好!JS总是让我惊讶。对不起,我忽略了原始答案中的一些内容。我做了一些修改并简化了实现。这应该是你想要的。这些事件不一定都是剑道事件。我发布的方法将允许恢复本机javascript事件。此外,preventDefault不会阻止事件传播到父元素。另外,我也找不到getKendoScheduler函数的任何文档。@aecend您的解决方案可能适合DOM事件,我想现在这个问题是不明确的,因为它既涉及JS事件,也涉及Kendo UI小部件;对于剑道调度程序,事件将始终是剑道事件;preventDefault实现也是特定于剑道的(在本例中,它只是阻止编辑事件,该小部件没有冒泡);getKendoScheduler相当于.data(“kendoScheduler”)——我不确定它是否在任何地方都有文档记录
    edit: function (e) {
        if (!this._confirmed) {
            e.preventDefault();
    
            // your dialog logic here..
            if (window.confirm("Confirm edit?")) {
                this._confirmed = true;
                // in your code, you probably won't need the setTimeout wrapper
                setTimeout(function () { 
                    $("#scheduler").getKendoScheduler().editEvent(e.event);
                }, 5);
                // at some point, you'll probably want to reset this._confirmed
            }
        }
    },