【问题标题】:Javascript show/hid div and change a css class based on which div is visible?Javascript显示/隐藏div并根据哪个div可见更改css类?
【发布时间】:2011-01-20 06:51:01
【问题描述】:

我有一小段 javascript 可以根据单击列表中的哪个链接来显示/隐藏 div。它不是很优雅,但效果很好。我想做的是根据显示的 div 为列表项分配活动状态。这是我的 JS 和 HTML:

var ids=new Array('section1','section2','section3','section4');

function switchid(id){  
    hideallids();
    showdiv(id);
}

function hideallids(){
    //loop through the array and hide each element by id
    for (var i=0;i<ids.length;i++){
        hidediv(ids[i]);
    }         
}

function hidediv(id) {
    //safe function to hide an element with a specified id
        document.getElementById(id).style.display = 'none';
}

function showdiv(id) {
    //safe function to show an element with a specified id        
        document.getElementById(id).style.display = 'block';
}

html:

<ul>
<li class="activeItem"><a href="javascript:switchid('section1');">One</a></li>
<li><a href="javascript:switchid('section2');">Two</a></li>
<li><a href="javascript:switchid('section3');">Three</a></li>
<li><a href="javascript:switchid('section4');">Four</a></li>
</ul>

<div id="section1" style="display:block;">1111111</div>
<div id="section2" style="display:none;">2222222</div>
<div id="section3" style="display:none;">3333333</div>
<div id="section4" style="display:none;">4444444</div>

当点击第 2 部分(或任何一个)时,我希望将“activeItem”类从它当前所在的 li 中删除并应用于当前 li。这可以用javascript吗?我认为是,但我无法弄清楚如何在客户端实现它。

谢谢!

【问题讨论】:

  • 我想你的意思是:“...我希望将“activeItem”类从它当前所在的 li 中删除并应用于当前 LI”而不是 div

标签: javascript css class onclick


【解决方案1】:

如果你能够使用 jQuery(或类似的东西),因为它内置了这个功能:http://docs.jquery.com/Attributes - addClass/removeClass

【讨论】:

  • ...$('#myDiv').hide() / $('#myDiv').show() 也消除了您的功能。
  • 我同意。另一个选择是 Mootools (mootools.net/docs/core),它也可以通过 addClass 和 removeClass 轻松实现此目的。 2010年了,不用从头写JS了。
  • 这是我的担忧...如果我可以用普通的 JS 编写这个需要 15 行代码,而用 jQuery 只写一半,我会不会还是更好JS 只是因为我不必引用 jQuery 代码库。换句话说,如果我不做任何花哨的事情,使用jQuery不会对客户端来说更重吗?
  • 压缩后的 jQuery 为 24kb,所以没有多大的成功。一些阅读,smashingmagazine.com/2010/02/22/… - 特别是浏览器特定的代码以及与其他脚本的配合。
  • 公平点。我还阅读了有关链接到 google 的 jQuery 代码库而不是将文件托管在您自己的服务器上的信息。似乎很多人已经从谷歌缓存了它。感谢您的链接。
【解决方案2】:

更改您的锚点以使用 onclick 事件而不是 href javascript 代码。

<a onclick="switchid('section1');return false;">One</a>

然后将参数 this 传递给您的 switchid 函数。 this 是一个 javascript 关键字,在这种情况下指的是元素 (a)。

<a onclick="switchid('section1', this);return false;">One</a>

现在让switchid 函数修改列表。

function switchid(id, el){  
    hideallids();
    showdiv(id);

    // rejiggered for text nodes
    var li = el.parentNode.parentNode.childNodes[0];
    while (li) {
        if (!li.tagName || li.tagName.toLowerCase() != "li")
            li = li.nextSibling; // skip the text node
        if (li) {
            li.className = "";
            li = li.nextSibling;
        }
    }

    el.parentNode.className = "activeItem";
}

试试看:http://jsbin.com/esazu3/edit

【讨论】:

  • 乔尔 - 这很好用!谢谢你的帮助。看起来链接示例的顶部有一个空函数和对 jquery 的引用。您的示例似乎在删除函数并且没有指向 jquery 的链接的情况下工作正常。想知道用 jQuery 做这个是否会更好。你怎么看?我想它可以用更少的代码来完成,但是浏览器必须再次加载所有的 jQuery 代码库,对吧?我不精通Javascript,所以请原谅我的无知。再次感谢!
  • 默认情况下那些 jquery 引用就在其中。这段代码不需要它们。 Jquery 会稍微简化你的任务,但我不建议你学习 jquery,除非你觉得你已经很好地掌握了 javascript 的基础。无需成为 js 专家,只需了解事件、json 以及异步与同步的基础知识。然后去学习jquery。我数不清有多少次我听到有人问如何在 jquery 中执行一个在普通 javascript 中非常简单的任务。
  • 嘿乔尔,有没有一种简单的方法可以让链接打开这些选项卡之一?我正在尝试设置从另一个页面到特定选项卡的链接。我猜想可以通过将某些内容传递给查询字符串来实现,但我只是不知道。我在这里问过这个问题:stackoverflow.com/questions/2321932/…
  • 抱歉,链接错误:stackoverflow.com/questions/2740753/…
  • @hollyb。是的,有可能。在这里查看尼克的答案:stackoverflow.com/questions/2740377/…(减去 jquery)。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多