【问题标题】:Why is my javascript function not being invoked for simple MVC tutorial? Why can't I debug either?为什么没有为简单的 MVC 教程调用我的 javascript 函数?为什么我也不能调试?
【发布时间】:2014-12-01 04:05:42
【问题描述】:

问题

我一直在关注这个简单的教程,发现 here。但是,我想对其进行修改,以便仅在客户端单击提交时调用计算器。但是,当我单击提交按钮时,没有观察到任何操作。我什至没有看到警报。

编辑:

我已根据 Ojay 的建议修改了代码。但是,当我尝试调试时出现此错误。我得到了这个确切的issue,除了我有 VS13 更新 3。这里发生了多件事?

代码

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Sample Calculator</title>
    <script src="~/Scripts/jquery-2.1.1.min.js"></script>
    <script type="text/javascript">


        $(document).ready(function () {
            $('#my-calc').on('submit', function () {
                alert("This button is working?");
                calculate();
            });



           function calculate()
           {

               alert('hi');
               //Add 
               try {

                   $('#sum').val((parseInt($('#num1').val())) + parseInt($('#num2').val()));

               } catch (e) {

               }

               //Subtract
               try {

                   $('#sub').val((parseInt($('#num1').val())) - parseInt($('#num2').val()));

               } catch (e) {

               }

               //Multiply
               try {

                   $('#mul').val((parseInt($('#num1').val())) * parseInt($('#num2').val()));

               } catch (e) {

               }

               //Divide
               try {

                   $('#div').val((parseInt($('#num1').val())) / parseInt($('#num2').val()));

               } catch (e) {

               }
           }

        });



    </script>

</head>
<body>
    <div><h4>Sample Calculator</h4></div>
    @using (Html.BeginForm())
    {
        <p> @Html.Label("Input 1") : @Html.TextBox("num1","0")</p>
        <p> @Html.Label("Input 2") : @Html.TextBox("num2", "0")</p>
        <p> @Html.Label("Sum ") : @Html.TextBox("sum")</p>
        <p> @Html.Label("Sub ") : @Html.TextBox("sub")</p>
        <p> @Html.Label("Mult ") : @Html.TextBox("mul")</p>
        <p> @Html.Label("Div ") : @Html.TextBox("div")</p>
        <button id="my-calc" type="button">Calculate</button>


    }   
</body>
</html>

尝试

  • 发出警报。未观察到。
  • 从documents.on.ready()重写它。见下文。
  • RTFM 如所见here
  • 已搜索到 stackoverflow。没有找到任何有用的东西。

编辑:我最初有一些东西,就像我正在看的教程一样。我有:

    $(document).ready(function(){

  $('#my-calc').on('submit', function (){ //stuff}


    }

我不明白为什么我的函数没有被调用?我的表单 ID 是正确的。我要做的就是调用这个计算器方法,以便我的标签的 sum、sub、mult 和 div 显示结果。

请原谅这个问题的简单性,但我觉得这对其他可能遇到此问题的 .NET MVC 教程的人很有用。由于这个问题, 我决定买一本关于 jQuery 的书。谢谢你的协助。

【问题讨论】:

  • 尝试使用 onload 函数 $(function(){}) 或将脚本放在 &lt;/body&gt; 之前
  • 你这里的示例代码是行不通的,因为它没有在文档中准备好(或者不在页尾,干脆'.my-calc'(应该是'#my-calc'反正)不存在当脚本运行时,因此不添加提交处理程序)。你说你重写了documents.on.ready() 但它没有用?你能提供那个代码吗?
  • 您也真的不想将提交按钮放在它自己的子表单中。根据 HTML5 标准,您不要将表单放在表单中……这会使它们的提交行为变得异常。相反,您可能想要设置 Html.BeginForm() 的 ID。像这样:using (Html.BeginForm(null, null, FormMethod.Post, new { id = "my-calc" }))
  • @OJay 我按要求添加了代码 sn-p。
  • 我给了每个人的支持。我很感激你给我的温柔帮助,一个初学者。我希望我能给每个人都回答这个问题。 Ojay 回答了这个问题,因为他是我工作的第一个解决方案。特别感谢您指出浏览器中的调试。如果你有什么想推荐的书。请告诉我。

标签: javascript c# jquery .net asp.net-mvc-4


【解决方案1】:

这里似乎存在多个问题。

首先您的选择器必须是'#my-calc' 才能正确选择提交表单。您的 jQuery 代码必须包含在文档就绪处理程序中(根据您添加的代码),或者代码需要出现在表单之后。此外,当您添加提交事件处理程序时,您需要返回 false 以停止表单提交。最后(也许是最重要的),你不能嵌套表单。 @using (Html.BeginForm()) 创建一个表单,然后您在其中创建另一个表单 &lt;form id="my-calc"&gt;,这是无效的。浏览器会做的只是忽略内部的,也就是说,永远不会有my-calc表单的提交事件,因为提交的是父表单。

另外,因为您只是在页面上使用 JavaScript 进行计算,所以实际上并不需要表单,也许只需一个 &lt;button type="button" id="my-calc"&gt;Calculate&lt;/button&gt; 与点击事件会更好。

现在你的计算函数也有错误

在尝试获取 num1 值时,每个计算行都缺少 $

所以

$('#sum').val((parseInt(('#num1').val())) + parseInt($('#num2').val()));

应该是

$('#sum').val((parseInt($('#num1').val())) + parseInt($('#num2').val()));

乘法1还有一个额外的问题,输入不是#mult它的#mul,就像你的@Html.TextBox("mul")一样。

所有这些加在一起,类似以下的内容应该可以解决您的问题

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Sample Calculator</title>
    <script src="~/Scripts/jquery-2.1.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {

            $('#my-calc').on('click', function () {
                calculate();
            });

            function calculate() {
                //Add
                try {

                    $('#sum').val((parseInt($('#num1').val())) + parseInt($('#num2').val()));

                } catch (e) {

                }

                //Subtract
                try {

                    $('#sub').val((parseInt($('#num1').val())) - parseInt($('#num2').val()));

                } catch (e) {

                }

                //Multiply
                try {

                    $('#mul').val((parseInt($('#num1').val())) * parseInt($('#num2').val()));

                } catch (e) {

                }

                //Divide
                try {

                    $('#div').val((parseInt($('#num1').val())) / parseInt($('#num2').val()));

                } catch (e) {

                }
            }
        });
    </script>

</head>
<body>
    <div><h4>Sample Calculator</h4></div>
    <p> @Html.Label("Input 1") : @Html.TextBox("num1", "0")</p>
    <p> @Html.Label("Input 2") : @Html.TextBox("num2", "0")</p>
    <p> @Html.Label("Sum ") : @Html.TextBox("sum")</p>
    <p> @Html.Label("Sub ") : @Html.TextBox("sub")</p>
    <p> @Html.Label("Mult ") : @Html.TextBox("mul")</p>
    <p> @Html.Label("Div ") : @Html.TextBox("div")</p>
    <button id="my-calc" type="button">Calculate</button>  
</body>
</html>

【讨论】:

  • 读到这篇写得很好的回复,我面对的是铁杆铁杆。你对好的 jQuery 和 javascript 书籍有什么建议吗?
  • 我根据您的建议修改了我的代码并修复了错误。但是,由于 VS13 无法调试 javascript,我可能会遇到更大的问题?
  • IMO - 首先学习 JavaScript。 jQuery 只是一个 JavaScript 库。我认识的大多数人从来没有从一本书开始并且是自学的(包括我自己),尽管我读了几本 JavaScript 书籍,但那是在晚年。我认为 O'Reilly 的 JavaScript the Definitive Guide 是最好的资源(我可能已经阅读了六次),尽管它是一本庞大的书,需要数月甚至数年才能掌握。 Douglas Crockfords JavaScript 的优秀部分,而 John Resign Secrets of the JavaScript Ninja 也不错,虽然后两者是中级 - 高级。
  • 要在 VS2013 中调试,你需要运行 IE 并且你的 JavaScript 需要在一个单独的文件中
  • @hlyates 我认为您的问题没有简单的答案。同时学习 JavaScript、jQuery .NET、ASP.NET MVC 是一条巨大的道路。我已经完成了 .NET 课程,我主要通过自己和反复试验来学习 Javascript。在线资源庞大而​​众多,但有时可能会令人困惑。 IMO你只能边做边学,熟能生巧。网上的资源很容易找到,google一下就行了。但是对于一些快速链接JavaScript - MVC - w3schools 有它的批评者,但我发现它很有用
【解决方案2】:

对于jquery中的id,你必须使用#my-calc

但坦率地说,我认为您希望在单击按钮时调用计算,否则每次按下按钮时您都必须提交表单,这有点违背了 javascript 的目的。

$("input").on("click", calculate);

http://jsfiddle.net/4pwakehm/

【讨论】:

  • 我不明白关于按钮点击计算的评论。通常,最好收听submit 事件,因为您也可以使用回车键提交表单。
  • 我这么说的原因是,当您使用 javascript 或 jquery 做某事时,您通常会关心客户端脚本。但是,如果您在回发的同时运行 javascript,您的 javascript 将不会做任何事情,因为当页面刷新时,javascript 编辑的值将全部重置为您按下按钮之前的值。
  • @CBauer 同意。这就是我想要做的。我想我咬得比我能用这个教程咀嚼的更多。我怀疑我的应用程序有问题,因为在我的应用程序中尝试此操作时没有收到警报。
【解决方案3】:

您的代码无法正常工作,因为您的 Javascript 中没有 #

  • # 应该在名字前面,代表一个Id
  • . 应该在名称前面,表示一个

实际上你可以这样做:

$(document).ready(function () {
     $("#my-calc").on("click", function () {
          alert("Triggered alert for click.");
     });
});

请记住,$(document).ready 使用 jQuery。

这是一个示例,您还应该在浏览器中使用您的console 来帮助调试 Javascript。这将有助于解决此类问题。

【讨论】:

【解决方案4】:

您在表单呈现之前运行代码。因此,$('.my-calc') 返回一个空对象,并且什么也不做。此外,按 ID 选择项目的选择器是 $('#my-calc'),您的选择器正在寻找类为 my-calc 的元素

// Passing a function into `$()` makes it run after the DOM is ready.
$(function() {
    $('#my-calc').on('submit', function (){
        alert("This button is working?");
        calculate();
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多