Javascript 如何将选择器更改事件添加到此事件?

Javascript 如何将选择器更改事件添加到此事件?,javascript,jquery,Javascript,Jquery,下面是我的jquery,它非常有效 $(document).ready(function(){ $('#new_average, #max_occupancy').keyup(function(){ factor = $(".industry_picker option:checked").attr("title"); average = $('#new_average').val(); if($('#new_average').val()

下面是我的jquery,它非常有效

$(document).ready(function(){
    $('#new_average, #max_occupancy').keyup(function(){
        factor = $(".industry_picker option:checked").attr("title");
        average = $('#new_average').val();
        if($('#new_average').val().indexOf("$") != -1){
            average = average.substring(1);                                                     
        }
        if($("#max_occupancy").val() != ""){
            max_occupancy = $("#max_occupancy").val();
            max_total = ((average * factor) * max_occupancy) * 30;
            if(factor != ""){
                $("#new_calc").val("$" + max_total + ".00");
            }

        }                                                   
    });
});
但问题是我需要这个在键盘上启动

 $(".industry_picker") 
改变…我知道我可以复制这个确切的功能,并有一个

 $(".industry_picker").change 
但我觉得这是一种黑客行为……有没有更好的方法来获得

$('#new_average, #max_occupancy").keyup 


使用相同的选择器或更好的方法实现此功能,而无需再次复制整个函数

请勿使用匿名函数

function myCallback(){
    factor = $(".industry_picker option:checked").attr("title");
    average = $('#new_average').val();
    if($('#new_average').val().indexOf("$") != -1){
        average = average.substring(1);                                                     
    }
    if($("#max_occupancy").val() != ""){
        max_occupancy = $("#max_occupancy").val();
        max_total = ((average * factor) * max_occupancy) * 30;
        if(factor != ""){
            $("#new_calc").val("$" + max_total + ".00");
        }

    }
}

$('#new_average, #max_occupancy').keyup(myCallback);
$('.industry_picker').change(myCallback);
旁注:您没有在任何地方使用
var
,这意味着每个变量只有一个副本:
因子
平均
最大占用
最大总
。引入全局状态是草率的编码,使程序更难维护和调试使用
var
声明变量

推荐阅读:。

您可以使用

$('#new_average, #max_occupancy').keyup(Myfunction);

$(".industry_picker").change(Myfunction);

function Myfunction(){
factor = $(".industry_picker option:checked").attr("title");
    average = $('#new_average').val();
    if($('#new_average').val().indexOf("$") != -1){
        average = average.substring(1);                                                     
    }
    if($("#max_occupancy").val() != ""){
        max_occupancy = $("#max_occupancy").val();
        max_total = ((average * factor) * max_occupancy) * 30;
        if(factor != ""){
            $("#new_calc").val("$" + max_total + ".00");
        }

    }    
}

不要将函数直接分配给事件处理程序,而是分配给局部变量,并将其分配给这两个变量:

var myHandler = function() { ... };
$('#new_average, #max_occupancy').keyup(myHandler);
$(".industry_picker').change(myHandler);

+1尽管对措辞吹毛求疵,但问题不是函数是匿名的,而是它没有被重用。(你可以重用匿名函数,人们总是这样做,尽管我更喜欢通过给函数命名来帮助我的工具。)吹毛求疵,我知道。;-)谢谢大家…一个问题…函数是否需要在文档中。准备好了还是将在页面上的任何位置work@Tamer:您可以在可从document ready处理程序访问的任何作用域中声明函数。一般来说,最好在非全局范围内声明函数和变量,以避免污染全局名称空间。@Tamer:其符号位于连接处理程序的范围内的任何地方,这意味着在全局范围内或在封闭函数调用内(如
ready
处理程序)。请注意,将其放在就绪处理程序中可以防止将其添加到全局命名空间中,如果这是您使用它的唯一位置,这是一件好事。(我通常将页面的整个逻辑放在一个封闭函数中,完全不暴露任何公共符号。)@T.J:我如何重用匿名函数?像这样的<代码>var foo=function(){…}离题,但是:您是否在某个地方声明了所有这些变量?”因为看起来你是在让自己沦为敌人的牺牲品。
var myHandler = function() { ... };
$('#new_average, #max_occupancy').keyup(myHandler);
$(".industry_picker').change(myHandler);