提问人:DeeCodz 提问时间:12/13/2022 最后编辑:DeeCodz 更新时间:12/16/2022 访问量:98
我在jQuery中有多个if/if else来向我显示页面上的不同类,但它无法正常工作
I have multiple if/if else in jQuery to show me different classes on a page and its not working properly
问:
我有一个简单的 HTML 页面,其中包含不同的元素,由于之前选择了某些选项,这些元素被隐藏或显示。
我有不同的选项(单选按钮),必须先单击它们,它们应该控制和隐藏或显示元素:
- 家庭或非家庭(家庭 = 1,家庭 = 2)
- Household 或 Nohousehold 和 Monument(Monument = 1 或 2)
- 家庭和纪念碑
- 无户
- Nohousehold 和 Zones(区域 = 1 或 2)
- Nohousehold 和 Monument
- Nohousehold and Zones and Monument
我在上面的数字之后调用了 html 上的 div 类(例如:1 = class1,2 = class2,..依此类推),通过从上面的选项中进行选择,每个类都应该可见。这是我edit_outerwalls.jsp,包含在 edit.jsp 中。
<div class="class1"> //This should be displayed only if Household = 1 or 2
...
</div>
<div class="class2"> //This should be displayed only if Household = 1 or 2 and Monument = 1
...
</div>
<div class="class3"> //This should be displayed only if Household = 1 and Monument = 1
...
</div>
<div class="class4"> //This should be displayed only if Household = 2
...
</div>
<div class="class5"> //This should be displayed only if Household = 2 and Zones = 1
...
</div>
<div class="class6"> //This should be displayed only if Household = 2 and Monument = 1
...
</div>
<div class="class7"> //This should be displayed only if Household = 2 and Zones = 1 and Monument = 1
...
</div>
<div class="class2">
...
</div>
<div class="class5">
...
</div>
我的jQuery代码如下所示:
function checkClass1234() {
let household = $('input:radio[name="household"]:checked').val(); //this are the radiobuttons on the html page
let zones = $('input:radio[name="zones"]:checked').val();
let monument = $('input:radio[name="monument"]:checked').val();
if (household === '1' || household === '2') {
$('.class1').show();
} else if ((household === '1' || household === '2') && (monument === '1')) {
$('.class2').show();
} else {
$('.class1').hide();
clearValues('.class1');
$('.class2').hide();
clearValues('.class2');
}
if (household === '1' && monument === '1') {
$('.class3').show();
$('.class2').hide();
clearValues('.class2');
} else {
$('.class3').hide();
clearValues('.class3');
}
if (household === '2') {
$('.class4').show();
$('.class3').hide();
clearValues('.class3');
} else {
$('.class4').hide();
clearValues('.class4');
}
if (household === '2' && zones === '1' && monument === '1') {
$('.class7').show();
$('.class2').hide();
clearValues('.class2');
$('.class3').hide();
clearValues('.class3');
} else if (household === '2' && monument === '1') {
$('.class6').show();
$('.class2').hide();
clearValues('.class2');
$('.class3').hide();
clearValues('.class3');
} else if (household === '2' && zones === '1') {
$('.class5').show();
$('.class2').hide();
clearValues('.class2');
$('.class3').hide();
clearValues('.class3');
} else {
$('.class4').hide();
clearValues('.class4');
$('.class5').hide();
clearValues('.class5');
$('.class6').hide();
clearValues('.class6');
$('.class7').hide();
clearValues('.class7');
}
}
我的编辑.jsp看起来像这样(在这里我包括我所有的页面):
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<jsp:directive.include file="/WEB-INF/sitemesh-decorators/include.jsp"/>
<fmt:setBundle basename="bundles.${orderName}-resources"/>
<c:set var="order" value="${order}" scope="request"/>
<head>
<!-- All Scripts -->
</head>
<jsp:include page="/WEB-INF/jspf/crumb1to4/edit.jsp"/>
<section id="content">
<header>
<h1><fmt:message key="title"/></h1>
<h3>
<fmt:bundle basename="bundles.household-resources">
<fmt:message key="title.comment"/>
</fmt:bundle>
</h3>
</header>
<jsp:include page="/WEB-INF/jspf/edit/mandatory.jsp"/>
<spring:url var="attachmentsUrl" value="/${orderName}/attachments"/>
<form:form method="post" modelAttribute="order" action="${attachmentsUrl}">
<jsp:include page="/WEB-INF/jspf/edit/errors.jsp"/>
<jsp:include page="edit_consultant.jsp"/>
<jsp:include page="edit_household.jsp"/>
<fieldset>
<fmt:bundle basename="bundles.order-resources">
<legend>
<jsp:include page="/WEB-INF/jspf/edit_elem/checkbox.jsp">
<jsp:param name="label" value="caption.buildingshell"/>
<jsp:param name="field" value="buildingshell"/>
<jsp:param name="bundle" value="order"/>
<jsp:param name="tooltip" value="buildingshell.info"/>
</jsp:include>
</legend>
<div id="blockBuildingshell">
<div class="haupttext">
<fmt:message key="buildingshell.comment"/>
</div>
<jsp:include page="edit_outerwalls.jsp"/> <!-- In here i have all the elements with class1, class2, class3... -->
</div>
</fmt:bundle>
</fieldset>
<jsp:include page="edit_machines.jsp"/>
<!-- ...Another Included JSP Pages... -->
<!-- include next button -->
<jsp:include page="/WEB-INF/jspf/edit/next2.jsp">
<jsp:param name="next">
<jsp:attribute name="value">
<fmt:message key="next.comment"/>
</jsp:attribute>
</jsp:param>
</jsp:include>
</form:form>
</section>
我的家庭 .jsp 看起来像这样(这里是 3 个单选按钮):
<%@ page pageEncoding="UTF-8" %>
<jsp:directive.include file="/WEB-INF/sitemesh-decorators/include.jsp"/>
<fmt:bundle basename="bundles.order-resources">
<!-- Household -->
<fieldset>
<legend>
<fmt:message key="caption.household"/>
</legend>
<div class="formclear"></div>
<h3>
<fmt:message key="caption.location"/>
</h3>
<div class="label">
<form:label path="household.type">
<fmt:message key="household.type"/>
</form:label>
<span class="formAsterics">*</span>
<jsp:include page="/WEB-INF/jspf/edit/tooltip.jsp">
<jsp:param name="tooltip" value="household.type.tooltip"/>
<jsp:param name="bundle" value="order"/>
</jsp:include>
</div>
<div class="field fieldRadio">
<form:radiobutton path="household.type" value="1"/>
<fmt:message key="household.type1"/>
<form:radiobutton path="household.type" value="2"/>
<fmt:message key="household.type2"/>
<form:errors path="household.type" cssClass="error"/>
</div>
<div class="formclear"></div>
<div class="blockNohousehold">
<!-- household.zones -->
<jsp:include page="/WEB-INF/jspf/edit_elem/radio_yes_no.jsp">
<jsp:param name="label" value="household.zones"/>
<jsp:param name="field" value="household.zones"/>
<jsp:param name="bundle" value="order"/>
<jsp:param name="mandatory" value="true"/>
</jsp:include>
</div>
<div id="blockMonument">
<!-- household.monument -->
<div class="label">
<form:label path="household.monument">
<span class="blockHousehold"><fmt:message key="household.monument1"/></span>
<span class="blockNohousehold"><fmt:message key="household.monument2"/></span>
<span class="formAsterics">*</span>
</form:label>
</div>
<div class="field fieldRadio">
<fmt:bundle basename="bundles.application-resources">
<form:radiobutton path="household.monument" cssClass="inputCheck" value="1"/>
<fmt:message key="yes"/>
<form:radiobutton path="household.monument" cssClass="inputCheck" value="0"/>
<fmt:message key="no"/>
</fmt:bundle>
<form:errors path="household.monument" cssClass="error"/>
</div>
<div class="formclear"></div>
</div>
</fieldset>
</fmt:bundle>
和上次一样,这是我的DTO对象家庭.java:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Household implements Serializable {
@Range(min = 1, max = 2)
private Integer type;
@Range(min = 0, max = 1)
private Integer zones;
@Range(min = 0, max = 1)
private Integer monument;
}
对不起我的英语,对不起,如果我的问题中缺少什么,请告诉我! 谢谢!
我的问题是,当我第一次选择选项时,除了 class7 之外,它工作得很好。当我更改所选选项或仅切换一个选项时,什么也没发生。它看起来像是冻结的。我尝试了不同的方法来对 if 进行排序,但这是迄今为止最好的结果。我是jQuery的新手,我将不胜感激有人的帮助!:)
答:
检查下面的示例代码以显示和隐藏元素。
<div class="class1" > Household
...
</div>
<input type="checkbox" onclick="checkClass1234()" id="household" name="vehicle1" value="1" >
<label> Hide & Show Household</label><br>
<script>
function checkClass1234() {
var rate_value;
if (document.getElementById('household').checked) {
rate_value = document.getElementById('household').value;
if(rate_value != "undefined"){
document.getElementsByClassName('class1')[0].style.display = 'none';
}
}else{
document.getElementsByClassName('class1')[0].style.display = 'block';
}
}
</script>
这是使用最少代码完成此操作的一种方法。但它要求在额外属性中按元素完成可见性设置。此属性包含一个字符串,最多包含三个字符,每个字符对应 和 的单选按钮。在循环中逐个检查字符:如果 -th 单选按钮值必须为非零,如果不需要任何内容,如果是其他任何值,则 -th 单选按钮的值必须完全匹配。data-show
household
monument
zones
.every()
v=="x"
i
v=="-"
v
i
const toggledivs = document.querySelectorAll("[data-show]");
const RBs = [ frm.household, frm.monument, frm.zones ];
toggledivs.forEach(d=>d.style.display="none");
document.body.onclick = ev => {
if (ev.target.tagName == "INPUT")
toggledivs.forEach(d=>d.style.display=d.dataset.show.split("").every((v,i)=>v=="-"||(v=="x"&&RBs[i].value>0)||v==RBs[i].value) ? "" : "none" )
}
<form name="frm">
<fieldset><label><input type="radio" name="household" value="0" checked>0</label>
<label><input type="radio" name="household" value="1">1</label><label><input type="radio" name="household" value="2">2</label> Household</fieldset>
<fieldset><label><input type="radio" name="monument" value="0" checked>0</label>
<label><input type="radio" name="monument" value="1">1</label> Monument</fieldset>
<fieldset><label><input type="radio" name="zones" value="0" checked>0</label>
<label><input type="radio" name="zones" value="1">1</label> Zones</fieldset>
</form>
<div class="class1" data-show="x">1 //This should be displayed only if Household = 1 or 2 ...
</div>
<div class="class2" data-show="x1">2 //This should be displayed only if Household = 1 or 2 and Monument = 1 ...
</div>
<div class="class3" data-show="11">3 //This should be displayed only if Household = 1 and Monument = 1 ...
</div>
<div class="class4" data-show="2">4 //This should be displayed only if Household = 2 ...
</div>
<div class="class5" data-show="2-1">5 //This should be displayed only if Household = 2 and Zones = 1 ...
</div>
<div class="class6" data-show="21">6 //This should be displayed only if Household = 2 and Monument = 1 ...
</div>
<div class="class7" data-show="211">7 //This should be displayed only if Household = 2 and Zones = 1 and Monument = 1 ...
</div>
<div class="class2" data-show="x1">
2 again ...
</div>
<div class="class5" data-show="2-1">
5 again ...
</div>
在这种逻辑错综复杂的代码中,需要使用逻辑工具来表示决策系统。
否则,你最终会得到一个意大利面条代码,你和所有必须管理这个代码的人都会沉没。
我的建议是:使用“会说话”的词,而不是,,会让每个人都失去逻辑线索的名字。X
Y
Z
在这里,只有一个简单的决策网格需要维护,其逻辑以通用方式以来龙去脉的描述为模型。逻辑中的任何更改只需要修改此网格,您甚至可以添加新的类或新的单选按钮,添加到它们或更改它们的值。JS 可以保持不变。
从代码的角度来看,当然有必要费心去建立这个网格的解释器;对于任何计算机科学家来说,实现...
实际上,您的决策网格是这样的:
家庭 | 纪念碑 | 区 | |
---|---|---|---|
第1类 | 1,2 | . | . |
第2类 | 1,2 | 1 | . |
第3类 | 1 | 1 | . |
第4类 | 2 | . | . |
第5类 | 2 | . | 1,2 |
第6类 | 2 | 1 | . |
第7类 | 2 | 1 | 1 |
在 JS 对象中更改后,它确实:
const decisionGid =
{ class1 : { household : [1,2] }
, class2 : { household : [1,2], monument: [1] }
, class3 : { household : [1], monument: [1] }
, class4 : { household : [ 2], }
, class5 : { household : [ 2], zones: [1,2] }
, class6 : { household : [ 2], monument: [1] }
, class7 : { household : [ 2], monument: [1], zones: [1] }
}
一旦代码建立起来,更新决策网格比修改嵌套的 if 级联要容易得多
所以你的代码应该是:
const
myForm = document.querySelector('#my-form')
, decisionGid =
{ class1 : { household : [1,2] }
, class2 : { household : [1,2], monument: [1] }
, class3 : { household : [1], monument: [1] }
, class4 : { household : [ 2], }
, class5 : { household : [ 2], zones: [1,2] }
, class6 : { household : [ 2], monument: [1] }
, class7 : { household : [ 2], monument: [1], zones: [1] }
};
myForm.onsubmit = e => e.preventDefault(); // disable form submit for testing
f_update_show_hide();
myForm.addEventListener('input',f_update_show_hide);
function f_update_show_hide()
{
for ( let classVal in decisionGid )
{
let test = true
for (let elm in decisionGid[classVal])
{
test &&= decisionGid[classVal][elm].includes( Number(myForm[elm].value) )
}
if (test) $(`.${classVal}`).show();
else $(`.${classVal}`).hide();
}
}
myForm.onclick = ({target: btn}) =>
{
if (!btn.matches('button[data-elm]')) return;
myForm[btn.dataset.elm].value = 0;
f_update_show_hide();
}
// set display info conditions (for demo control)
for (let classVal in decisionGid )
{
$(`.${classVal}`).text(`${classVal} -> ${JSON.stringify(decisionGid[classVal])}` );
}
body {
font-family : Arial, Helvetica, sans-serif;
font-size : 16px;
}
label {
display : inline-block;
width : 2.6em;
background : lightgreen;
}
input[value="0"] {
display : none;
}
fieldset {
display : inline-block;
width : fit-content;
padding : .4em;
}
fieldset label:last-of-type {
background : orange;
}
div {
margin : .4em;
padding : .1em .4em;
background : lightblue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="my-form">
<fieldset>
<legend>household</legend>
<label> <input type="radio" name="household" value="1"> 1 </label>
<label> <input type="radio" name="household" value="2"> 2 </label>
<input type="radio" name="household" value="0" selected>
<button type="button" data-elm="household">none</button>
</fieldset>
<fieldset>
<legend>monument</legend>
<label> <input type="radio" name="monument" value="1"> 1 </label>
<label> <input type="radio" name="monument" value="2"> 2 </label>
<input type="radio" name="monument" value="0" selected>
<button type="button" data-elm="monument">none</button>
</fieldset>
<fieldset>
<legend>zones</legend>
<label> <input type="radio" name="zones" value="1"> 1 </label>
<label> <input type="radio" name="zones" value="2"> 2 </label>
<input type="radio" name="zones" value="0" selected>
<button type="button" data-elm="zones">none</button>
</fieldset>
</form>
<div class="class1"> class 1</div>
<div class="class2"> class 2</div>
<div class="class3"> class 3</div>
<div class="class4"> class 4</div>
<div class="class5"> class 5</div>
<div class="class6"> class 6</div>
<div class="class7"> class 7</div>
评论
<form:radiobutton path="household.type" value="1"/> <form:radiobutton path="household.type" value="2"/>
[form, input]
document.forms['form_name'][input_name]
评论