Javascript jQuery ajax post未捕获范围错误:超过最大调用堆栈大小

Javascript jQuery ajax post未捕获范围错误:超过最大调用堆栈大小,javascript,jquery,Javascript,Jquery,我对jQueryAjax有一个问题。 我有javascript <script type="text/javascript"> $(function() { $('body').on("click", "#pager a", function(e) { e.stopPropagation(); e.preventDefault(); var a = $(this);

我对jQueryAjax有一个问题。 我有javascript

 <script type="text/javascript">
    $(function() {
        $('body').on("click", "#pager a", function(e) {
            e.stopPropagation();
            e.preventDefault();
            var a = $(this);
            var model = $('#searchForm').serialize();
            $.ajax({
                url: '/Product/Products',
                type: 'POST',
                data: {
                    model: model, page: a
                },
                success: function (data) {
                    alert('success');
                    $('#productsList').html(data);
                }
            });
        });
    });
</script>

$(函数(){
$('body')。在('click'),“#pager a”,函数(e){
e、 停止传播();
e、 预防默认值();
var a=$(本);
var model=$('#searchForm').serialize();
$.ajax({
url:“/Product/Products”,
键入:“POST”,
数据:{
型号:型号,页码:a
},
成功:功能(数据){
警惕(“成功”);
$('#productsList').html(数据);
}
});
});
});

这段代码产生错误“UncaughtRangeError:超出了最大调用堆栈大小”,我不明白为什么。我没有触发器,我使用了preventDefault和stopPropagation,但我仍然有这个错误。有人能帮我吗?

你需要去掉
var a=$(这个)。我不知道您试图在那里实现什么,但是使用jQuery包装的clicked元素作为请求数据是没有意义的。

不是使用var a=$(这)来获取页面,而是使用一个隐藏字段并为字段提供页面值

<input type="hidden" value="xyzpage" id="pageValue">

var pageVal = $("#pageValue").val();

data: {
         model: model, page:pageVal 
      },

var pageVal=$(“#pageValue”).val();
数据:{
型号:型号,页码:pageVal
},

这将解决问题,我想

如果您在数据中传递某个未在该范围内定义的内容,也可能会出现此错误。
另一个原因是直接用val()传入数据。

无休止的循环也会导致这种错误。查看函数中没有调用相同的函数。

我在使用jquery.tmpl.js解析一大块JSON时遇到了这样的问题。使用concat()函数处理大型数组时会出现此错误。以下是问题的链接: 这一问题自2011年以来一直没有得到解决。为了解决这个问题,我必须编辑jquery-3.3.1.js javascript库文件。对于那些想重复此决定的人,请执行以下操作:在库文件
return concat.apply([],ret)中找到以下行并用下面的代码替换它

        // Flatten any nested arrays
        if ([].flat) return ret.flat();


        var ret2 = [];

        ret.forEach(function (i) {

            if (i instanceof Array) {

                i.forEach(function (i2) {
                    ret2.push(i2);
                });

            } else {
                ret2.push(i);
            }

        });

        return ret2;

        // original code:
        // return concat.apply([], ret);
        // chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=103583

我们检查浏览器的武库中是否有一个flat()函数,例如,它有一个chrome浏览器,如果有,只需合并数据数组,就不需要更多了。如果没有,浏览器将走慢一点,但至少不会出现错误。

我想分享我的经验

在我的例子中,这只是一个错误的参数名称和完全相同的错误消息: 而不是confID,我输入了configID并得到了这个错误

 function openNameEditor() {
    var confID = $("#configStatusList").attr("data-id");
    debugger;
    $.ajax({
        url: '@Url.Action("GetModelNameToChange", "Admin")',
        type: "GET",
        dataType: "HTML",
        data: { configID: configID},//Here, instead of confID, I put configID which doesn't exist in the function.
        success: function (response) {
            $("#name-editor").html(response);
        },
        error: function (er) {
            alert(er.error);
        }
    });

}

真奇怪。我看不出这段代码为什么会产生这样的结果。你在其他地方没有其他代码吗?你能编辑你的问题并添加你的HTML吗?帮助我们重现错误。您将
页面:a
作为您提交的数据的一部分,其中
a
是jQuery对象-您希望它做什么?页面上有多少
(即嵌套在
#pager
中)?发布你的html<代码>#寻呼机
听起来像是某种分页。例如,如果分页显示中有数千个页面(例如?page=1、?page=2、50、100、1000),所有页面都用
引用,那么绑定~x
元素上的单击处理程序可以轻松填充堆栈。“使用事件上下文(由此表示)作为jQuery选择器”-但
这不是事件,这是对事件发生的元素的引用。是的,你是对的,我的错。但是仍然尝试发送jQuery包装的元素作为请求数据是很奇怪的。这很奇怪,是的,但这可能与
最大调用堆栈
错误无关。我在一个测试中测试了,显然你是对的。出于某种原因,在ajax调用中发送jQuery对象会使其陷入混乱。不管怎么说,当你说将整个jQuery对象发送到任何地方都没有任何意义时,你也是对的,因为它根本没有意义:)谢谢!我直接用.val()传递数据,但在一个属性中我忘记了add.val(),您的注释为我节省了很多时间!非常感谢,这确实是因为
.val()
在匆忙开发代码时忽略了
.val()
。。这个答案救了我。。非常感谢。