Can';不要让javascript工作(初学者)-请检查我的代码

Can';不要让javascript工作(初学者)-请检查我的代码,javascript,jquery,html,Javascript,Jquery,Html,我不熟悉脚本编写等,所以如果您能告诉我(a)我的代码不起作用的原因,以及(b)您能提供的任何其他有用提示,我将不胜感激。我相信原因很简单:)。很高兴收到任何反馈 我只是在设计一个基本的计算器——用户输入一只动物的体重、脱水程度和另一个数字,javascript进行一些计算以输出流体速率(用于计算流体应该以多快的速度流入生病的动物) 守则: $(文档).ready(函数(){ 编写(“此脚本正在运行”); //兽医计算器代码 //当bw、dh或ol发生变化时,更新维护、更换、每日要求和费率。 函

我不熟悉脚本编写等,所以如果您能告诉我(a)我的代码不起作用的原因,以及(b)您能提供的任何其他有用提示,我将不胜感激。我相信原因很简单:)。很高兴收到任何反馈

我只是在设计一个基本的计算器——用户输入一只动物的体重、脱水程度和另一个数字,javascript进行一些计算以输出流体速率(用于计算流体应该以多快的速度流入生病的动物)

守则:

$(文档).ready(函数(){
编写(“此脚本正在运行”);
//兽医计算器代码
//当bw、dh或ol发生变化时,更新维护、更换、每日要求和费率。
函数updateDetails(){
//定义体重、脱水和持续损失的变量
变量$bw=$(“#体重”);
var$dh=$('脱水');
变量$ol=$(“#ongoingloss”);
变量$dr=$(“#每日需求”);
变量$repl=$(“#替换”);
var$rt=$(“#rate”);
var mt=(1.5*(70*(数学功率($bw.val,0.75));//维护要求
$dr.text(mt+‘ml/24小时’);
风险值代表=$bw*0.01*$dh;
$repl.text(rep+'ml');
风险值rt=((mt+rep+ol.val)/24);
$rt.text(rt+“ml/hr”);
}
//为输入元素添加事件侦听器
$bw.on('change',updateDetails());
$dh.on('change',updateDetails());
$ol.on('change',updateDetails());
}

兽医计算器
流体计算器
投入
体重(kg):


%脱水:


损失(ml):



每日需求:
替换:

速率(毫升/小时): &副本;维特夏普私人有限公司2015年版权所有


您应该为事件处理程序提供函数引用。按如下方式修复代码:

$bw.on('change', updateDetails);
$dh.on('change', updateDetails);
$ol.on('change', updateDetails);
不同之处在于,
updateDetails()
立即执行函数,并将
未定义的
作为事件处理程序返回,因此基本上没有注册任何处理程序

另一个问题是,您需要将变量定义移到
updateDetails
函数之外:

var $bw = $('#bodyWeight');
var $dh = $('#dehydration');
var $ol = $('#ongoingLosses');
var $dr = $('#dailyRequirement');
var $repl = $('#replacement');

function updateDetails() { ... }
从哪里开始

  • 您缺少结束语
    在您的文档之后。就绪
  • 您正试图在函数中声明一个新函数
  • 您正在尝试与旧版本的jquery一起使用
可能还有更多我一眼就看不到的东西。您的空格和缩进总体上很糟糕。

问题:

  • 您在函数内声明了
    var
    ,但在
    var
    未知(在函数范围之外)的情况下绑定了
    change
    事件。因此,您必须在父作用域上声明这些内容,在您的情况下,父作用域位于函数外部

  • 它是
    .val()
    ,在jQuery中不是
    .val

  • .on()
    方法中触发事件时,需要传递函数指针。它被称为事件处理程序。这与调用函数不同。所以是

  • $bw.on('change',updateDetails)
    $bw.on('change',updateDetails())

    解决方案: 这就是你的脚本应该是什么样子

    $bw = $('#bodyWeight');
    $dh = $('#dehydration');
    $ol = $('#ongoingLosses');
    
    //update maint, replacement, dailyRequirement and rate when bw, dh or ol changes.
    function updateDetails()    {
    // define variables for body weight, dehydration and ongoing losses
       var $dr = $('#dailyRequirement');
        var $repl = $('#replacement');
    
        var $rt = $('#rate');
    
        var mt = (1.5 * (70 * (Math.pow($bw.val(), 0.75))));    // maintenance requirement
        $dr.text(mt + 'ml/24 hours');
    
        var rep = $bw.val() * 0.01 * $dh.val();
        $repl.text(rep + 'ml');
    
        var rt = ((mt + rep + $ol.val())/24);
        $rt.text(rt + "ml/hr");
    }
    
    
    
    // add event listeners for input elements
    $bw.on('change', updateDetails);
    $dh.on('change', updateDetails);
    $ol.on('change', updateDetails);
    

    $bw
    $dh
    $ol
    在本地范围内。您无法在功能范围之外找到它们。你还需要在使用它们之前声明它们;在Javascript的末尾。也是
    $bw.val()
    而不是
    $bw.val
    您好,谢谢。你能解释一下原因吗?我只打算在该函数中使用这些变量——将变量保持在局部不是更好的做法吗?“我只打算在该函数中使用这些变量”,但您还希望将事件处理程序绑定到函数的外部。所以在这种情况下,你无论如何都需要他们在外面。一般来说,在这种情况下,最好在外部声明它们,以便在执行函数时不会在每个事件上重新计算它们。您好,您能解释一下“旧版本的jQuery”注释吗?我直接从jQuery站点使用1.11.2?您好,谢谢您的回答。我可以问一下,您遗漏了document.ready部分-我是否需要它,因为我已将脚本放在html文件的末尾?是的,您当然需要在html文件中使用它。但是在
    jsFiddle
    中,他们在内部将您的所有代码放在
    document.ready(function(){})中。所以你不需要它。这意味着在
    jsFiddle
    中,您的所有代码都在文档准备好后开始工作。奇怪的是,当我跟随您到jsFiddle的链接时,代码在那里工作(尽管我需要对其进行大量润色),但是当我将代码复制并粘贴到我的文件中(这些文件仅存储在我的计算机本地)时,它们不工作。有什么想法吗?