最有效的Wyt使用多个。点击jQuery

最有效的Wyt使用多个。点击jQuery,jquery,click,Jquery,Click,我有一个简单的表单,它可以按预期工作。这是一个多步骤的形式,一次只显示一个问题。当用户单击一个输入字段(所有单选按钮)时,他们会进入下一个问题,这取决于他们单击的内容,最后他们会在最后一个问题后得到一个提交按钮。 我目前有几个。单击函数,效果很好。然而,我相信无论从写作还是表演角度来看,这都不是最有效的方法。是否有更有效的方法使用多个。单击功能 $('.male').click(function() { $('#male').show(); $('#gender').hide(); })

我有一个简单的表单,它可以按预期工作。这是一个多步骤的形式,一次只显示一个问题。当用户单击一个输入字段(所有单选按钮)时,他们会进入下一个问题,这取决于他们单击的内容,最后他们会在最后一个问题后得到一个提交按钮。
我目前有几个
。单击
函数,效果很好。然而,我相信无论从写作还是表演角度来看,这都不是最有效的方法。是否有更有效的方法使用多个
。单击
功能

$('.male').click(function() {
  $('#male').show();
  $('#gender').hide();
});

$('.female').click(function() {
  $('#female').show();
  $('#gender').hide();
});

因为您的
#男性
#女性
元素在单击时都需要运行代码,所以它们都需要自己的单击处理程序。但是,您可以通过将它们都包含在同一个选择器中并调用单个函数来处理它们来简化此代码。试试这个:

$(".male, .female").click(showDivs);

function showDivs() {
    if ($(this).hasClass("male")) {
        $("#male").show();
    }
    else {
        $("#female").show();
    }
    $("#gender").hide();
}

因为您的
#男性
#女性
元素在单击时都需要运行代码,所以它们都需要自己的单击处理程序。但是,您可以通过将它们都包含在同一个选择器中并调用单个函数来处理它们来简化此代码。试试这个:

$(".male, .female").click(showDivs);

function showDivs() {
    if ($(this).hasClass("male")) {
        $("#male").show();
    }
    else {
        $("#female").show();
    }
    $("#gender").hide();
}

您可以将所有问题设置为“问题”类,然后每个答案都可以有一个id,对应于您要显示的即将到来的分支的类(或其他)属性

因此,每个响应都会包含下一步要显示的内容的名称,并且只能有一个单击处理程序

即:

您可能需要对它进行一点操作,直到控件按您所希望的方式工作。这是一个需要解决的问题


更新:这里是最新的。

您可以将所有问题设置为“问题”类,然后每个答案都可以有一个id,对应于您要显示的即将到来的分支的类(或其他)属性

因此,每个响应都会包含下一步要显示的内容的名称,并且只能有一个单击处理程序

即:

您可能需要对它进行一点操作,直到控件按您所希望的方式工作。这是一个需要解决的问题


更新:以下是最新消息。

由于事件冒泡,您可以执行以下操作:

​$('body').on('click',function(e){
    switch ($(e.target).attr('class')){
        case "male":
            $('#male').show();
            $('#gender').hide();
            break;
        case "female":
            $('#female').show();
            $('#gender').hide();
            break;
        default:
            alert("default function!");
            break;            
    }
});​​​​​​
下面是一个演示:

当然,默认函数将返回您在该页面上单击但尚未捕获的任何内容


顺便说一句,您可以将
$(e.target).attr('class')
替换为
e.target.className
,以对其进行优化,正如David Thomas在其回答中所做的那样…

由于事件冒泡,您可以执行以下操作:

​$('body').on('click',function(e){
    switch ($(e.target).attr('class')){
        case "male":
            $('#male').show();
            $('#gender').hide();
            break;
        case "female":
            $('#female').show();
            $('#gender').hide();
            break;
        default:
            alert("default function!");
            break;            
    }
});​​​​​​
下面是一个演示:

当然,默认函数将返回您在该页面上单击但尚未捕获的任何内容


顺便说一句,您可以将
$(e.target).attr('class')
替换为
e.target.className
,以稍微优化它,正如David Thomas在其回答中所做的那样…

假设HTML具有逻辑结构,例如:

<form action="#" method="post">
    <fieldset>
        <legend>Question 1: gender</legend>
        <label for="m">Male</label>
        <input type="radio" name="gender" id="m" />
        <label for="f">Female</label>
        <input type="radio" name="gender" id="f" />
    </fieldset>
    <fieldset>
        <legend>Question title</legend>
        <!-- answer options -->
    </fieldset>
    <!-- other questions... -->
</form>
​.

为了重新审视之前的问题,我建议按照以下思路进行改编:

<form action="#" method="post">
    <fieldset>
        <legend>Question 1: gender</legend>
        <label for="m">Male</label>
        <input type="radio" name="gender" id="m" />
        <label for="f">Female</label>
        <input type="radio" name="gender" id="f" />
        <div class="controls">
            <a href="#" class="prev">Previous</a>
            <a href="#" class="next">Next</a>
        </div>
    </fieldset>
    <!-- other questions... -->
</form>

参考资料:

  • jQuery材料:

  • 本机JavaScript内容:


  • 假设HTML具有逻辑结构,例如:

    <form action="#" method="post">
        <fieldset>
            <legend>Question 1: gender</legend>
            <label for="m">Male</label>
            <input type="radio" name="gender" id="m" />
            <label for="f">Female</label>
            <input type="radio" name="gender" id="f" />
        </fieldset>
        <fieldset>
            <legend>Question title</legend>
            <!-- answer options -->
        </fieldset>
        <!-- other questions... -->
    </form>
    
    ​.

    为了重新审视之前的问题,我建议按照以下思路进行改编:

    <form action="#" method="post">
        <fieldset>
            <legend>Question 1: gender</legend>
            <label for="m">Male</label>
            <input type="radio" name="gender" id="m" />
            <label for="f">Female</label>
            <input type="radio" name="gender" id="f" />
            <div class="controls">
                <a href="#" class="prev">Previous</a>
                <a href="#" class="next">Next</a>
            </div>
        </fieldset>
        <!-- other questions... -->
    </form>
    

    参考资料:

  • jQuery材料:

  • 本机JavaScript内容:


  • 此外,由于这是用户界面问题(用户执行单击),除非您注意到问题,否则我认为您不必担心处理单击事件的更有效方法。@ak85,这些想法对您有用吗?如果是的话,你应该接受答案,或者参与讨论。很抱歉@veeTrain的延迟,我知道我这样做的方式是有效的,但我想知道一种更好的技术,更适合我自己的发展。谢谢你的详细例子。没问题;我很高兴看到我的例子对你有帮助。提出了很多好主意。另外,由于这是用户界面问题(用户执行单击),除非您注意到问题,否则我认为您不必担心处理单击事件的更有效方法。@ak85,这些想法对您有用吗?如果是的话,你应该接受答案,或者参与讨论。很抱歉@veeTrain的延迟,我知道我这样做的方式是有效的,但我想知道一种更好的技术,更适合我自己的发展。谢谢你的详细例子。没问题;我很高兴看到我的例子对你有帮助。有很多好的想法被提出。这看起来比我得到的要简单得多。谢谢。我会试试看。这看起来比我以前的要简单得多。谢谢。我要试一试。