如何在jQuery中连续触发函数?

如何在jQuery中连续触发函数?,jquery,function,Jquery,Function,我的基本设置是,我有一个表单,它是隐藏的,直到通过单击进行选择,例如“成员、非成员、员工等”。单击选择后,表单显示,其中的账单区域也隐藏,直到表单总额超过$0 现在我的问题是,只要点击了5个选项中的4个,总数就会立即超过0美元。在这种情况下,计费部分应该自动触发,但我无法让我的第二个函数(进行计算的函数)侦听onclick事件或on change事件的第一个函数。是否有一种方法可以在我的每个“if”语句中,以及在代码中输入“execute calculate function”这样的结尾 大概是

我的基本设置是,我有一个表单,它是隐藏的,直到通过单击进行选择,例如“成员、非成员、员工等”。单击选择后,表单显示,其中的账单区域也隐藏,直到表单总额超过$0

现在我的问题是,只要点击了5个选项中的4个,总数就会立即超过0美元。在这种情况下,计费部分应该自动触发,但我无法让我的第二个函数(进行计算的函数)侦听onclick事件或on change事件的第一个函数。是否有一种方法可以在我的每个“if”语句中,以及在代码中输入“execute calculate function”这样的结尾

大概是这样的:

if(section == 'Member') {
            var base_cost = 150;

            $("#commentTable,#ClinicStaff,#IMSNonMember,#Resident,#Student").fadeOut('slow', function() {
                // Animation complete.
            });
            $("#commentTable, #IMSMember").fadeIn('slow', function() {
                // Animation complete
            });
            $("input[name=SectionChosen]").val('Member');// Section selected, pass as hidden field for processing
                    ***$runNextFunction();***

        }
我试着做:
$(“'input[name^=PROD]”,'base_cost”).change(function(){

查看是否可以让函数监视输入和基本成本字段的更改。但它不想触发。以下是我的完整设置:

jQuery(function(ready){

    jQuery('.showForm').click(function(){

        var section = $(this).attr('target');
        var base_cost = ''; // reset base cost
        $("input[name=TOTAL]").val('');// Reset the Total field to 0 to hide the billing form again
        $("input[name^=PROD]").val('');// matches those that begin with 'PROD' and clears them
        $("input[name=SectionChosen]").val('');// Reset the section choice


        if(section == 'Member') {
            var base_cost = 150;

            $("#commentTable,#ClinicStaff,#IMSNonMember,#Resident,#Student").fadeOut('slow', function() {
                // Animation complete.
            });
            $("#commentTable, #IMSMember").fadeIn('slow', function() {
                // Animation complete
            });
            $("input[name=SectionChosen]").val('Member');// Section selected, pass as hidden field for processing

        }
        else if(section == 'Clinic') {
            var base_cost = 150;

            $("#commentTable,#IMSMember,#IMSNonMember,#Resident,#Student").fadeOut('slow', function() {
                // Animation complete.
            });
            $("#commentTable, #ClinicStaff").fadeIn('slow', function() {
                // Animation complete
            });
            $("input[name=SectionChosen]").val('Clinic');// Section selected, pass as hidden field for processing
        }
        else if(section == 'Nonmember') {
            var base_cost = 250;

            $("#commentTable,#IMSMember,#ClinicStaff,#Resident,#Student").fadeOut('slow', function() {
                // Animation complete.
            });
            $("#commentTable, #IMSNonMember").fadeIn('slow', function() {
                // Animation complete
            });
            $("input[name=SectionChosen]").val('Nonmember');// Section selected, pass as hidden field for processing
        }
        else if(section == 'Resident') {
            var base_cost = 75;

            $("#commentTable, #IMSMember,#ClinicStaff,#IMSNonMember,#Student").fadeOut('slow', function() {
                // Animation complete.
            });
            $("#commentTable, #Resident").fadeIn('slow', function() {
                // Animation complete
            });
            $("input[name=SectionChosen]").val('Resident');// Section selected, pass as hidden field for processing
        }
        else if(section == 'Student') {
            var base_cost = 0;

            $("#commentTable,#IMSMember,#ClinicStaff,#IMSNonMember,#Resident").fadeOut('slow', function() {
                // Animation complete.
            });
            $("#commentTable, #Student").fadeIn('slow', function() {
                // Animation complete
            });
            $("input[name=SectionChosen]").val('Student');// Section selected, pass as hidden field for processing
        }


        // Calculate order Total
        $('input[name^=PROD]').change(function() { 

            // Total cost of order, is equal to base cost + any additional selectoins made below
            var order_total = base_cost;

            // Run through all the form fields
            $('input[name^=PROD]').each(function(i) {

                // Get the current field and its name
                var form_name = $(this).attr('name');

                // If so, extract the price from the name
                var item_price = parseFloat(form_name.substring(form_name.lastIndexOf("_") + 1));

                // Get the quantity
                var item_quantity = parseInt($(this).val(), 10);

                // Update the order total
                if (item_quantity >= 0) {
                    order_total += item_quantity * item_price
                }

            });

            // Display the total rounded to two decimal places
            $('input[name=TOTAL]').val((Math.round(order_total*100)/100).toFixed(2));

            // Show the billing portion if total is not 0
            if (order_total > 1) {
                // show the section with the billing portion
                $("#BillingPortion").show();
            }
            else {
                // hide billing portion if total is 0
                $("#BillingPortion").hide();
            }
        });


    });
});
正如您从表单中看到的,如果您单击一个选项,然后通过在来宾中插入一个数字来添加更多的“成本”,然后账单部分显示。但这还不够好,因为如果他们不想要任何来宾,账单部分仍应显示他们的基本成本是否大于0美元

如果有人能给我指出正确的方向那就太好了


另外,对于jQuery,我也没有太多的经验,所以我相信我的代码可能会变得更加枯燥,对你们中的一些人来说可能会很糟糕,但至少这是一个开始。

一些事情。通过使用
$('input[name^=PROD]'))。更改
单击
处理程序中的绑定每次启动
单击
处理程序时,您都将添加相同的处理程序。这意味着在第二次单击时,当您更改输入时,它将启动两次。这可能不是您想要的

第二,为什么不把计算总数的部分提取出来,作为一个单独的函数,您可以在
单击
处理程序中调用它呢

function calculateTotal() {
    // your code to calculate the total and make part of the UI visible if more than
    // $0.
}
然后您还可以让
更改
处理程序调用它:

 $('input[name^=PROD]').change(function() { 
     calculateTotal();
 }

有几件事。通过在
click
处理程序中使用
$('input[name^=PROD]').change
绑定,每次启动
click
处理程序时,您都将添加相同的处理程序。这意味着在第二次单击时,当您更改输入时,它将启动两次。这可能不是您想要的

第二,为什么不把计算总数的部分提取出来,作为一个单独的函数,您可以在
单击
处理程序中调用它呢

function calculateTotal() {
    // your code to calculate the total and make part of the UI visible if more than
    // $0.
}
然后您还可以让
更改
处理程序调用它:

 $('input[name^=PROD]').change(function() { 
     calculateTotal();
 }

好吧,我继续对你的代码进行了一些重构

节链接的标记 您使用链接在表单之间切换。但是,链接本身是间接的(通过JavaScript代码)设置一个名为
sectionselected
的隐藏输入。您可以更清楚地看到,单击一个链接代表一个选择,该选择也是表单数据的一部分。因此,使用一组单选框来选择一个选项,而不是一组语义不相关的链接。Since收音机框是适当的
输入
元素,具有
名称
,它们可以替换您原来隐藏的
部分选择的
输入。另外,您甚至不需要任何JavaScript来设置值,因为所选收音机框的值将被提交

<label><input type="radio" name="SectionChosen" value="Member" /> I am an IMS Member Physician</label>
<label><input type="radio" name="SectionChosen" value="Clinic" /> I am a Clinic/Hospital Administrators or Clinic Staff</label>
...
然后,可以使用以下方法检索基本成本:

var base_cost = $(...).data('base-cost');
要从当前选定的部分获取基本成本,只需查找当前选定的单选框:

var base_cost = $('input[name=SectionChosen]:checked').data('base-cost');
仅此而已!您不再需要从
单击
处理程序中绑定
change
处理程序,因为您可以在标记本身中找到基本成本。这意味着您只需要在DOM就绪时绑定
change
处理程序一次,这是应该的

进一步改进
总有改进的余地。例如,您可以为实际表单节提供与节名匹配的
数据节
属性,而不是
id
。这样,您可以更轻松地选择需要隐藏的节和需要显示的节。而不是写下相同的id selec列表或者,您可以选择类似于
.section[data section=“Member”]
.section:not([data section=“Member”])的内容
.Heck,
数据部分
值甚至可以来自所选的广播框本身,您甚至不需要长的
if…否则if
树!

好吧,我继续对您的代码进行了一些重构

节链接的标记 您使用链接在表单之间切换。但是,链接本身是间接的(通过JavaScript代码)设置一个名为
sectionselected
的隐藏输入。您可以更清楚地看到,单击一个链接代表一个选择,该选择也是表单数据的一部分。因此,使用一组单选框来选择一个选项,而不是一组语义不相关的链接。Since收音机框是适当的
输入
元素,具有
名称
,它们可以替换您原来隐藏的
部分选择的
输入。另外,您甚至不需要任何JavaScript来设置值,因为所选收音机框的值将被提交

<label><input type="radio" name="SectionChosen" value="Member" /> I am an IMS Member Physician</label>
<label><input type="radio" name="SectionChosen" value="Clinic" /> I am a Clinic/Hospital Administrators or Clinic Staff</label>
...
然后,可以使用以下方法检索基本成本:

var base_cost = $(...).data('base-cost');
要从当前选定的部分获取基本成本,只需查找当前选定的单选框:

var base_cost = $('input[name=SectionChosen]:checked').data('base-cost');
仅此而已!您不再需要从
单击
处理程序中绑定
更改
处理程序,因为您可以在标记本身中找到基本成本