Javascript:取消或让活动继续?

时间:2014-05-15 00:19:15

标签: javascript events javascript-events kendo-ui

我的场景涉及Kendo UI,但我认为它可能通常适用于JavaScript,因此也适用于JavaScript标记。

我有一个Kendo调度程序,其编辑事件选项设置为functionA。

在functionA中,我创建一个Kendo窗口(基本上是一个模态),询问用户一个问题;在一种情况下,编辑事件应该继续并冒泡,好像模态从未出现过,在另一种情况下,它应该防止默认并返回。

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

如果我从Kendo窗口中获得所需的结果,我如何捕获和暂停当前事件并仅继续它?

我知道由于JavaScript的单线程性质,我不能也不应该使Kendo窗口阻塞,但是有没有办法让这个事件保持不变,只有恢复它才能恢复我是这么说的。

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

2 个答案:

答案 0 :(得分:4)

<强>更新

我测试了之前发布的代码,但我发现它不能正常工作。这是经过测试并完全按照您的需要工作,加上其解决方案:

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);
        }
    }
}

<强>上

你可以使用这样的东西来&#34;暂停&#34;冒泡的事件。它取消事件传播并在调用单击处理程序时显示模态并将show_modal变量设置为false。在确认调用fire_event()并且它触发原始事件时,此时不显示模态,然后将show_modal重置为true。如果用户未确认模态,您还应将show_modal恢复为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);
    }
}

答案 1 :(得分:1)

你应该做的是

  1. 在显示对话框之前在处理程序中调用e.preventDefault()
  2. 当您的对话框确认(或被拒绝,我不知道要求)时,请使用API​​方法开始编辑计划程序事件
  3. 这应该让你开始(只适用于第一次编辑;你想要在某处重置_confirmed条件):

    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
            }
        }
    },
    

    see it work