Dhtml 属性编程之原创笔记

一、属性控制

属性是用来标识一个对象或是一组对象的状态,比如Radio的Checked表示的是当前单选按钮是否被选中。

如果我们选中一个单选按钮时想显示一个文本框,即 “当选中单选按钮时显示文本框”,但大多数情况下我们并不是这样处理,更多的是通过:

事件(onclick, onkeydown,…) ---> 判断当前状态(Checked是否为True) ---> 调用相应的Function(显示或隐藏文本框)

这样的处理方法非常被动,我们要为每一个事件加上相同的代码来实现最终的目的,很有可能的是在Coding过程中的忽略的某些事件(比如onkeypress, onkeydown等),并且程序的扩展性不强。

对于一个属性,特别是状态属性来说,它应当起到的是一个命令的作用,就像是CEO告诉你现在要去做什么,但这件事如何去做,用什么方法去做,这应当由你自己去决定。

因此,对于属性的操作应该尽量是
控制器:事件或其它Function ---> 设置属性
处理器:属性改变时 ---> 调用处理器(判断属性的状态,做出相应的处理)
通过属性为分界线,我们把它分为了控制和处理两个部分,这样在整个属性处理流程中灵活性会增加很多。

那我们应该如何来实现这样的想法呢?

1. onpropertychange
<html>
<head>
<script language="javascript">
function changeBox(status)
{
textbox.style.display = status ? "" : "none"
}
</script>

<script language="javascript" for="test" event="onpropertychange">
var propName = event.propertyName
var propValue = this[propName]

switch(propName)
{
case "checked":
changeBox(propValue)
break;
}
</script>
</head>

<body>
<input type="radio" id="test" name="radio" checked="true" />
<input type="radio" name="radio" />
<input id="textbox" />
</body>
</html>

 

2. Htc
在HTC中实现很容易,Microsoft已经做好了相应的接口,直接使用property元素的get和put方法就行了。

3. 自定义
我们需要做一个属性控制器就能做到这一点,如:
function controlAttribute(对象,属性,设置的值)
{
对象.属性 = 设置的值
调用 对象.绑定在属性变化事件的函数(属性)
}

所有的属性设置通过属性控制器去执行,这样就能做到和onpropertychange或是HTC一样的效果了。


二、局部属性

在某些时候可能几个元素同时只使用一个属性,比如select中的option,在大多数情况中他们只可能有一个selected为True,其余的都为Flase,那么我们可以把它看做在这一组的option中只有一个selected,在HTML代码中我们也是这样表示的。
所以就需要一个在局部区域使用的属性来标识,它就像是一个令牌一样可以在不同的元素这间移动,这就确保了属性的唯一性,并且若是想改变属性的状态时,你不须要考虑这个属性在哪一个元素上,直接改变属性的状态。

下面我们看一下例子,由于IE6的在DOM支持上的不完善,所以写这个程序过程中有一些附加的代码,如要通过一个全局的TR变量记录属性所在的对象名称(DOM中可以通过 属性.parentNode 得到)等
<script>
function findParentObj(obj, strTagName, strId)
{
 while ( obj &&
    !(!strTagName || obj.tagName == strTagName) &&
     (!strId || obj.id == strId)
   )
  obj = obj.parentElement
 return obj
}

var oTR
bgColorOver    = document.createAttribute("bgColor")
bgColorOver.nodeValue = "red"

bgColorOut    = document.createAttribute("bgColor")
bgColorOut.nodeValue = "transparent"

function highlight(obj) {
 if (oTR)
 {
  oTR.removeAttributeNode(bgColorOver)
  oTR.setAttributeNode(bgColorOut)
  oTR.removeAttributeNode(bgColorOut)
 }
 oTR     = findParentObj(event.srcElement, "TR")
 if (oTR) oTR.setAttributeNode(bgColorOver)
}
</script>
<table border="1" bgcolor="#FFFFFF" οnclick="highlight(this)" οnmοuseοver="highlight(this)">
<tr>
    <td>序</td>
    <td>单位编码</td>
    <td>单位名称</td>
</tr>
<tr>
    <td><input type=text value=01></td>
    <td><input type=text value=DW001></td>
    <td><input type=text value=微软公司></td>
</tr>
<tr>
    <td><input type=text value=02></td>
    <td><input type=text value=DW002></td>
    <td><input type=text value=英特公司></td>
</tr>
<tr>
    <td><input type=text value=03></td>
    <td><input type=text value=DW003></td>
    <td><input type=text value=中国公司></td>
</tr>
</table>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值