html 里如何给循环添加的同 id 元素绑定同样的 js 脚本?

2020-02-06 19:58:55 +08:00
 Aeoluze

Flask 项目,在前端页面通过 Jinja2 模板的循环语句从列表中获取 object,并根据 object 的信息添加 div

{% for item in posts %}
<button type="button" class="btn btn-default" id="more_bt">      
</button>

<div id="content" class="content">
{{item.content|safe}}
</div>
{% endfor %}

现在的问题是希望在 div 中的<button>中绑定以下的 js 脚本,但是由于使用getElementById所以 js 只能获取第一个 id="more_bt"的<button>元素

  <script>
                    var btn = document.getElementById('more_bt');
                    var btn_less = document.getElementById('less_bt');
                    var obj = document.getElementById('content');
                    var total_height = obj.scrollHeight;//文章总高度
                    var show_height  = 20;//定义原始显示高度

                    if(total_height>show_height){
                        btn.style.display = 'block';
                        btn.onclick = function(){
                            obj.style.height = total_height + 'px';
                            btn.style.display = 'none';
                            btn_less.style.display = 'inline';
                        }
                        btn_less.onclick = function(){
                            obj.style.height =  show_height + 'px';
                            btn_less.style.display = 'none';
                            btn.style.display = 'inline';
                        }
                    }
                    </script> 

求解该如何将 js 脚本应用到循环添加的每个部件上

2462 次点击
所在节点    HTML
14 条回复
optional
2020-02-06 20:09:06 +08:00
理论上 id 是唯一的。
你这个把 id 改成 class,然后在父元素上委托一下就好,
ysc3839
2020-02-06 20:13:37 +08:00
id 应该是唯一的,你这种情况应该使用 class。
imn1
2020-02-06 20:20:36 +08:00
id 有相同的?
rekulas
2020-02-06 21:03:30 +08:00
已经 0202 年了,querySelectorAll 了解下
zhw2590582
2020-02-06 21:03:35 +08:00
id 相同其实没问题,浏览器照样解析,只是不合规范。
beastk
2020-02-06 21:12:32 +08:00
不改 class 的话,做个循环,功能绑定后改掉 id。
beastk
2020-02-06 21:13:54 +08:00
勘误,先绑定功能,浏览器会找到第一个 id,改掉,继续循环
randyo
2020-02-06 21:18:12 +08:00
id 重复不符合规范,你永远不知道哪个浏览器下就出 bug
Aeoluze
2020-02-06 21:31:22 +08:00
@beastk
@optional
@ysc3839
@rekulas
按钮对应的 js 的功能是比较所属 div 的 content 元素高度与预设高度的大小,实现点击展开省略文本的功能,如果不用对应的 id 的话该如何修改指定的 content 元素属性呢?
randyo
2020-02-06 21:35:07 +08:00
看你代码,紧跟按钮的那个元素就是指定的 content
beastk
2020-02-06 22:58:58 +08:00
$(.classname)
oatw
2020-02-06 23:20:44 +08:00
好奇为啥没人提一下 event delegation
ysc3839
2020-02-07 03:46:39 +08:00
@Aeoluze this.nextElementSibling 就能获取到下一个同级的元素了。
另外,“点击展开省略文本”可以用 css max-height 之类实现吧?也不需要比较高度呀。
mostkia
2020-09-26 18:40:04 +08:00
按钮数量如果多的话,事件委托才是正道

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX