1

我正在学习如何编写不引人注目的Javascript,并且我已经能够处理大部分事情,但是我在使用元素的可见性打开和关闭时遇到问题一个复选框。请记住,我是一名设计师,程序员,大约十八号左右。换句话说,在编程方面我是新手。 (注意:此表格适用于牙髓治疗公司转诊表,因此是行业术语)。Unobtrusive JS:使用表单中的复选框切换元素的可见性

另外,请不要提示jQuery;我知道它存在,我经常使用它。我想学习如何在纯Javascript中实际做到这一点。这里是重要的HTML片段(这在asp.NET创建):

<ol> 
<li> 
    <fieldset> 
     <legend>Which of these procedures is required? (select at least one)<span class="required"> *</span></legend> 
     <label id="procedure01"><asp:CheckBox ID="chkEndodonticProcedure01" GroupName="EndodonticProcedure" runat="server" />Consultation for evaluation of tooth</label> 
     <label id="procedure02"><asp:CheckBox ID="chkEndodonticProcedure02" GroupName="EndodonticProcedure" runat="server" />Re-treatment of tooth</label> 
     <label id="procedure03"><asp:CheckBox ID="chkEndodonticProcedure03" GroupName="EndodonticProcedure" runat="server" />Treatment of tooth</label> 
    </fieldset> 
    <ol id="consultation"> 
     <li> 
      <asp:Label ID="lblConsultationToothNumber" AssociatedControlID="txtConsultationToothNumber" runat="server">Consultation tooth number</asp:Label> 
      <asp:TextBox id="txtConsultationToothNumber" CssClass="textbox" runat="server" /> 
     </li> 
     <li> 
      <fieldset> 
       <legend>Do any of these conditions apply?</legend> 
       <label><asp:CheckBox ID="chkToothCondition01" GroupName="ToothCondition" runat="server" />Vague toothache</label> 
       <label><asp:CheckBox ID="chkToothCondition02" GroupName="ToothCondition" runat="server" />Pain, swelling</label> 
       <label><asp:CheckBox ID="chkToothCondition03" GroupName="ToothCondition" runat="server" />Sensitivity to heat</label> 
       <label><asp:CheckBox ID="chkToothCondition04" GroupName="ToothCondition" runat="server" />Sensitivity to cold</label> 
       <label><asp:CheckBox ID="chkToothCondition05" GroupName="ToothCondition" runat="server" />Sensitivity to percussion</label> 
       <label><asp:CheckBox ID="chkToothCondition06" GroupName="ToothCondition" runat="server" />Possible combined perio-endo lesion</label> 
       <label><asp:CheckBox ID="chkToothCondition07" GroupName="ToothCondition" runat="server" />Suspected cracked tooth/root</label> 
      </fieldset> 
     </li> 
    </ol> 
    <ol id="retreatment"> 
     <li> 
      <asp:Label ID="lblRetreatmentToothNumber" AssociatedControlID="txtRetreatmentToothNumber" runat="server">Re-treatment tooth number</asp:Label> 
      <asp:TextBox id="txtRetreatmentToothNumber" CssClass="textbox" runat="server" /> 
     </li> 
     <li> 
      <asp:Label ID="lblPreviousRCTDate" AssociatedControlID="txtPreviousRCTDate" runat="server">Date of previous RCT</asp:Label> 
      <asp:TextBox id="txtPreviousRCTDate" CssClass="textbox datepicker" runat="server" /> 
     </li> 
    </ol> 
    <ol id="treatment"> 
     <li> 
      <asp:Label ID="lblTreatmentToothNumber" AssociatedControlID="txtTreatmentToothNumber" runat="server">Treatment tooth number</asp:Label> 
      <asp:TextBox id="txtTreatmentToothNumber" CssClass="textbox" runat="server" /> 
     </li> 
     <li> 
      <fieldset> 
       <legend>What is the reason for treatment? (check any that apply)</legend> 
       <label><asp:CheckBox ID="chkTreatmentReason01" GroupName="TreatmentReason" runat="server" />Necessary for proper restoration</label> 
       <label><asp:CheckBox ID="chkTreatmentReason02" GroupName="TreatmentReason" runat="server" />Pulp exposed and vital</label> 
       <label><asp:CheckBox ID="chkTreatmentReason03" GroupName="TreatmentReason" runat="server" />Pulp exposed and non-vital</label> 
       <label><asp:CheckBox ID="chkTreatmentReason04" GroupName="TreatmentReason" runat="server" />Tooth was opened and medicated</label> 
       <label><asp:CheckBox ID="chkTreatmentReason05" GroupName="TreatmentReason" runat="server" />X-ray revealed radiolucency/pulpal involvement</label> 
      </fieldset> 
     </li> 
     <li> 
      <fieldset> 
       <legend>Is an X-ray included for revealed radiolucency/pulpal involvement?</legend> 
       <label><asp:RadioButton ID="rdoXrayIncluded01" GroupName="XrayIncluded" runat="server" />Yes</label> 
       <label><asp:RadioButton ID="rdoXrayIncluded02" GroupName="XrayIncluded" runat="server" />No</label> 
      </fieldset> 
     </li> 
    </ol> 
</li> 

非侵入式的JavaScript,我抢的形式ID(“referralform”),创建两个数组包含相关的元素身份证,隐藏我想打开,用CSS类的元素,然后应用到应用,揭示了元素的CSS类onclick事件:

function prepareAccordion() 
{ 
if (document.getElementById && document.getElementsByTagName) 
{ 
    if (document.getElementById("referralform")) 
    { 
     var accordionids = new Array(); 
     accordionids[0] = document.getElementById("minorparent"); 
     accordionids[1] = document.getElementById("consultation"); 
     accordionids[2] = document.getElementById("retreatment"); 
     accordionids[3] = document.getElementById("treatment"); 

     var revealids = new Array(); 
     revealids[0] = document.getElementById("minorYes"); 
     revealids[1] = document.getElementById("minorNo"); 
     revealids[2] = document.getElementById("procedure01"); 
     revealids[3] = document.getElementById("procedure02"); 
     revealids[4] = document.getElementById("procedure03"); 

     for (var i = 0; i < accordionids.length; i++) 
     { 
      accordionids[i].className = "accordion-collapsed"; 
     } 

     revealids[0].onclick = function revealAccordion() 
     { 
      accordionids[0].className = "accordion-revealed"; 
     } 

     revealids[1].onclick = function revealAccordion() 
     { 
      accordionids[0].className = "accordion-collapsed"; 
     } 

     x = 0; 
     revealids[2].onclick = function revealAccordion() 
     { 
      if (x == 0) 
      { 
       accordionids[1].className = "accordion-revealed"; 
       x++; 
      } 
      else 
      { 
       accordionids[1].className = "accordion-collapsed"; 
       x--; 
      } 
     } 

     y = 0; 
     revealids[3].onclick = function revealAccordion() 
     { 
      if (y == 0) 
      { 
       accordionids[2].className = "accordion-revealed"; 
       y = 1; 
      } 
      else 
      { 
       accordionids[2].className = "accordion-collapsed"; 
       y = 0; 
      } 
     } 

     z = 0; 
     revealids[4].onclick = function revealAccordion() 
     { 
      if (z == 0) 
      { 
       accordionids[3].className = "accordion-revealed"; 
       z = 1; 
      } 
      else 
      { 
       accordionids[3].className = "accordion-collapsed"; 
       z = 0; 
      } 
     } 
    } 
} 
} 

function addLoadEvent(func) 
{ 
var oldonload = window.onload; 
if (typeof window.onload != 'function') 
{ 
    window.onload = func; 
} 
else 
{ 
    window.onload = function() 
    { 
     if (oldonload) 
     { 
      oldonload(); 
     } 
     func(); 
    } 
} 
} 

addLoadEvent(prepareAccordion); 

有可能是一个更好的方法来对打造”开/关“切换复选框的设置比使用”1“和”0“翻转在他们之间,但是,我不是程序员。问题是,当在“1”和“0”之间应用翻转时,onclick事件仅在直接在复选框内单击时才起作用,而不在标签上起作用。 onclick在应用于单选按钮的标签时工作正常,所以它必须是“1”和“0”之间的关键字,它会抛出一些东西。

任何帮助,这是非常感谢。

回答

0

我会做什么—而事实上,我为我的雇主网站—所做的工作是用类“toggleOnSwitch”(我倾向于使用刺激性的长名称)标记页面元素。该元素还将具有一些“data-”属性:“data-switch”,其中包含用于控制切换的复选框或单选按钮或<option>元素的“id”值; “data-toggle-class”,包含可以打开和关闭的类(如“hidden”或“inactive”或其他);也许还有一两个我忘记了。

不引人注意的JavaScript查找该类,然后为每个切换的元素设置交换元素(复选框,在您的情况下)的事件处理程序。事件处理程序执行从切换元素中添加/删除类的工作。

这是比这更复杂一点,如果你想切换的单选按钮,因为当一个单选按钮开关,其所有的朋友开关关闭,所以处理程序必须知道在触发切换处理所有其他单选按钮具有相同的名称,以防他们也控制页面元素的可见性(或任何添加/删除的类)。我也编写了我的代码,以便如果“数据开关”值以“!”开头,例如“!toggleCheckbox”,则意味着反转切换的意义。当一个特定的复选框在切换另一个事件的同时切换一件事情时,这很方便。