麻烦看看这段 javascript 啥问题

软件和网站开发以及相关技术探讨
回复
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

麻烦看看这段 javascript 啥问题

#1

帖子 huangjiahua » 2008-01-20 10:17

好困,有些迷糊

代码: 全选

// getElementsByClassName
document.getElementsByClassName = function(className,oBox) {
	this.d= oBox || document;
	var children = this.d.getElementsByTagName('*') || document.all;
	var elements = new Array();
	for (var ii = 0; ii < children.length; ii++) {
		var child = children[ii];
		var classNames = child.className.split(' ');
		for (var j = 0; j < classNames.length; j++) {
			if (classNames[j] == className) {
				elements.push(child);
				break;
			}
		}
	}
	return elements;
}

// tabBox function
function dotabBox(){
	var tabBoxs = document.getElementsByClassName('tabBox');
	for (i = 0; i < tabBoxs.length; i++) {
		tag = tabBoxs[i];
		tag.value = 0;
		lis = document.getElementsByClassName('tabTitle', tag);
		tabs = document.getElementsByClassName('tabBody', tag);
		lilen = lis.length;
        //alert(lilen);
		for (t = 0; t < lis.length; t++) {
			li = lis[t];
			li.value = t;
			tab = tabs[t];
			tab.style.display = 'none';
			li.onmouseover=function(){changeTab(this, this.value, tabs, lis)}; //这行怎么回事?
		}
		ndiv = document.createElement('nbBox');
		ndiv.style.display = 'block'	;
		ndiv.className = 'tabView';
		tag.appendChild(ndiv);
		tag.value = 0;
		changeTab(li, 0, tabs, lis);
	}
}
function changeTab(tab, v, tabs, lis){
	lis[tab.parentNode.value].className = 'tabTitle';
	lis[v].className = 'tabTitleC';
	tab.parentNode.value = v;
	box = tab.parentNode.getElementsByTagName('nbBox')[0];
	box.innerHTML = tabs[v].innerHTML;		
}

// add onload Event
if (document.all){
 window.attachEvent('onload',dotabBox)//IE
}
else{
 window.addEventListener('load',dotabBox,false);//firefox
}
跃过无数的时间断层,只为了在
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

#2

帖子 huangjiahua » 2008-01-20 10:55

谢谢学费的详细解答
(10时40分23秒) Xuefer: lis/tabs 不对是吧?

(10时40分53秒) Xuefer: (function (tabs,lis) {

li.onmouseover=function(){ changeTab(this, this.value, tabs, lis) }

})(tabs, lis);
(10时40分55秒) Xuefer: 用这个
(10时41分16秒) Xuefer: 百年老药方 一用就见效
(10时44分33秒) Xuefer: 你抄错了
10:45
(10时45分00秒) Xuefer: 你的写法是调用了一个匿名函数, 里面又调用了changeTab
(10时45分15秒) Xuefer: 没有return所以默认return undefined
(10时45分24秒) Xuefer: 返回之后赋值给 onmouseover

(10时45分54秒) Xuefer: 我那个写法是每次循环到这里就调用匿名函数
(10时46分17秒) Xuefer: 进去里面之后, 值已经被拷贝了一份, 对于参数本身来说是个新的拷贝, 也就是新的"引用"
(10时46分26秒) Xuefer: 每个变量对自己都是一个隐含的引用
(10时46分50秒) Xuefer: 只不过普通变量一般拷贝值不拷贝引用罢了

(10时47分14秒) Xuefer: 进去里面之后再 onmouseover=... 匿名函数, 就自然是另一份tabs/lis跟外面无关
(10时47分20秒) Xuefer: 下一次再来又是另外一份
(10时47分49秒) Xuefer: 不用函数 简单用 { var abc = tabs .. 应该不行
(10时48分07秒) Xuefer: js 变量只有 global/function scope, 没有 block scope

(10时48分52秒) Xuefer: var abc = tabs 靠背之后abc跟tabs的确不是同一个玩意, 但是下一次循环 abc还是那个abc

(10时51分08秒) Xuefer: 好. 这个比较 closure
(10时51分27秒) Xuefer: 跟例外的 this 是相反的
(10时51分36秒) Xuefer: 这些都搞懂之后就甚至能猜到他内部是怎么实现这个玩意了
(10时51分56秒) Xuefer: 最近 php 也在讨论增加这方面的功能, 已经有人写 patch 还说了原理 果然跟我想的一样
跃过无数的时间断层,只为了在
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15
送出感谢: 0
接收感谢: 0

#3

帖子 iblicf » 2008-01-20 11:03

我不懂 java ,:) jscript 为什么要用 Hungary 命名法
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

#4

帖子 huangjiahua » 2008-01-20 11:19

1. 已经有大师给了详细解答
要点是 js 变量只有 global/function scope, 没有 block scope ,
想 block scope 的效果可以再用匿名函数

2. javascript 不是 java
3. 这不是匈牙利
跃过无数的时间断层,只为了在
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15
送出感谢: 0
接收感谢: 0

#5

帖子 iblicf » 2008-01-20 11:21

谢谢黄大师的解答 :)
头像
qlhn
帖子: 736
注册时间: 2006-08-25 10:37
送出感谢: 0
接收感谢: 0
联系:

#6

帖子 qlhn » 2008-02-12 14:12

点燃一支蜡烛,而不是诅咒黑夜

对这句话表示支持!
头像
greco
帖子: 2487
注册时间: 2007-04-06 10:24
来自: ~/Shanghai
送出感谢: 0
接收感谢: 0

#7

帖子 greco » 2008-02-19 11:04

建议楼主以后用Firebug调试,一看便知~~~~~~
http://silenceisdefeat.com/~greco

代码: 全选

''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d
回复

回到 “软件/网站开发”