慕村8974351
class
AllenPeng
.。。。。。。
慕仙5237505
改为这个
#menu ul li a.current
慕仙5237505
这里的hasClass是用来判断元素是否有某个class的,只需要读取需要的值即可。而后面两个方法是用来操作(增加、删除)class的,是需要操作DOM,需要改变值的,所以会有赋值操作。
变量的命名没有特别的讲究,可以有自己的风格。通常变量名前面加下划线,表示这个变量是这个方法中的私有变量。
小白亭
问题已解决。
慕用9244143
<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>
百兽凯多00
如果\s要加转义符 那|也应该加啊
慕粉18221508921
可能是法二的top没有定义:var top;
野生前端菜鸟
你能把html代码也贴出来吗。。这很难看出问题啊。。
慕粉3988711
慕仙4324424
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];
虽然晚了几年
幕布斯7328391
在这个编码环境下是没有,如果有多个className,添加class, 要这样, links[j].className +=" "+ "link active"; 还有添加移除前都要判断是否已经存在 "link active"
LanceChou
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;
慕粉3197089
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");
}
}
}
}
}
慕桂英9545975
这要匹配的元素可能有不止一个类<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;
你再试下。。。
STRONG很壮不怕撞
因为写错啦,正确的应该是var top = document.documentElement.scrollTop || document.body.scrollTop;
marshall_stan
小茗童鞋
table布局的年代可视化编程确实挺好用,不过现在似乎敲代码都比拖拉控件快的多。因为有emmet插件~~~
喜欢可视化编程可以看下Unity开发,这可视化编程做得相当牛逼~~~
梦身
className js对大小写敏感
celceta
转义字符吧 \\代表一个反斜线字符''\'
程序爱好者11
对啊 讲到的什么都不带解释一下的,Tomcat是什么一脸懵逼
qq_星空下的幻想_0
举例子 :
<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
shandy谜
不好意思,已经找到错误的~~
回夢
一个元素可以有很多不同的class,如果你直接使class为空,就相当于删除了元素所有的class,这样的话对于css和jQuery等需要用到class选择器的代码来说是很不利的。