Ненавязчивый JS: переключать видимость элемента с помощью флажка в форме

Я учусь писать ненавязчивый Javascript, и я смог решить большинство вопросов, но у меня возникают проблемы с включением и отключением видимости элемента с помощью флажка. Имейте в виду, что я сначала дизайнер, программист, ну 18 или около того. Другими словами, я новичок в программировании. (Примечание: эта форма предназначена для справочной формы эндодонтической фирмы, отсюда и отраслевые термины).

Также, пожалуйста, не предлагайте 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, я беру идентификатор формы ("referralform"), создаю два массива для хранения идентификаторов связанных элементов, скрываю элементы, которые я хочу отключить, с помощью класса CSS, а затем применяю событие onclick, чтобы применить класс CSS, который показывает элементы:

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", которое выбрасывает что-то.

Любая помощь в этом с благодарностью.

1 ответ

Что я хотел бы сделать - и, фактически, то, что я делаю для сайта моего работодателя - это пометить элементы страницы классом "toggleOnSwitch" (я склонен использовать такие длинные раздражающие имена). В этом случае элемент также будет иметь несколько атрибутов "data-": "data-switch", содержащий значение "id" для флажка или переключателя или <option> элемент, управляющий переключением; "data-toggle-class", содержащий класс для включения и выключения (например, "скрытый" или "неактивный" или любой другой); и, может быть, один или два других я забыл.

Ненавязчивый JavaScript ищет этот класс, а затем для каждого переключаемого элемента он устанавливает обработчики событий на элементе switch (флажок, в вашем случае). Обработчики событий выполняют работу по добавлению / удалению класса из переключаемого элемента.

Это немного сложнее, чем если вы хотите включить радио-кнопки, потому что, когда одна радио-кнопка включается, все ее друзья выключаются, поэтому обработчик должен знать, чтобы запускать переключатели на всех других радио-кнопках с одинаковыми name, если они также контролируют видимость элемента страницы (или что бы ни делал добавленный / удаленный класс). Я также закодировал мой так, что если значение "data-switch" начинается с "!", Например "! ToggleCheckbox", то это означает изменение смысла переключения. Это удобно, когда определенный флажок выключает одну вещь одновременно с включением другой.

Другие вопросы по тегам