parseInt(x,10)导致最大callstack /太多递归错误

时间:2016-03-23 14:40:17

标签: javascript jquery recursion

我有一个简单的JS函数,可以根据2个输入值更新隐藏的文本框。

在更新隐藏文本框之前,我使用parseInt(x,10)来验证输入是否为数字,如果不是,我将值设置为0.

为什么这会导致过多的递归错误?

  $(function () {
        $("#payment-form").on("submit",function (e) {

            var xDollars = $("#dollars").val();
            var xCents = $("#cents").val();
            //collect our form dollar and cents values, set to 0 if not int
            if (parseInt(xDollars, 10) == "NaN") {
                $("#dollars").val("0");
            }
            if (parseInt(xCents, 10) == "NaN") {
                $("#cents").val("00");
            }

            //join dollars and cents and submit transaction amount
            $("#TransactionAmount").val(xDollars + "." + xCents);
            $("#payment-form").submit();
            return true;
        });
    });

2 个答案:

答案 0 :(得分:7)

parseInt()导致您的问题不是 $("#payment-form").submit(); ,而是这样:

true

您正在触发"提交"来自"提交"内部的行动处理程序。

如果验证成功,您只需返回String url = "http://10.10.10.166:8080/SystemManagement/api/Profile/Login"; JSONObject jsonObject=new JSONObject(); try { jsonObject.put("user_id","Test user name"); jsonObject.put("user_password","test password"); } catch (JSONException e) { e.printStackTrace(); } System.out.println(jsonObject.toString()); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Toast.makeText(Login.this, response.toString(),Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println(error.toString()); } }); //add request to queue queue.add(jsonObjectRequest); ,表单应正常提交。

答案 1 :(得分:2)

这是因为jQuery无法区分您是通过submit事件还是通过.submit()方法提交表单。因此,如果您使用jQuery的$.submit(),它将手动触发submit事件。

使用vanilla-js代替。根据{{​​3}},如果您使用.submit()

,则不会触发该事件
  

如果未设置从Form submission algorithm方法标志提交的,则   气泡和可取消的submit()命名   {em>形式的submit 。如果阻止事件的默认操作(即   如果事件被取消)则中止这些步骤。否则,继续   (实际上默认操作是执行提交)。

因此,这不会有问题:

document.getElementById('payment-form').submit();

但在这种情况下,您只需删除$("#payment-form").submit();即可。如果您不取消活动,则应自动提交表格。