如何构建一个可以在应用程序的任何地方使用的jQuery确认对话框(是/否)?

3

我有以下内容:

<ol id="listItems>
    <li id="listItem-1">
        <span class="title">Item 1</span>
        <span class="delete">delete</span>
    </li>
    <li id="listItem-2">
        <span class="title">Item 2</span>
        <span class="delete">delete</span>
    </li>
    <li id="listItem-3">
        <span class="title">Item 3</span>
        <span class="delete">delete</span>
    </li>
    <li id="listItem-4">
        <span class="title">Item 4</span>
        <span class="delete">delete</span>
    </li>
</ol>

这里我想做的是,每次点击.delete时,我都想显示一个jQuery ui-dialog以进行确认,是或否...如果用户选择是,则继续进行删除操作,就像今天一样被删除。如何构建一个jQuery UI Dialog,它是静态的,并且适用于任意数量的列表项?更好的是,它适用于我的应用程序中的任何内容,因此它不仅仅是针对列表的。有什么好的想法吗?谢谢。
4个回答

8
使用JQuery UI对话框的示例 -
示例 - http://jsfiddle.net/CdwB9/3/
function yesnodialog(button1, button2, element){
  var btns = {};
  btns[button1] = function(){ 
      element.parents('li').hide();
      $(this).dialog("close");
  };
  btns[button2] = function(){ 
      // Do nothing
      $(this).dialog("close");
  };
  $("<div></div>").dialog({
    autoOpen: true,
    title: 'Condition',
    modal:true,
    buttons:btns
  });
}
$('.delete').click(function(){
    yesnodialog('Yes', 'No', $(this));
})

使用实时 -

演示 - http://jsfiddle.net/CdwB9/4/

$('.delete').live('click', function(){
    yesnodialog('Yes', 'No', $(this));
})

问题在于列表项在不刷新页面的情况下出现和消失。有没有一种方法可以绑定到外部div(#listItems)并在那里捕获.delete点击? - AnApprentice
如果列表项是动态的,请使用live来绑定对话框。这将把对话框附加到所有项目,包括那些动态添加的项目。 - Jayendra
我可以使用live,但那会影响性能,对吧?我想知道是否有一种方法可以绑定到外部div来捕获删除点击。这不可能吗? - AnApprentice
你可以尝试将其附加到外部 div 上,这样点击事件应该会传递到子元素。然而,当你有多个事件处理程序时,这种方法会变得有点棘手。使用 Live 不会对性能产生明显影响。 - Jayendra
有没有一种方法可以将CSS添加到按钮中? - AnApprentice
1
ui-dialog-buttonpane 是我从 http://jquery-ui.googlecode.com/svn/tags/1.8rc3/themes/base/jquery-ui.css 的演示 CSS 中提取的样例 CSS。您可以进行自定义。 - Jayendra

1

我做过类似的事情。在非常高的层面上,您必须停止点击的传播,显示对话框,然后根据响应再次触发点击。

var confirmed = false;

$('span.delete').click(function(e) {
    if (!confirmed) {
        var that = $(this);

        $( "#dialog-confirm" ).dialog({
            buttons: {
                "Delete": function() {
                    confirmed = true;
                    that.trigger('click');
                    $(this).dialog("close");
                },
                Cancel: function() {
                    $(this).dialog( "close" );
                }
            }
        });

        e.stopPropagation();
    } else {
        confirmed = false;
    }
});

0
你可以使用这个库:http://labs.abeautifulsite.net/projects/js/jquery/alerts/demo/ 然后你可以像下面这样操作:
$(function(){
    $(".delete").livequery('click', function(){
        jConfirm('Message', 'Title', function(confirmed){
            if(confirmed){
                alert('Delete confirmed');
            }
        });
    });
});

我喜欢使用livequery插件,因为它可以处理在页面加载后添加的DOM元素。但是如果你不担心这个问题,可以将livequery替换为bind


谢谢,但考虑到我们已经在使用jQuery对话框,我不想再添加另一个对话框。我更愿意使用对我们有好处的jQUery对话框。 - AnApprentice

0

你可以将对话框逻辑封装在一个控制器对象中。

然后,当你实例化控制器对象时,你可以将它传递给对话框将要操作的元素以及ajax提交数据。

当用户在对话框中点击“是”时,你现在已经将该数据包含在你的控制器中,你只需要提交它即可。

类似于这样:

MyApp = {}
MyApp.MyDialog = function(context, ajaxData) {
    this.context = context;
    this.ajaxData = ajaxData;
    this.initializeDialog();
}

MyApp.MyDialog.prototype.initializeDialog = function(){
    $(this.context).dialog({
         //Your other dialog options here,
         buttons: {
             "yes": function(){
                  //Do ajax post with this.ajaxData
              },
              "No": function(){
                  this.context.dialog("close");
              }
          }
    });
}

然后你可以这样做:

var dialog = new MyApp.MyDialog("#myElement", {foo: "bar"});

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