图1
下面先来实现View。先看看如下的代码:
numberKeys.html !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" html head title/title meta http-equiv="Content-Type" content="text/html; charset=UTF-8" link rel="stylesheet" type="text/css" href="my.css"/ script type="text/javascript" src="addevents.js" /script /head body input id ="changeColor" type="button" value="开始变换颜色" / br/br/ div id ="nubmerKeys" class="numberKeys" /div br/br/ br/br/ input id="numbers" type="text" size="80"/ /body /html
从上面的代码可以看出,除了一些html代码外,没有任何和业务逻辑有关的javascript代码。但使用script引用了一个叫addevents.js的文件。在这个文件中将为这个程序添加相应的逻辑代码,也就是说,这个文件相当于MVC中的M和C。
动作装载事件是通过window的onload事件完成的,代码如下:
window.onload = onLoad; // 为onload指定事件函数function onLoad(){ var text = document.getElementById("numbers"); if(text) { text.onkeyup = onKeyup; // 为文本框指定onkeyup事件 } var button = document.getElementById("changeColor"); if(button) { button.onclick = stopAndStartTimer; // 为按钮指定onclick事件 } addButton(); // 用于在div中加入10个div标签作为小方块,并指定onclick事件}
下面先来看一下addButton函数是如何实现的,代码如下:
function addButton(){ var div = getNumberKeysDiv(); // 获得id为nubmerKeys的div标签 try { if(div) { // 删除div中的所有子元素 for(var i = div.childNodes.length - 1; i = 0; i--) { try { div.removeChild(div.childNodes[i]); } catch(e) { } } // 为div标签加10个子div标签 for(var i = 0; i 10; i++) { var button = document.createElement("div"); button.className = "button"; button.style.left = i * 61 + "px"; button.style.backgroundColor = getRandomColor(); button.style.border="solid 1px"; button.style.textAlign = "center"; button.style.lineHeight = "50px"; button.style.color = getRandomColor(); button.onclick = buttonOnClick; div.appendChild(button); button.innerHTML ="b" +i + "/b"; } } } catch(e) { } }
addButton函数的基本实现原理是先将div中的所有元素删除,再向其中加入10个div标签。在addButton函数中有几个关键的函数需要讲解一下。
getNumberKeysDiv函数
这个函数用于获得叫numberKeys的div标签,实现代码如下:
function getNumberKeysDiv(){ var divs = document.getElementsByTagName("div"); if(divs) { for(var i = 0; i divs.length; i++) { var div = divs[i]; if(div.className.toString().indexOf("numberKeys", 0) -1) { return div; } } }}
这个函数并不是直接通过div的id找到这个div,而是通过div的class属性,这样可能更灵活,因为如果通过id找div,就必须要求美工必须将这个div命名为numberKeys,而如果通过查找包含numberKeys的class属性的div会对美工的限制更少。因为,只有这个div才会使用css中的numberKeys。
getRandomColor方法
这个方法获得了一个随机的演示,返回了字符串类型,格式#FFFFFF。实现代码如下:
function getRandomArbitary(min, max){ return Math.round(Math.random() * (max - min) + min);}function getRandomColor(){ var red = getRandomArbitary(0, 255).toString(16); var green = getRandomArbitary(0, 255).toString(16); var blue = getRandomArbitary(0, 255).toString(16); if(red.length == 1) red = "0" + red; if(green.length == 1) green = "0" + green; if(blue.length == 1) blue = "0" + blue; return "#" + red.toString(16) + green.toString(16) + blue.toString(16);}
getRandomColor通过getRandomArbitary函数获得了三个十进制的随机数(0-255),并将其转换为16进制,并返回最终结果。
buttonOnClick函数
这个函数是div标签的onclick事件函数,实现代码如下:
function buttonOnClick(){ var text = document.getElementById("numbers"); if(typeof this.innerText == "#ff0000") text.value = text.value + this.textContent; else text.value = text.value + this.innerText; this.style.backgroundColor = getRandomColor(); this.style.color = getRandomColor();}
这个函数实现很简单,它的功能是将相应div标签中的数字追加到numbers文本框中。只是考虑了firefox和ie的不同。在firefox中,获得div中的文本要使用textContext,而在ie中要使用innerText。最后再将当前点击的div和数字的颜色再次变换。
到现在为止,还有两个事件函数代码没有给出,这两个事件函数是onKeyup和stopAndStartTimer。
onKeyup函数
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)当numbers文本框输入一个字符后,发生这个事件,实现代码如下:
function onKeyup(){ var value = this.value; if(value.length == 0) return; var i = value.toString().substr(value.length - 1, 1); if(isNaN(i) == false) { var div = getNumberKeysDiv(); if(div) { var button = div.childNodes[i]; button.style.backgroundColor = getRandomColor(); button.style.color = getRandomColor(); } }}
这个函数的实现代码也很简单。只是根据用户在文本框中输入的数字来找到相应的div标签,并再次随机变换div背景和数字的颜色。
stopAndStartTimer函数
这个函数是用来控制定时器的,如果启动定时器,浏览器会每隔3秒重新使div随机变化一次颜色。实现代码如下:
var time;function stopAndStartTimer(){ if(this.value.toString().indexOf("停止",0) -1) { this.value = "开始变换颜色"; clearInterval(time); } else { this.value = "停止变换颜色"; time = setInterval(onLoad, 3000); }}
从上面给出的代码可以看出,在View层,除了script引用了一个javascript文件外,并未涉及任何和逻辑有关的代码。而设计界面的美工也并不知道开发人员会为div及其他的按钮和文本框添加什么动作。而美工要做的是调整和界面有关的东西,如颜色,位置,分割等。只要使用script引用了这个js文件,就可以很容易加入相应的动作,而要将这些动作去掉,删除或注释掉这个script标签即可。
尤其要提一下div标签,美工在设计界面时可以向这个div标签添加任何子元素。而在加入addevents.js后,程序会自动将由美工向div标签中的加入的内容都删除,而加入由业务逻辑需要的元素。这样美工用来设计界面的元素就不会影响开发人员需要加入的和业务逻辑有关的元素了。
根据上面的代码不难看出,numberKeys.html属于视图层,所有的事件函数属性模型层,而其他的javascript代码都属性控制器(Controller)。
文章 猜你喜欢