【问题标题】:Apply style by javascript without using Id通过 javascript 应用样式而不使用 Id
【发布时间】:2012-08-05 06:16:08
【问题描述】:

我的html页面内容如下

<div>
    <div>
        Summary 1
    </div>
    <div style="display:none">
        Details 1
    </div>
    <button>Read More</button>
</div>

详细信息内容最初是折叠的。当用户单击阅读更多按钮时,我需要显示详细信息内容。我可以让它成为可能。我将为详细信息 div 标签定义 id,为按钮的 onclick 事件定义 javascript。使用 id 我将更改 div 样式显示。

但我有多个基于后端数据的部分列表。所以我的页面会呈现如下

<div>
    <div>
        Summary 1
    </div>
    <div style="display:none">
        Details 1
    </div>
    <button>Read More</button>
</div>

<div>
    <div>
        Summary 2
    </div>
    <div style="display:none">
        Details 2
    </div>
    <button>Read More</button>
</div>

<div>
    <div>
        Summary 3
    </div>
    <div style="display:none">
        Details 3
    </div>
    <button>Read More</button>
</div>

现在我如何在单击阅读更多按钮时实现展开和折叠功能。

【问题讨论】:

  • 你用的是jQuery还是纯javascript?
  • 不,我没有使用 jQuery

标签: javascript html css


【解决方案1】:

使用纯 javascript 并战略性地添加一些类,您可以这样做,这将使每个按钮变成一个切换,甚至可以根据切换状态更改其文本。然后,一段 javascript 将服务于该结构的所有重复实例,并且代码将独立于摘要、详细信息和按钮的确切 HTML 布局(只要它们保留相同的类并位于相同的容器 div 中)。

HTML:

<div>
    <div>
        Summary 1
    </div>
    <div class="details" style="display:none">
        Details 1
    </div>
    <button class="readMore">Read More</button>
</div>

<div>
    <div>
        Summary 2
    </div>
    <div class="details" style="display:none">
        Details 2
    </div>
    <button class="readMore">Read More</button>
</div>

<div>
    <div>
        Summary 3
    </div>
    <div class="details" style="display:none">
        Details 3
    </div>
    <button class="readMore">Read More</button>
</div>​

还有 javascript:

function toggleVis(el) {
    var vis = el.style.display != "none";
    if (vis) {
        el.style.display = "none";
    } else {
        el.style.display = "block";
    }
    return(!vis);
}

(function() {
    var readMore = document.getElementsByClassName("readMore");
    for (var i = 0; i < readMore.length; i++) {
        readMore[i].onclick = function(e) {
            var vis = toggleVis(e.target.parentNode.getElementsByClassName("details")[0]);
            e.target.innerHTML = vis ? "Read Less" : "Read More";
        }
    }
})();            

工作演示:http://jsfiddle.net/jfriend00/aMBkJ/

注意:在旧版本的 IE 上,getElementsByClassName() 需要 a shim。 ​

【讨论】:

  • +1 用于非 jQuery 问题中唯一的非 jQuery 解决方案。据推测,使用.getElementsByTagName() 可以让您实现几乎相同的事情,而无需更改 html 标记,但显然这会将 JS 代码更紧密地绑定到特定的 html 结构。
  • @nnnnnn - 是的,我不喜欢编写对 HTML 中的微小更改很脆弱的 javascript。我认为 OP 想要避免使用 ID,因为它们具有重复的结构,但类应该是正确的工具(至少这是我推荐的)。
  • @nnnnnn:你为什么投反对票?我只是建议 OP jQuery 解决方案,而不是强迫他使用它。
【解决方案2】:

使用 jQuery .prev() 可以轻松实现。

$('button').on('click', function(e){
   $(this).prev('div').toggle();
});

DEMO

【讨论】:

  • @nnnnnn:你为什么投反对票?我只是建议 OP jQuery 解决方案,而不是强迫他使用它。
  • 关于 SO 的一般约定是,除非 OP 提到 jQuery,标记为 jQuery,否则您不提供 jQuery 答案,问题已经显示 jQuery 或者您询问并且 OP 说他们感兴趣在 jQuery 中。 jQuery 人们往往会忘记它并不是在每个项目中都使用的。
  • I've never downvoted on any question or answer. 为什么你认为是这里的“罪魁祸首”?我喜欢 jQuery,但我不建议仅仅为了实现一个没有它就可以轻松完成的功能而包含整个库。
  • @jfriend00:是的,很好,但建议某人另一个更容易的选择,这不是一个错误。
  • 问题是我们有一个问题,它有零指示 OP 想要一个 jQuery 解决方案,我们得到了四个由 jQuery 提出的答案。如果我们也有一堆提出 YUI 和 Prototype.js 以及 MooTools 和 Dojo 解决方案的答案怎么办?这将是一团糟。 IMO,除非OP指示了库,否则答案应坚持使用纯javascript。在这种特殊情况下,询问了有关 jQuery 的问题,并且 OP 一直是 AWOL(没有回答澄清的呼吁)。
【解决方案3】:

你可以用 jquery 试试这个

<button class="readmore">Read More</button>

jQuery

$('.readmore').click(function(){
   $(this).prev().show();
});

【讨论】:

    【解决方案4】:

    这是使用 jquery 的方法:

    HTML 代码:

    <div class="stuff">
    <dl id="faq">
        <dt>What shouldn't I do to the bird?</dt>
        <dd>Never try to treat a fracture at home.</dd>
    </div>
    

    jQuery 代码:

    jQuery(document).ready(function() {
    $('#faq').find('dd').hide().end().find('dt').click(function(){
           $(this).next().slideToggle();
       });
    });
    

    【讨论】:

    • OP 没有提到 jQuery,还明确要求提供不使用 ids 的解决方案,但即使忽略这些问题,为什么还要发明一个完全不同的 html 结构来演示?
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2010-10-15
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多