在jQuery UI对话框中触发按钮点击事件

19

这是一个非常简单的问题,但我找不到答案。 我有一个对话框,在其中一些事件发生时,我想点击对话框中的按钮。 定义对话框的代码如下:

var dialog = $('<div>').dialog({
    autoOpen: false,
    title : title,
    resizable : false,
    buttons : {
        'CANCEL' : {
            text : messages.Cancel,
            click : function(){$(this).dialog('close')}
        },
        'OK' : {
            text : messages.Ok,
            click : okButtonCallback
        }
    }
});

在我的事件中,我能够获取对话框,找到按钮,但是我无法通过正确的引用传递作为this来触发点击事件。我这样做:

buttons = dialog.dialog('option', 'buttons');

我有几个按钮,每个都有点击功能。如果直接调用或通过trigger('click')调用它们,它们将调用按钮的点击事件,但this指向按钮本身而不是对话框对象。 我在某处看到可以这样调用:

buttons['OK'].apply(dialog);

但是我的按钮完全没有应用功能!

我不确定我能做什么!


如果你可以获取到按钮的引用,那么只需简单地调用button.click(); 或者 $(button).click(); - BNL
正如问题所述,它在函数内部没有传递正确的引用作为“this”。 - mohamnag
4
我有点晚了,但奇怪的是我按你的方法做了,“buttons ['Ok'] .apply(dialog);”,它起作用了。我尝试了“buttons['Ok'] .click.apply(dialog);”,但它不起作用。 - Khon Lieu
1
同样的情况 - "buttons['OK'].apply(dialog)" 对我也起作用了。 - Kirk Liemohn
太晚了,但可能是由于某些浏览器依赖性甚至可能是由于jQuery版本。但响应是正确的,buttons ['OK']是一个对象,apply可以在函数而不是对象上调用。 - mohamnag
1
根据新的Jquery UI文档,您需要通过索引从数组中检索按钮,例如 buttons[1]。然后使用click.apply(dialog)方法。 - ttacompu
3个回答

15

首先,你需要获取buttons[0]而不是buttons['OK'],然后,它不是一个函数而是一个对象,请尝试像这样获取click函数:

buttons[0].click.apply(dialog);

哦不,对于我的情况,最新的jQuery UI(2019年6月)是buttons.OK而不是buttons[0]。此外,buttons.OK是一个函数。 - Dee

15
$('.ui-button:contains("Ok")').click()

我特别用它来进行qUnit测试,它非常宝贵! - streetlight
我认为你没有读完我问题的最后一部分,click()函数或trigger('click')是可以工作的,但是当像这样使用时,click函数内部的this不是指向对话框(就像用户单击按钮时那样),而是指向按钮本身。我的问题是如何克服这种差异,我已经解决了它。 - mohamnag

6

我使用的是:

// Get the buttons
var buttons = $("#myDialog").dialog("option", "buttons");
// Calls the event
buttons["OK"]();

我在“OK”函数内调用了“close”,出现错误:无法在对话框初始化之前调用方法;尝试调用方法“close”。 - Dee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接