dojo CheckBox问题解析

dojo版本:1.6

在使用dojo的dijit.form.CheckBox组件过程中发现了如下两个问题:

一、是无法方便地指定其label,虽然CheckBox组件有一个label属性,

但是设置了并不能达到想要的效果,label依然不显示,因为根本就没有为checkbox添加<label>标签。如下:

<input type="checkbox" dojoType="dijit.form.CheckBox" checked="true" label="足球">

 产生的checkbox却无标签

我的解决办法是扩展CheckBox组件,创建CheckBox组件后自动添加<label>标签,代码如下:

dojo.provide("my.widget.CheckBox");

dojo.require("dijit.form.CheckBox");
dojo.declare("my.widget.CheckBox",dijit.form.CheckBox, {

	startup : function() {
		this.inherited(arguments);
		// 使用jQuery
		//var html = '<label for="' +this.id+ '" style="display:inline;float: none;padding-right:0;">' +this.labelText+ '</label>';
		//$(this.domNode).after(html);

		// 直接使用JS
		var label = document.createElement("label");
		label.setAttribute("for", this.id);
		label.innerText = this.labelText;
		// 覆盖dojo默认label样式
		label.style.display = "inline";
		label.style.float = "none";
		label.style.paddingRight = "0";

		this.insertAfter(label, this.domNode);
	},

	insertAfter : function (newElement, targetElement) {
   		var parent = targetElement.parentNode;
   		if (parent.lastChild == targetElement ) {
        	// 如果最后的节点是目标元素,则直接添加。因为默认是最后
        	parent.appendChild(newElement );
   		} else {
        	//如果不是,则插入在目标元素的下一个兄弟节点的前面。也就是目标元素的后面
        	parent.insertBefore( newElement, targetElement.nextSibling );
   		}
	},
	labelText : ""
});

二、在做全选功能时,发现CheckBox事件循环传递,导致达不到预期效果,解决办法如下:

<script type="text/javascript">
	dojo.require("my.widget.CheckBox");

	dojo.addOnLoad(function(){
		var selectAllCheckBox = dijit.byId("selectAll");
		// 为全选CheckBox注册onClick事件,当然onChange也可以
		var handle = dojo.connect(selectAllCheckBox, "onClick", window, "selectAll");
		var widgets = dijit.findWidgets(document.getElementById("sportsDiv"));

		dojo.forEach(widgets, function(checkbox, index){
			dojo.connect(checkbox, "onChange", function(checked){
				console.log(checkbox.get("id") + ":" + checked);
				if(!checked) {
					dojo.disconnect(handle);
					// 设置checked属性时,会触发全选CheckBox的onClick事件,所以在此之前须先断开
					// 否则事件会循环触发
					selectAllCheckBox.set("checked", false);
				} else {
					var hasUnchecked = false;
					for(var i=0; i<widgets.length; i++) {
						console.log(widgets[i].get("checked"));
						if(!widgets[i].get("checked")) {
							hasUnchecked = true;
						}
					}
					if(!hasUnchecked) {
						// 设置checked属性时,会触发全选CheckBox的onClick事件,所以在此之前须先断开
						// 否则事件会循环触发
						dojo.disconnect(handle);
						selectAllCheckBox.set("checked", true);
					}
				}
			});
			// 最后,为全选CheckBox重新注册onClick事件监听
			handle = dojo.connect(selectAllCheckBox, "onClick", window, "selectAll");
		});

	});

	function selectAll(event) {
		var selectAllCheckBox = dijit.byId("selectAll");
		var checked = selectAllCheckBox.get("checked");
		var widgets = dijit.findWidgets(document.getElementById("sportsDiv"));
		dojo.forEach(widgets, function(checkbox, index){
			checkbox.set("checked", checked);
		});
	}
</script>
</head>
<body class="claro">
	<form action="" id="reg_form">
		<div class="grouping">
			<div>
				<input type="checkbox" dojoType="my.widget.CheckBox" name="select-all" id="selectAll" labelText="全选">
			</div>
			<div id="sportsDiv">
				<div>
					<input type="checkbox" dojoType="my.widget.CheckBox" name="sports" value="football" id="football" labelText="足球">
					<input type="checkbox" dojoType="my.widget.CheckBox" name="sports" value="basketball" id="basketball" labelText="篮球">
				</div>
			</div>
		</div>
	</form>
</body>
时间: 2024-10-01 00:28:44

dojo CheckBox问题解析的相关文章

Dojo动画原理解析

dojo中动画部分分为两部分:dojo/_base/fx, dojo/fx.dojo/_base/fx部分是dojo动画的基石,里面有两个底层API:animateProperty.anim和两个常用动画:fadeIn.fadeOut(类似jQuery中的show.hide).dojo/fx中有两个复合动画:chain(类似jQuery中的动画队列).combine和三个动画函数:wipeIn.wipeOut.slideTo. dojo中动画的原理与jquery类似,都是根据setInterva

基于 Dojo toolkit 实现 web2.0 的 MVC 模式

前言 MVC 模式是设计模式中的经典模式,它可以有效的分离数据层,展示层,和业务逻辑层.Web2.0 技术由于其良好的用户体验被广泛应用于 WEB 应用的展示层.但是在传统的 web 开发中,展示层的和业务逻辑层代码大量耦合,使得应用的可扩展性严重降低,同时页面层代码的可复用性也很低.本文用实例介绍,如何使用 dojo toolkit 扩展 dojo 的页面控件并实现 MVC 模式,有效的分离了展示层与业务逻辑层的代码,同时使得展示层代码可复用性大大提高. 第一部分:Dojo 构造 MVC 与传

dojo/query源码解析

dojo/query模块是dojo为开发者提供的dom查询接口.该模块的输出对象是一个使用css选择符来查询dom元素并返回NodeList对象的函数.同时,dojo/query模块也是一个插件,开发者可以使用自定义的查询引擎,query模块会负责将引擎的查询结果包装成dojo自己的NodeList对象. require(["dojo/query!sizzle"], function(query){ query("div")... 要理解这个模块就要搞清楚两个问题:

dojo Provider(script、xhr、iframe)源码解析

总体结构 dojo/request/script.dojo/request/xhr.dojo/request/iframe这三者是dojo提供的provider.dojo将内部的所有provider构建在Deferred基础上形成异步链式模型,utils.deferred函数向3个provider提供统一接口来规范其行为.数据请求在各个provider的发送过程几乎一致: 解析options参数util.parseArgs 创建dfd对象,该对象控制着整个数据接收.处理.传递的过程 //Make

带CheckBox的dojo Tree简单实现,并实现级联选取

dojo自带的Tree不能实现CheckBox选取节点功能,第三方cbtree过于复杂,因此自己写了个简单的实现,能够实现子节点级联父节点直到根节点,父节点选取全选子节点的功能,但没有写父节点取消时的子节点取消,代码如下,大家可以自行拷贝修改 function createMenuTree() {            require(["dojo/request",               "dojo/store/Memory",              

dojo/request模块整体架构解析

总体说明 做前端当然少不了ajax的使用,使用dojo的童鞋都知道dojo是基于模块化管理的前端框架,其中对ajax的处理位于dojo/request模块.一般情况下我们使用ajax请求只需要引入dojo/request模块,然后按照文档的说明制定参数即可.实际上dojo在这一模块的处理中抽象了很多概念: 平台侦探器:dojo/request/default 请求分发器:dojo/request/registry 全局通知器:dojo/request/notify 数据传输器:dojo/requ

dojo/aspect源码解析

dojo/aspect模块是dojo框架中对于AOP的实现.关于AOP的详细解释请读者另行查看其它资料,这里简单复习一下AOP中的基本概念: 切面(Aspect):其实就是共有功能的实现.如日志切面.权限切面.事务切面等. 通知(Advice):是切面的具体实现.以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before).后置通知(After)与环绕通知(Around). 连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点. 目标对象(Target):就是那些即将切

100行代码解析Dojo树控件拖拽案例

案例设定: 创建2个树控件,左右排列. 使用拖动的方式,将树节点从左侧树控件拖拽的右侧树控件. 拖拽过程中右侧树控件要进行验证,确认是否可以方式拖拽中的节点. 放置的处理,识别要放置的节点,获取其信息并动态创建新的节点(基于基础类型进行实例化的过程). 右侧树控件内(实例化之后的节点),同类型节点间支持拖动排序. Dojo版本 1.10.3 图例1:创建2个树控件,左右排列. 图例2.3: 使用拖动的方式,将树节点从左侧树控件拖拽的右侧树控件. 拖拽过程中右侧树控件要进行验证,确认是否可以方式拖

dojo/io-query源码解析

该模块主要对url中的query部分进行处理,我们发送GET请求时,将参数直接放在URL中,经常碰到的需求就是把一个对象转化为query字符串放到url中去发送GET请求.io-query模块便提供了两个方法来处理query: objectToQuery将一个object转化成query字符串 queryToObject将query字符串转化成对象 从对象转化成query是拼接的过程,对象的字段和值都需要编码 objectToQuery: function objectToQuery(/*Obj