class
.。。。。。。
改为这个
#menu ul li a.current
这里的hasClass是用来判断元素是否有某个class的,只需要读取需要的值即可。而后面两个方法是用来操作(增加、删除)class的,是需要操作DOM,需要改变值的,所以会有赋值操作。
变量的命名没有特别的讲究,可以有自己的风格。通常变量名前面加下划线,表示这个变量是这个方法中的私有变量。
问题已解决。
<script> //根据类名获取元素 function getByClassName(obj,cls){ var ele=obj.getElementsByTagName('*'); var result=[]; for (var i=0;i<ele.length;i++){ if (ele[i].className==cls) { result.push(ele[i]); } // return result; } return result; } window.onload=function(){ var mem=document.getElementsByClassName('mem'); for (var i=0;i<mem.length;i++) { mem[i].onmouseover=function(){ this.style.border='2px solid #999'; } mem[i].onmouseout=function(){ this.style.border='1px solid #c2c2c2'; } } var img=document.getElementsByTagName('img'); for (var i=0;i<img.length;i++) { img[i].onmouseover=function(){ this.style.opacity='0.8'; } img[i].onmouseout=function(){ this.style.opacity='1'; } } function hasClass(obj,cls) { // return obj.ClassName.match(new RegExp("(\\s|^"+cls+"(\\s|$)")); return obj.className.match(new RegExp("(\\s|^)"+cls+"(\\s|$)")); } function removeClass(obj,cls) { // if (hasClass(obj.cls)) if(hasClass(obj,cls)) { // var reg=new RegExp("(\\s|^"+cls+"(\\s|$)"); var reg=new RegExp("(\\s|^)"+cls+"(\\s|$)"); // obj.ClassName=obj.replace(reg,""); obj.className=obj.className.replace(obj.className.match(reg)[0],""); } }; function addClass(obj,cls) { if (!hasClass(obj,cls)) { // obj.ClassName+= " "+cls; obj.className+= " "+cls; } } window.onscroll=function(){ var top=document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop; var menus=document.getElementById('menu').getElementsByTagName('a'); var pics=getByClassName(document.getElementById('pic'),'mem'); var currentId=""; for (var i=0;i<pics.length;i++) { var pic=pics[i]; var picTop=pic.offsetTop; if (top>picTop-200) { // currentId=pic.id; currentId="#"+pic.getAttribute("id"); } else { // break; return ; } if (currentId) { for (var j=0;j<menus.length;j++) { var menu=menus[j]; // var hre=menu.href.split('#'); var hre=menu.getAttribute("href"); // if (hre[hre.length-1]!=currentId) if(hre!=currentId) { // menu.removeClass(menu,"first"); removeClass(menu,"first"); } else {// menu.addClass(menu,"first"); addClass(menu,"first"); } } } } } } </script>
如果\s要加转义符 那|也应该加啊
可能是法二的top没有定义:var top;
你能把html代码也贴出来吗。。这很难看出问题啊。。
removeClass函数里的obj.className=obj.className.replace(req,"");
改成obj.className=obj.className.replace(reg,"");
if(currentId){
for(var j=0;j<menus.length;j++){
var _menu=menus[i];
中的var _menu=menus[i];
改成
var _menu=menus[j];
虽然晚了几年
在这个编码环境下是没有,如果有多个className,添加class, 要这样, links[j].className +=" "+ "link active"; 还有添加移除前都要判断是否已经存在 "link active"
1,getByClassName 里面的 var elements=document.getElementsByTagName('*');应该为var elements=obj.getElementsByTagName('*');
2,var top=document.documentElement?document.documentElement.scrollTop:document.body.scrollTop;改成var top=document.documentElement.scrollTop||document.body.scrollTop;
function getByClassName(obj,cls){
var elements=document.getElementsByTagName("*"); //把父元素下面所有的元素都获取到
var result=[];//返回的结果就是所有class=cla的数组
for(var i=0;i<elements.length;i++){
if(elements[i].className==cls){//如果有多个类的话,那么这个方法就不行了
result.push(elements[i]);
}
}
return result;
}
function hasClass(obj,cls){
return obj.className.match(new RegExp("(\\s|^)"+cls+"(\\s|$)"));//判断className里面是否包含我们传入的cls值
}
function removeClass(obj,cls){
if(hasClass(obj,cls)){
//remove
var reg=new RegExp("(\\s|^)"+cls+"(\\s|$)");
obj.className=obj.className.replace(reg,"");//把包含这个class的字符串替换成空
}
}
function addClass(obj,cls){
if(!hasClass(obj,cls)){
obj.className+=" "+cls;
}
}
//页面载入之后
window.onload=function(){
//监听滚动条事件
window.onscroll=function(){
//获取滚动条top值。
var top=document.documentElement.scrollTop||document.body.scrollTop;
var menus=document.getElementById("menu").getElementsByTagName("a");
var items=getByClassName(document.getElementById("content"),"item");
var currentId="";//获取当前滚动条所在楼层的Id
for(var i=0;i<items.length;i++){
var _item=items[i];
var _itemTop=_item.offsetTop;
console.log(_item.offsetTop);
if(top>_itemTop-200){
currentId=_item.id;
}else{
break;//跳出for循环
}
}
if(currentId){
//给正确的menu下的a元素class赋值。
for(var j=0;j<menus.length;j++){
var _menu=menus[j];//获取当前的menu
var _href=_menu.href.split("#");
if(_href[_href.length-1]!=currentId){
removeClass(_menu,"current");
}else{
addClass(_menu,"current");
}
}
}
}
}
这要匹配的元素可能有不止一个类<div id="item5" class="item" "item1">明白了么,这是全面的考虑 就算有空格也要能判断到
查一下有没有用到没有定义的方法 浏览器里F12看一下控制台报错
那是html5中才有的
好多错误啊!
var items = getByClassName("document.getElementById('content')",'item');
第一这里用了双引号括住导致变了字符串,所有getByClassName函数解释不到对象OBJ所以报错,
var _itemTop = _item.offSet;
这里获取了item的偏移值,但没获取偏移的高应该.offsetTop
if(currentId){
for (var j = 0; j < menus.length; j++) {
var _menu = menus[i];
var _href = _menu.href.split('#');
if(_href[_href.length-1] != currentId){
removeClass('_menu','current');
}else{
addClass('_menu','current');
}
}
}
这一段两处错误,变量值为j,你却引用了i,导致循环都没用的情况_menu获取不到对象,应该menu[j];
removeClass和addClass函数都用obj参数都用了单引号写成字符串 也是没对象
改为 var top=document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop;
哦,还有一个我最先改的,忘了说,
var top=document.documentElement?document.documentElement.scrollTop:document.body.scrollTop;
改成var top=document.documentElement。scrollTop?document.documentElement.scrollTop:document.body.scrollTop;
你再试下。。。
因为写错啦,正确的应该是var top = document.documentElement.scrollTop || document.body.scrollTop;
table布局的年代可视化编程确实挺好用,不过现在似乎敲代码都比拖拉控件快的多。因为有emmet插件~~~
喜欢可视化编程可以看下Unity开发,这可视化编程做得相当牛逼~~~
className js对大小写敏感
转义字符吧 \\代表一个反斜线字符''\'
对啊 讲到的什么都不带解释一下的,Tomcat是什么一脸懵逼
举例子 :
<div class="item1 item2"> </div>
上面是一个div,这个div的样式已经有两个,所以你再添加class的时候就需要加空格后再加入新的样式。
最后得到:
<div class="item1 item2 new"> </div>
http://www.cnblogs.com/light169/archive/2006/10/18/532347.html
不好意思,已经找到错误的~~
一个元素可以有很多不同的class,如果你直接使class为空,就相当于删除了元素所有的class,这样的话对于css和jQuery等需要用到class选择器的代码来说是很不利的。