javascript - 根据元素属性更改背景颜色的更好方法
问题描述
我正在开发一个使用 Django、一些 JavaScript 和 Tachyons 的项目。我在模板文件中有以下内容:
<tbody class="lh-copy">
{% for alarm in alarm_list %}
<tr>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.agent.name }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.profile_name }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.is_active }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.created }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.message }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.alrmtype }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.acknowledged }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green {{ alarm.id }}-td">{{ alarm.is_hidden }}</td>
{% if alarm.is_active %}
<script language="javascript">
const alarmValElementList{{ alarm.id }} = document.getElementsByClassName("{{ alarm.id }}-td");
for (let i=0; i < alarmValElementList{{ alarm.id }}.length; i ++) {
alarmValElementList{{ alarm.id }}[i].classList.remove("bg-light-green");
alarmValElementList{{ alarm.id }}[i].classList.add("bg-light-red");
};
</script>
{% endif %}
</tr>
{% endfor %}
</tbody>
我正在从 alarm_list 访问元素警报,并使用模板“if”插入 JavaScript 代码,告诉 HTML 元素删除当前背景颜色并添加另一种。我不乐意使用 alarmValeElementList{{ alarm.id }} 作为动态变量名,但我想不出另一种方法来做到这一点。
有没有更好的方法来实现这一点?
预计到达时间:
我认为这看起来更好,因为它摆脱了动态变量名称:
<script language="javascript">
let alarmValElementList = [];
</script>
{% for alarm in alarm_list %}
<tr>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.agent.name }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.profile_name }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.is_active }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.created }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.message }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.alrmtype }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.acknowledged }}</td>
<td class="pv3 pr3 bb b--black-20 bg-light-green alarm-val-td">{{ alarm.is_hidden }}</td>
{% if alarm.is_active %}
<script language="javascript">
alarmValElementList = document.getElementsByClassName("alarm-val-td");
for (let i=0; i < alarmValElementList.length; i ++) {
alarmValElementList[i].classList.remove("bg-light-green");
alarmValElementList[i].classList.add("bg-light-red");
};
</script>
{% endif %}
</tr>
{% endfor %}
但是,我想知道是否没有更好的方法可以做到这一点?
解决方案
我可能会遗漏您正在尝试做的其他事情,但这会起作用吗?
{% for alarm in alarm_list %}
<tr>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.agent.name }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.profile_name }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.is_active }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.created }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.message }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.alrmtype }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.acknowledged }}</td>
<td class="pv3 pr3 bb b--black-20 {% if alarm.is_active %}bg-light-red{% else %} bg-light-green{% endif %} alarm-val-td">{{ alarm.is_hidden }}</td>
</tr>
{% endfor %}
我个人可能在警报模型上有一个属性,它设置颜色类,所以你可以说:
<td class="pv3 pr3 bb b--black-20 {{ alarm.css_class }} alarm-val-td">{{ alarm.agent.name }}</td>
编辑 如果您担心模板中太多 if 的难看的视觉效果(我会说没关系),您可以使用with 语句与yesno 过滤器相结合以获得更清晰的外观。我尚未对此进行测试,但以下内容可能适用于您的特定情况。如果您关心性能,我认为在一个“与”或多个“如果”之间几乎无所谓,您应该超时。我的赌注是多个 if,但是,'with' 在可维护性方面具有优势。
{% with tdalarm_cssclass=alarm.is_active|yesno:"bg-light-red,bg-light-green" %}
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.agent.name }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.profile_name }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.is_active }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.created }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.message }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.alrmtype }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.acknowledged }}</td>
<td class="pv3 pr3 bb b--black-20 {{ tdalarm_cssclass }} alarm-val-td">{{ alarm.is_hidden }}</td>
{% endwith %}
推荐阅读
- http - 带有 cloudflare 的 Heroku 子域“重定向太多”
- twitter-bootstrap - 引导网格不会并排放置
- reactjs - 使用 firebase 身份验证和电子邮件验证进行私有路由时遇到问题。如何修复这些路线?
- firebase - 如何部署依赖私有包的firebase云功能?
- javascript - 不显眼的客户端验证仅在集合中的第一个属性上触发
- spring - 如何使用 Spring boot 2.5.2 配置 500 错误页面,默认设置不起作用
- html - 我无法设置正确的图像尺寸
- javascript - 无法单击硒文本警报
- java - 为什么线程“Tomcat JDBC Pool Cleaner”中有异常?
- java - Runnable jar 不会使用 WindowListener 和方法 windowClosing 关闭