【问题标题】:The code is jumping to an uncalled function代码正在跳转到一个未调用的函数
【发布时间】:2019-09-24 09:11:44
【问题描述】:

我有这个代码,我可以在其中填写不同数量的订单。我可以创建更多输入以创建更多数量来计算它们。但是由于某种原因,当我在其中一个中按 Enter 键以创建另一个输入/条目时,它会进入重置功能,该功能会擦除每个字段。它不应该在按键时调用重置函数。

var intId = 0;
var maindiv = $("#maindiv");
var divpeso ="";
var inputnumber ="";
var fieldname = "";
var removeButton = "";


function anadir_input() {
    // var lastField = $("#container div:last");
    intId = intId + 1;
    divpeso = $("<div class=\"input-group mb-3\" id=\"divpeso" + intId + "\"/>");

    inputnumber = $("<input id=\"peso" + intId + "\" type=\"number\" class=\"form-control\" name=\"peso" + intId + "\" maxlength=\"5\" size=\"5\" step=\".01\" />");
    fieldname = $("<div class=\"input-group-append\"><span class=\"input-group-text\">Peso" + intId + "</span></div>");
    removeButton = $("<input type=\"button\" class=\"btn btn-outline-danger\" value=\"Quitar\" />");

    removeButton.click(function () {
        $(this).parent().remove();
    });
    inputnumber.keypress(function (e) {
           if (e.which == 13) {
           console.log("enter apretado");
        }
    });

    divpeso.append(inputnumber);
    divpeso.append(fieldname);
    divpeso.append(removeButton);
    $("#container").append(divpeso);
};

$(document).ready(function () {

    $("#anadir").click(function () {
        anadir_input();
    });

    $("#reset").click(function () {
        console.log("reset");
        $('[id*=divresultado]:visible').each(function () {
            $(this).remove();
        });
        $('[id^=peso]:visible').each(function () {
            $(this).val('');
        });
        $('[id^=divpeso]:visible').each(function () {
            $(this).remove();
        });
        intId = 0;
    });


    $("#resultado").click(function () {
        var pesosordenados = [];
        var capacidad = Number($("#capacidad").val());
        var pesos = [];
        capacidad = $("#capacidad").val();
        $('[id*=divresultado]:visible').each(function () {
            $(this).remove();
        });
        $('[id^=peso]:visible').each(function () {
            if ($(this).val() != 0 || $(this).val() != null || $(this).val() != undefined)
                pesos.push($(this).val());
            pesosordenados = pesos.sort(function (a, b) {
                return b - a
            });
        });

        var contenedores = [];
        var sobrepesos = [];

        //algoritmo para rellenar los contenedores con los distintos pesos.
        while (pesosordenados.length > 0) {
            var unidadcontenedor = [];
            var pesosnousados = [];
            var restcapacidad = Number(capacidad);
            for (var i = 0; i < pesosordenados.length; i++) {
                if (Number(pesosordenados[i]) > capacidad) { //si el peso es mas grande que la capacidad del contenedor
                    sobrepesos.push(Number(pesosordenados[i]));
                } else {
                    if (Number(pesosordenados[i]) <= restcapacidad && restcapacidad >= pesosordenados[pesosordenados.length - 1]) {
                        unidadcontenedor.push(Number(pesosordenados[i]));
                        restcapacidad = restcapacidad - Number(pesosordenados[i]);
                    } else {
                        pesosnousados.push(pesosordenados[i]);
                    }
                }

            }
            contenedores.push(unidadcontenedor);
            pesosordenados = pesosnousados;
        }


        for (var m = 0; m < contenedores.length; m++) {
            var divresultado = $("<div id=\"divresultado\" class=\"calculadora\"></div>");
            var titulo = $("<h5 class=\"card-title\">Contenedor " + (Number(m) + 1) + "</h5>");
            var contpesorelleno = $("<h5 class=\"card-title\">Peso cargado: " + contenedores[m].reduce((a, n) => (a + Number(n)), 0) + "</h5>");
            var contpesolibre = $("<h5 class=\"card-title\">Peso libre: " + (Number(capacidad) - Number(contenedores[m].reduce((a, n) => (a + Number(n)), 0))) + "</h5>");

            divresultado.append(titulo);
            divresultado.append(contpesorelleno);
            divresultado.append(contpesolibre);
            for (var n = 0; n < contenedores[m].length; n++) {
                var resultfield = $("<div class=\"input-group-append\"><span class=\"input-group-text\">" + contenedores[m][n] + "</span></div>");
                divresultado.append(resultfield);
            }
            maindiv.append(divresultado);
        }


//para sumar toda una array: arrayloquesea.reduce((a, n) => (a + Number(n)), 0)


    });


});

你有JSFiddle here

重现步骤:

-按下绿色按钮“Añadir peso”。

-点击创建的输入框并回车。

创建了另一个输入字段,但重置功能将它们全部删除。

编辑:

我在 html 中使用 type="reset" 以及在 js 的按键功能中使用 e.preventDefault(); 解决了这个问题。但是,它不会显示带有结果的 div maindiv.append(divresultado);

【问题讨论】:

  • 您是否添加了另一个与现有对象具有相同 id 的对象?
  • reset 未被调用。如果您删除重置处理程序,您将获得相同的行为。您的逻辑是在其他地方擦除我们的数据数组。
  • @StevenSpungin 当我在浏览器上使用 F12 并使用停止点时(抱歉,我不知道它们在英语中是如何称呼的)我可以看到它在重置函数内跳转。

标签: javascript function


【解决方案1】:

一切都很好,只是在重置按钮中缺少 type="reset"。

  <button type="reset" id="reset" class="btn btn-danger cincuw">Reset</button>

【讨论】:

  • 我这样做了,现在当我按下 Enter 时,代码会创建另一个输入,然后执行 $("#resultado").click(function ()... 它应该像我一样执行这部分m 没有点击“Resultado”按钮。
【解决方案2】:

不,它没有重置,你没有提供输入值开始,你的 js $("#anadir").click() 函数应该是这样的:

$("#anadir").click(function () {
     anadir_input($('input[name="capacidad"]').val());
});

anadir_input函数应该把传入的输入值:

function anadir_input(inputValue) {
    // var lastField = $("#container div:last");
    intId = intId + 1;
    divpeso = $("<div class=\"input-group mb-3\" id=\"divpeso" + intId + "\"/>");

    inputnumber = $("<input id=\"peso" + intId + "\" type=\"number\" class=\"form-control\" name=\"peso" + intId + "\" maxlength=\"5\" size=\"5\" step=\".01\" value='"+inputValue+"' />");
    fieldname = $("<div class=\"input-group-append\"><span class=\"input-group-text\">Peso" + intId + "</span></div>");
    removeButton = $("<input type=\"button\" class=\"btn btn-outline-danger\" value=\"Quitar\" />");

    removeButton.click(function () {
        $(this).parent().remove();
    });
    inputnumber.keypress(function (e) {
           if (e.which == 13) {
           console.log("enter apretado");
        }
    });

    divpeso.append(inputnumber);
    divpeso.append(fieldname);
    divpeso.append(removeButton);
    $("#container").append(divpeso);
};

我已更改您的小提琴以查看输出差异:https://jsfiddle.net/z4sgnr28/

我希望它有意义

【讨论】:

  • 输入为空是因为要手动引入数字。是不是我需要把价值放在首位。让我更好地解释一下:顶部输入值(24300)是容器的最大容量。上面创建的输入是权重,必须手动输入。在您分享的小提琴中,问题仍然存在,如果我在其中一个创建的输入上按 Enter,所有内容都会被删除。
  • 无法编辑,但我的意思是“下面创建的输入是权重”。
  • 我已经更新了小提琴,对不应该提交表单的按钮使用'type="button"'并使用表单提交属性来显示结果。查看更新的小提琴,现在它显示了一些其他错误,您可以将其作为您的代码解决。
  • @Germán 运气好吗?你检查过我在你的小提琴中所做的最新更改吗?
  • 我删除了所有提交并在每个“类型”中输入了一个名称。现在它工作正常。感谢您的帮助!
猜你喜欢
  • 2016-11-09
  • 2014-07-07
  • 1970-01-01
  • 2010-09-26
  • 2018-05-14
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多