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

Я учусь писать ненавязчивый 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 Ответ

0 голосов
/ 29 апреля 2011

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

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

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

...