【问题标题】:JQueryUI how to 'self' close a dialogJQueryUI如何“自我”关闭对话框
【发布时间】:2012-10-10 00:10:23
【问题描述】:

我正在开发一个使用 jQueryUI 并创建大量对话框的 Web 应用程序。对话框各不相同,关闭对话框的按钮最终会在对话框中嵌入多个 div。

我想要一个总是关闭包含对话框的函数。

以下面的html为例:

<div id="demoDialog">
   <div>
      <div id='demoDialogSubmit'>
         <input type='submit' onClick='selfCloseDialog();' value='Ok' style='margin-top:10px' />
      </div>
   <div>
<div>

在我的 js 代码中,我将它初始化为一个对话框:

$( "#demoDialog" ).dialog( params );

现在对于点击我有一些不太好的选择。我可以坚持关闭按钮知道对话框的ID。例如。做类似的事情:

onclick="$( '#demoDialog' ).dialog( 'close' );"

但我宁愿使用通用代码,而不是总是随身携带对话框的 id,以便我可以将其发送到可能关闭它的小部件。

或者我可以记住我在下面多少层:

function selfCloseDialog() { $(this).parent().dialog( 'close' ); }

但我真的希望 selfCloseDialog() 只搜索元素层以寻找要关闭的对话框对象。我该怎么做?

@更新:

所以我让它工作了。感谢大家的建议,这个问题实际上有两个问题。

第一个问题在这里:

<input type='submit' onClick='selfCloseDialog();' value='Ok'/>

应该是:

<input type='submit' onClick='selfCloseDialog(this);' value='Ok'/>

按钮元素不作为函数的“this”参数传入。这现在看起来很明显。

下面的直接方法 JAAulde 有效并且看起来最干净:

function selfCloseDialog( caller ) {
   $(caller).closest( ".ui-dialog-content" ).dialog('close');
}

有几个答案涉及最接近的选择器和选择器 - 但我认为除了他建议的普通类选择器之外没有任何理由使用任何东西。

【问题讨论】:

  • 检查我的答案,这是投反对票的。但这正是您所需要的!它可以在任何地方工作,甚至可以从 ajax 加载的内容中使用

标签: javascript jquery jquery-ui


【解决方案1】:

在制作对话框时,请包含一个关闭按钮:

var params = {
    //whatever you already had in there
    buttons: {
        // In the buttons object, the "key" will be the button text, the function
        // will be executed on click of the button in scope of the dialoged element
        Close: function () {
            $(this).dialog('close');
        }
    }
};

$( "#demoDialog" ).dialog( params );

并且从在对话元素的任何后代元素范围内运行的代码中运行:

$(this).closest('.ui-dialog-content').dialog('close');

【讨论】:

  • 好的。但是对话框有稍后出现的 ajax 位,可能会关闭对话框。特别是我有一个事务可以更改对话框的状态,以便稍后出现关闭元素。那就是原始提交的返回将对话框重写为在某些情况下具有自己的“确定”关闭按钮的确认屏幕。
  • 记下修改后的答案。我在您评论时进行了编辑。
  • 结果与您的第二个答案略有不同 - 但您的最接近。请参阅编辑以获取解释。
【解决方案2】:

不确定我是否完全理解您的要求,但似乎最简单的方法是为您的所有对话框添加一个标准类,然后编写如下代码:

$(this).closest('.dialog-class').dialog('close');

closest() 在这里定义:

http://api.jquery.com/closest/

【讨论】:

  • 我会试试的。我想这就是我一直在寻找的东西。
  • 仅供参考,UI 为所有对话元素添加的类是 ui-dialog,因此您无需为此添加任何类。
【解决方案3】:

*更新以反映对话框的 ajax 部分。 *更新以反映 cmets

<div id="soemthing.random.ui.dialog.makes">
.... your content....
<a class='custom-close' href="#Close">Custom Close</a>
.... 
</div>

$(function(){
  $("your selector").dialog();
  var selector = ":ui-dialog";
//developers choice.  ".ui-dialog-content" is faster, ":ui-dialog" is guaranteed
  $(selector ).on({
   "click":function(event){
     event.preventDefault();
     $(this).closest(selector).dialog("close");
   }
  },"a.custom-close",null);

})

【讨论】:

  • :ui-dialog 有效,但就选择器而言较慢。它是任何与 $.widget() 工厂兼容的小部件的最后手段
  • @DefyGravity :ui-dialog 选项很干净IMO,应该添加到答案中。
  • @DefyGravity 同意它可以工作,但速度较慢。由于 UI 将类添加到每个对话元素,因此使用它进行查询会更快。很好的编辑。
  • 抱歉,ui-dialog 不是您要使用的类。其实是ui-dialog-content
【解决方案4】:

我建议使用类而不是编写内联函数调用,但这取决于您。

这是我的带有事件委托的 hackish 解决方案,其中单击具有 selfclose 类的元素将关闭祖先对话框:

$(document).on('click', '.selfclose', function() {
    $(this).parents().each(function() {
        try {
            $(this).dialog('close');
        } catch(e) {}
    });
});

Fiddle

但正如 DefyGravity 所提到的,使用 :ui-dialog 选择器是一种更简洁的解决方案:

$(document).on('click', '.selfclose', function() {
    $(this).closest(":ui-dialog").dialog("close");
});

Fiddle

【讨论】:

  • 使用伪选择器更干净。 UI 将 ui-dialog 类添加到所有对话的元素(即调用了 .dialog() 的元素),因此使用类选择器而不是伪选择器是一种更快的查询。
  • @JAAulde 在发布此答案之前,我已经阅读了您在其他答案中的评论,不幸的是,您的建议不适用于此fiddle
  • 抱歉,调用了对话框的元素接收到ui-dialog-content 类。我之前提到的类被分配给 UI 创建的元素的外部包装器,用于包装对话元素。 jsfiddle.net/bAzab/6
  • @JAAulde 您应该将其发布为我想的答案,当涉及几分之一毫秒时,这是一种非常有效的方法。 =]
  • 大声笑,关于节省毫秒。无论如何,在发布任何其他答案之前,我将其发布为对该问题的第一个答案的编辑。
【解决方案5】:

检查这个: http://jsfiddle.net/Wqh4Y/3/

function closeParentDialog(closeButton)
{
closeButton.parents('.ui-dialog').eq(0).find('a.ui-dialog-titlebar-close').eq(0).click();

}

$(function() {


    $( "#dialog" ).dialog();

});​

你可以这样使用它:

     <div id="dialog" title="Basic dialog">
        <p>This is the default dialog which is useful for displaying information. The dialog   window can be moved, resized and closed with the 'x' icon.

          <span> <a class="close-dialog" onclick="closeParentDialog($(this))">selfclose</a>  </span>
        </p>
     </div>

【讨论】:

  • 无意冒犯,但不应遵循这一点。 jQuery UI 提供了一个非常干净的 API,应该使用它。不要模仿用户交互来完成干净的 API 调用。
  • 我同意,但有时 api 是不够的,这里是您需要“脱下手套”时的示例
  • 不,这不是“那个时代之一”的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多