如何从jQuery事件显式执行默认操作

时间:2011-11-12 15:57:22

标签: jquery events

this question跟进,我正在尝试实施一个不引人注目的确认对话框。

$(document).ready(function () {
    $("[data-confirmPrompt]").click(function (event) {
        var confirmPrompt = event.currentTarget.attributes['data-confirmPrompt'].value;
        event.preventDefault();
        $.prompt(confirmPrompt, {
            buttons: { Yes: true, No: false },
            callback: function (v, m, f) {
                if (v) {
                    // User clicked Yes.  Unbind handler to avoid
                    // recursion, then click the target element again
                    $(event.currentTarget).unbind('click');
                    event.currentTarget.click();
                }
            }
        });
    });
});

当用户点击“是”时,我希望执行与事件关联的默认操作。我已经通过解绑jQuery处理程序并再次单击该元素完成了上述操作。这在提交表单或导航到不同页面时工作正常 - 但当然在支持AJAX的页面中不起作用,我希望保留jQuery事件处理程序。

是否有其他通用方法来执行默认操作?逻辑上类似于event.executeDefault()

4 个答案:

答案 0 :(得分:7)

使用Alexey Lebedev在他的第二条评论中提出的建议,我现在的实现现在看起来像下面的示例,除了我还为按钮标签添加了我自己的本地化实现。

注意:

  • 我现在正在使用jqueryUI对话框小部件
  • 注意使用.delegate以便处理程序是“ajax-aware”,即在页面加载后添加到DOM的元素上工作,例如:作为AJAX调用的结果
  • 当用户在确认对话框中单击“是”时,使用标志来防止递归。
  • 使用jquery 1.6.4和jquery-ui-1.8.16

如果有人可以提出改进建议,请加入。

<!-- Examples of usage -->
<input type='submit' data-confirm="OK to delete customer 123?" ... />
<a href="..." data-confirm="OK to navigate?" ... />

<!-- Implementation -->
<script type="text/javascript">
    var confirmClickHandler = function (event) {
        if ($(event.currentTarget).data('isConfirming')) return;
        var message = event.currentTarget.attributes['data-confirm'].value;
        event.preventDefault();
        $('<div></div>')
                .html(message)
                .dialog({
                    title: "Confirm",
                    buttons: {
                        "Yes": function () {
                            $(this).dialog("close");
                            $(event.currentTarget).data('isConfirming', true);
                            event.currentTarget.click();
                            $(event.currentTarget).data('isConfirming', null);
                        },
                        "No": function () {
                            $(this).dialog("close");
                        }
                    },
                    modal: true,
                    resizable: false,
                    closeOnEscape: true
                });
    };

    $(document).ready(function () {
        $("body").delegate("[data-confirm]", "click", confirmClickHandler);
    });
</script>

答案 1 :(得分:4)

我正在做类似的事情,这对我来说很好:

$('#link').click(function(e){
    if(!confirm('Are you sure you want to asdf?')){
        e.preventDefault();
    }
});

答案 2 :(得分:0)

老实说,我不知道这是否能回答你的问题,但这可能会有所帮助。

考虑以下HTML:

<button onclick="alert('Hello world!');" class="btn">Test 1</button>
<button onclick="alert(this.className);" class="btn">Test 2</button>

我已将以下内容添加到$(document).ready

$('button').each(function() {
    var btn = $(this);
    var onClick = btn.attr('onclick');

    //replace this with _this
    onClick = onClick.replace(/this/g, "_this");

    btn.attr('onclick', '');

    btn.click(function() {
        if (confirm('Do it?')) {

            //set _this first!
            var _this = btn[0];

            eval(onClick);
        }
    });
});

似乎完成了工作。检查这个jsFiddle示例:http://jsfiddle.net/KeesCBakker/4jThg/

修改
我创建了一些看起来更像你问题的内容:http://jsfiddle.net/KeesCBakker/hqLH5/。只是想不通你正在使用哪个$ .prompt插件,所以我抓住了我从github找到的第一个插件(这个只适用于Chrome:S)。

答案 3 :(得分:0)

我能够通过在更具体的上下文中调用event.stopPropagation()并确保我不要调用event.preventDefault()来实现这一目标。虽然您不能明确地调用默认操作 ,但您可以设置条件以使默认操作发生-并根据需要执行其他操作。

    // Normal event handler
    $("[data-toggle]").click(ev => {
      switchToTab(ev.currentTarget)
      ev.preventDefault()
    })

    // Allow default handler in a specific case.
    $("[data-toggle] ul a").click(ev => {
      // Don't bubble the event to the less specific handler, above
      ev.stopPropagation()
      // An incorrect return value will also cancel the default action.
      return true
    })