【问题标题】:Need help on change event on both input boxes需要有关两个输入框上的更改事件的帮助
【发布时间】:2011-09-12 06:01:02
【问题描述】:

我需要这方面的帮助....我想触发警报(),例如在两个输入框上的更改事件之后执行一些代码..这是我的代码..

    Millimeter: <input type="text" id="millimeter" class="filter"/>
    Inch: <input type="text" id="inch" class="filter"/>

<script type="text/javascript">
    $(document).ready(function(){

        $(".filter").change(function(){
            var value = this.value;
            var id = this.id;
            var convert = "";

            switch(id)
            {
                case "millimeter":
                    convert = (value / 25.4).toFixed(2); //converts the value of input(mm) to inch;
                    $("#inch").val(convert).change();
                    break;

                case "inch":
                    convert = (value * 25.4).toFixed(2); //converts the value of input(inch) to mm;
                    $("#millimeter").val(convert).change();
                    break;

                default:
                    alert('no input has been changed');
            }

            alert(id+" triggered the change() event");
            //some code here....
        });
    });
</script>

我想要的是触发 alert() 2 两次...结果将如下所示...“毫米触发了 change() 事件”...然后当另一个输入框更改其值时....“英寸触发了 change() 事件”....反之亦然...我是 javascript 和 jquery 的新手...任何帮助将不胜感激..

【问题讨论】:

  • 您希望毫米上的更改事件触发英寸上的更改事件(反之亦然)?但这不会触发毫米的变化,这将触发英寸,这将触发毫米等?他们会不断地互相触发。
  • 这只是我的一段代码...我的项目有很多输入框有相同的功能要执行...所以我做了一个switch语句来确定id然后执行一些代码切换后...但我只是不知道如何在更改输入值后停止该事件...非常感谢您帮助我:D
  • 我似乎找不到正确的方法来完成这项工作...这是我更新的代码...jsbin.com/univom/13/edit

标签: javascript jquery events onchange


【解决方案1】:

您的代码的问题在于,在第一个文本框的更改事件中,您触发了第二个文本框的更改事件,从而进入了无限循环。您应该只使用以下内容:

$("#inch").val(convert);

和:

$("#millimeter").val(convert);

为了设置其他字段的值但不再次触发更改。

【讨论】:

    【解决方案2】:

    在 jsFiddle 上运行脚本时出现“超出最大调用堆栈大小”错误。这是因为您在内部调用 .change() 函数。我删除了它,它工作正常。

    小提琴:http://jsfiddle.net/EwdLs/

    $(".filter").change(function() {
        var value = this.value;
        var id = this.id;
        var convert = "";
    
        switch (id) {
        case "millimeter":
            convert = (value / 25.4).toFixed(2); //converts the value of input(mm) to inch;
            $("#inch").val(convert);
            break;
    
        case "inch":
            convert = (value * 25.4).toFixed(2); //converts the value of input(inch) to mm;
            $("#millimeter").val(convert);
            break;
    
        default:
            alert('no input has been changed');
        }
    
        alert(id + " triggered the change() event");
        //some code here....
    });
    

    【讨论】:

    • 我无法在小提琴中查看您的代码...请您在 textarea 中发布您的建议..
    【解决方案3】:

    如果您希望每个输入的更改也触发另一个输入的更改,但又不想陷入无限循环,请尝试以下一些变化:

    $(document).ready(function(){
       function applyChange(el, changeOther) {
          var value = el.value;
          var id = el.id;
          var convert,
              other = "";
    
          if (changeOther) {
             switch(id) {
                 case "millimeter":
                    convert = (value / 25.4).toFixed(2);
                    other = "#inch";
                 break;
    
                 case "inch":
                    convert = (value * 25.4).toFixed(2);
                    other = "#millimeter";
                    break;
    
                 default:
                    alert('no input has been changed');
                    break;
             }
    
             if (other != "") {
                $(other).val(convert);
                applyChange($(other)[0], false);
             }
          }
          alert(id+" triggered the change() event");
          //some code here....
       }
    
       $(".filter").change(function(){
          applyChange(this, true);
       });
    });
    

    如果不是很明显,我基本上把你现有的更改处理程序放在一个新函数中,applyChange,它有一个参数来告诉它是否递归。原样的代码很笨拙,但它应该让您大致了解一种方法来完成您似乎在问的事情。

    附:请务必添加一些验证,以确认用户输入的内容确实是一个数字。

    【讨论】:

    • 是的...这正是我要找的...不错的 nnnnnn ..谢谢!
    • 酷,乐于助人。就像我说的,它有点笨重,所以你可能想整理一下。不要忘记,一旦您得到满意的答案,请务必接受。
    • 我有一个后续问题......如果我有一个变量要在“毫米”案例旁边声明怎么办:convert = (value / 25.4).toFixed(2);其他=“#英寸”; anotherVar = "我的表";休息; case "inch": convert = (value * 25.4).toFixed(2);其他=“#毫米”; anotherVar = "myTable2";休息;如果它不通过开关,我该怎么做才能改变它的价值??...
    • 我的答案的本质是使用带有布尔参数的applyChange() 函数来防止无限循环。只要您在函数中的某个位置执行类似操作,您就可以根据需要随意移动所有内容:它是您的 代码。因此,对于您的后续问题,我将整个开关放在 if 语句中的唯一原因是因为发布的代码不需要开关,除非它继续再次调用 applyChange()。您可以通过将行 if (changeOther) { 向下移动到行 if (other != "") { 之前来取消该 if 语句。
    • 我似乎无法弄清楚它是如何工作的......请查看我的问题的更新......提前谢谢!
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2022-01-09
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多