首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在jQuery UI对话框中显示复选框并提供取消按钮

在jQuery UI对话框中显示复选框并提供取消按钮
EN

Stack Overflow用户
提问于 2011-10-04 04:38:25
回答 2查看 13.7K关注 0票数 8

我正试图解决一个可能非常常见的问题,并准备了一个简化的测试用例来演示它和我的努力。

我正在尝试显示几个jQuery UI对话框,每个对话框包含几个同名复选框(下面的测试代码中有水果和糖果)。

在每个对话框中,我有4个按钮:SaveCancelSelect 取消选择all

前3个按钮已经在我的代码中工作了。

实际上,更新按钮将是调用DataTable的fnDraw()函数,该部分也已在工作。(我不想在中间保存服务器上的复选框值,我想在客户端做任何事情--我知道,这是可能的)。

我的问题是在实现对话框的Cancel按钮时:

1)我可能应该保存对话框打开事件上当前设置的复选框列表?然后在上还原它们,取消单击?有一些优雅的jQuery方式吗?

2)我不知道,如何只处理当前打开的对话框的复选框。

下面是我当前的测试代码,它可以立即工作--多亏了Google:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
<head>
<style type="text/css" title="currentStyle">
        @import "http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/themes/redmond/jquery-ui.css";
</style>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script type="text/javascript">

$(function() { 
        var buttons = {
                Cancel: cancel,
                Save: save,
                'Deselect All': deselect,
                'Select All': select
        };

        $('#fruits').dialog({ 
                autoOpen: false, 
                modal: true,
                buttons: buttons
        });

        $('#candy').dialog({ 
                autoOpen: false, 
                modal: true,
                buttons: buttons
        });
});

function update() {
        var boxes = new Array();
        $(':checkbox').each(function() {
                if ($(this).is(':checked')) {
                        boxes.push(
                                $(this).attr('name') + 
                                '=' +
                                $(this).val() 
                        );
                }
        });

        alert('boxes: ' + boxes.join('&'));
}

function select() {
        $(':checkbox').prop('checked', true);
}

function deselect() {
        $(':checkbox').prop('checked', false);
}

function save() {
        // XXX how to implement?
        $(this).dialog('close');
}

function cancel() {
        // XXX how to implement?
        $(this).dialog('close');
}

</script>
</head>
<body>

<p><input type="button" value="Select fruits" onclick="$('#fruits').dialog('open');"></p>
<div id="fruits" title="fruits">
<p><label><input type="checkbox" name="fruits" value="apple">apple</label></p>
<p><label><input type="checkbox" name="fruits" value="banana">banana</label></p>
<p><label><input type="checkbox" name="fruits" value="pear">pear</label></p>
</div>

<p><input type="button" value="Select candy" onclick="$('#candy').dialog('open');"></p>
<div id="candy" title="candy">
<p><label><input type="checkbox" name="candy" value="toffee">toffee</label></p>
<p><label><input type="checkbox" name="candy" value="fudge">fudge</label></p>
</div>

<p><input type="button" onclick="update();" value="Update"></p>

</body>
</html>

更新:多亏了mootinator,下面的代码正在工作,但我仍然有两个小问题/问题:

1)是否可以使用open事件而不是自定义的openDialog()方法?

2)我取消选择All和Select按钮,修改页面上的所有复选框,而不是只修改属于当前对话框的复选框。我想知道如何只选择后者?(以某种方式使用$(this) in selectAll()和deselectAll())?

我试过了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function selectAll() {
        $($(this) + ' :checkbox').prop('checked', true);
}

function deselectAll() {
        $($(this) + ' :checkbox').prop('checked', false);
}

但是得到语法错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
<head>
<style type="text/css" title="currentStyle">
        @import "/css/demo_table_jui.css";
        @import "http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/themes/redmond/jquery-ui.css";
</style>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script type="text/javascript" src="/js/jquery.dataTables.min.js"></script>
<script type="text/javascript">

$(function() {
        var buttons = {
                Cancel: cancel,
                Save: save,
                'Deselect All': deselectAll,
                'Select All': selectAll
        };

        $('#openCandy').button();
        $('#openFruits').button();
        $('#update').button();

        $('#openCandy').click(function() {
                openDialog('#candy');
        });

        $('#openFruits').click(function() {
                openDialog('#fruits');
        });

        $('#fruits').dialog({
                autoOpen: false,
                modal:    true,
                buttons:  buttons
        });

        $('#candy').dialog({
                autoOpen: false,
                modal:    true,
                buttons:  buttons
        });
});

function update() {
        var boxes = new Array();
        $(':checkbox').each(function() {
                if ($(this).is(':checked')) {
                        boxes.push(
                                $(this).attr('name') +
                                '=' +
                                $(this).val()
                        );
                }
        });

        alert('boxes: ' + boxes.join('&'));
}

function selectAll() {
        $(':checkbox').prop('checked', true);
}

function deselectAll() {
        $(':checkbox').prop('checked', false);
}

function openDialog(sel) {
    $(sel).dialog('open');
    $(sel + ' :checkbox').each(function() {
        $(this).data('XXX', $(this).is(':checked'));
    });
}

function cancel() {
        $(this).find(':checkbox').each(function() {
            $(this).prop('checked', $(this).data('XXX'));
        });
        $(this).dialog('close');
}

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

</script>
</head>
<body>

<p><input id="openFruits" type="button" value="Select fruits"></p>
<div id="fruits" title="fruits">
<p><label><input type="checkbox" name="fruits" value="apple">apple</label></p>
<p><label><input type="checkbox" name="fruits" value="banana">banana</label></p>
<p><label><input type="checkbox" name="fruits" value="pear">pear</label></p>
</div>

<p><input id="openCandy" type="button" value="Select candy"></p>
<div id="candy" title="candy">
<p><label><input type="checkbox" name="candy" value="toffee">toffee</label></p>
<p><label><input type="checkbox" name="candy" value="fudge">fudge</label></p>
</div>

<p><input id="update" type="button" onclick="update();" value="Update"></p>

</body>
</html>

UPDATE2:,实际上,我有第三个和更大的问题:对话框右上角的关闭X按钮不能正常工作(它保存而不是取消)。

我尝试将close: cancel,添加到这两个对话框中,但我在Chrome中得到了运行时错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Uncaught RangeError: Maximum call stack size exceeded
f.event.remove
f.event.remove
f.fn.extend.unbind
a.extend.destroy
a.extend.destroy
a.widget.close
a.widget.bridge.a.fn.(anonymous function)
e.extend.each
e.fn.e.each
a.widget.bridge.a.fn.(anonymous function)
cancel
a.Widget._trigger
a.widget.close
a.widget.bridge.a.fn.(anonymous function)
.....etc....

UPDATE3:可能是因为我在循环中调用了UPDATE3?

不过,我不认为有一种简单的方法可以解决这个问题:如果我创建一个单独的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function restore() {
        $(this).find(':checkbox').each(function() {
            $(this).prop('checked', $(this).data('XXX'));
        });
}

function cancel() {
        restore();
        $(this).dialog('close');
}

并以close的形式传递它:将还原到对话框,然后Save按钮中断

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-09 09:50:01

我对你的代码做了几处修改。可能最容易做的事情(不一定是最好的)是将状态保存在全局变量中。(更健壮的解决方案可能只需要将状态与对话框状态/选项一起保存)。

UPDATE:清理解决方案,将初始状态存储在DOM中的复选框中,而不是全局变量中。

http://jsfiddle.net/rhdNH/8/

为了便于保存状态,我添加了一个自定义的打开函数,并完成了cancel函数。当您使用removeProp关闭时,您可能也希望清理“原始”属性,但这并不是绝对必要的。

以下是您将对#1点(打开: openDialog )所做的更改,以避免直接调用openDialog。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$('#fruits').dialog({ 
    autoOpen: false, 
    modal: true,
    buttons: buttons,
    open: openDialog
});

$('#candy').dialog({ 
    autoOpen: false, 
    modal: true,
    buttons: buttons,
    open: openDialog
});

这就是只对打开的对话框进行选择/取消选择的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function select() {
    $(':checkbox', this).prop('checked', true);
}

function deselect() {
    $(':checkbox', this).prop('checked', false);
}

下面是对openDialog进行编辑以使用this而不是jQuery选择器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function openDialog() {
    $(':checkbox', this).each(function() {
        $(this).prop('original', $(this).is(':checked'));
    });
}

function cancel() {
        $(this).find('input[type="checkbox"]').each(function() {
            $(this).prop('checked', $(this).prop('original'));
        });
        $(this).dialog('close');
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-04 04:50:30

  1. 在您的保存函数中,您应该调用服务器端脚本(使用AJAX - check jQuery docs 这里)并保存每个复选框的状态(当然,如果这是您愿意做的)
  2. 在cancel函数中,我只需要关闭对话框,因为您不需要更改任何内容。回滚由保存所做的更改是没有意义的,因为您总是可以检查/ unckech想要的复选框并再次保存它们。
  3. 如何仅处理当前打开的对话框的复选框-为div容器分配唯一id并使用$('#div_id input[type="checkbox"]')选择器
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7648004

复制
相关文章
链表----在链表中添加元素详解
1.2对于链表来说,若想访问链表中每个节点则需要把链表的头存起来,假如链表的头节点为head,指向链表中第一个节点,如图:
wfaceboss
2019/04/08
2.7K0
链表----在链表中添加元素详解
在excel图表上添加数据标签
在Excel2013中,选中柱子右键---添加数据标签-----添加数据标签(B),如下图:
演化计算与人工智能
2020/08/14
2K0
在excel图表上添加数据标签
在Ubuntu 20.04上添加swap交换空间
很多认为swap是物理RAM内存已满时才使用swap。 这是一个错误的认知,因为内核会将非活动页面将从内存移动到交换空间swap。
小锋学长生活大爆炸
2022/09/08
3.9K0
在Ubuntu 20.04上添加swap交换空间
在 Ubuntu 上如何添加 Apt 软件源
当使用 Ubuntu 软件中心或者从终端命令行输入apt或者apt-get安装软件包时,软件包被从一个或者多个软件源下载下来。一个 APT 软件源是一个网络服务器或者一个本地目录,它包含 deb 软件包和可以被 APT 工具读取的元文件。
雪梦科技
2020/05/09
23.3K0
在 Ubuntu 上如何添加 Apt 软件源
jQuery - 添加元素
jQuery append() 方法在被选元素的结尾插入内容(仍然在该元素的内部)。
陈不成i
2021/07/22
2.6K0
在元素上写事件和addEventListener()的区别[通俗易懂]
语法: element.addEventListener( type , listener , useCapture ) – – 添加事件监听 – – type: 事件类型字符串,不使用“on”前缀 – – callback:事件处理程序(回调函数) – – useCapture:可选参数,是否使用事件捕获的方式处理事件。不传递时,默认为false,表示不使用事件捕获(使用事件冒泡),如果需要显示事件捕获,则显示传递true。
全栈程序员站长
2022/09/18
1.2K0
javascript动态添加元素
<!doctype html> <html lang=”en”> <head> <meta charset=”UTF-8″> <meta name=”Generator” content=”EditPlus®”> <meta name=”Author” content=””> <meta name=”Keywords” content=””> <meta name=”Description” content=””> <title>Document</title> </head> <body> <script> function addLiElement() { var liElement = document.createElement(‘li’); //liElement.innerHTML = ‘这是新增的li元素’; var labelElement = document.createElement(‘label’); var inputElement = document.createElement(‘input’); labelElement.innerHTML = ‘单号:’ inputElement.setAttribute(‘name’, ‘expressNumber’); liElement.appendChild(labelElement); liElement.appendChild(inputElement); var ulElement = document.getElementById(‘myid’); ulElement.appendChild(liElement); } </script> <ul id=”myid”> <li>aa</li> <li>bb</li> </ul> <p> <button onClick=”addLiElement();”>动态添加标签</button> </p> </body> </html>
全栈程序员站长
2022/06/25
1.9K0
javascript 如何添加元素
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152086.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/25
1K0
原生js添加元素
今天做页面使用的mui,因为使用mui情况下无法使用jquery,于是在ajax请求完毕添加元素的时候发现自己竟然对原生js添加元素的方法有点模糊了,真是越活越倒退了,赶紧整理一波。
全栈程序员站长
2022/06/25
8.9K0
html页面添加元素
Title table,td,th{ border: 1px solid slateblue ; } div{ vertical-align: center; text-align: center; } $(function (){ var $delete=function (){ var $parent = $(this).parent().parent();
await
2021/09/23
6.4K0
js 动态添加元素
该例子的样式用的是easyui的样式,看不懂只需把class="easyui-XXX" 删除即可 <div class="fitem" id="urls" style="margin-bottom:5px;"> <label>url:</label> <input id="url" name="url" class="easyui-textbox" style="width: 260px" > 小标题: <input id="url_title" name="url_titl
黄啊码
2020/05/29
19.7K0
js 动态添加元素
vue 数组添加元素
3、splice() 方法向/从数组指定位置添加/删除项目,然后返回被删除的项目。
wust小吴
2019/11/05
5.4K0
js添加元素方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152064.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/25
8.5K0
C语言编程: 在BMP图片上添加图片水印
gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
DS小龙哥
2022/01/07
4.6K0
C语言编程: 在BMP图片上添加图片水印
js操作DOM在父元素中的结尾添加子节点注意
所以js是不能直接传入字符串的,但是jquery的append可以直接传入html字符串。
蓓蕾心晴
2018/10/25
9.9K0
js操作DOM在父元素中的结尾添加子节点注意
原生js动态添加元素
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152106.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/25
6.8K0
封装数组之添加元素
在上一小节中,我们对数组进行了一个基本的封装,该小节中,我们在上一次基础上,新增往数组添加元素的方法:
wfaceboss
2019/04/08
1.1K0
Python 列表如何添加元素
添加前: 'my', 'name', 'is', 'mark', 'age', 18
用户8418197
2022/02/13
1.8K0
点击加载更多

相似问题

Leadtools没有足够的内存

26

纱线MapReduce没有足够的内存

12

Malloc没有分配足够的内存

10

删除行没有足够的内存

111

图片图形用户界面C# (使用图片框)

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文