【问题标题】:Uncaught RangeError: Maximum call stack size exceeded. Jquery Error未捕获的 RangeError:超出最大调用堆栈大小。 jQuery 错误
【发布时间】:2020-08-25 22:39:19
【问题描述】:

我的 HTML 中有一个动态无序列表。当我加载文件时,一些列表项被添加到 . 页面加载时my的格式是这样的。

<ul class="ui-front">
<li><div>1</div></li>
<li><div>2</div></li>
<li><div>3</div></li>
<li><div>4</div></li>
</ul>

现在我正在运行一个函数,当页面加载列表项的第一个子项被删除并且我试图在列表项中添加我的自定义 HTML 时。这是我的代码

$('.ui-front').on('DOMNodeInserted', 'li', function(e) {
    var arjuna="e.target.firstElementChild.innerHTML";
    e.target.removeChild(e.target.childNodes[0]);


    $(e.target).append('<hr style="margin-top:7px;margin-bottom:7px">');
});

根据这个函数,当一个新的列表项被插入时,这个方法就会被调用。但这给了我一个错误

Uncaught RangeError: Maximum call stack size exceeded

当我删除函数.append。一切正常意味着元素被删除,但每当我添加 .append 时,它都会给我错误。任何形式的帮助将不胜感激

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您收到该错误是因为您的事件正在触发:

    $('.ui-front').on('DOMNodeInserted', 'li', function(e)

    一旦你向 DOM 追加一个新节点,它就会不断地重新触发你的事件。这就是它超出调用堆栈的原因。

    “DOMNodeInserted 事件与 DOMNodeInsertedIntoDocument 事件类似,但它是在将节点添加到元素时发生的。”

    【讨论】:

    • 你能给我一个解决方案吗?实际上我正在尝试用我的html替换列表项的html
    • 如果您只是想调整样式,则使用 CSS 分配类,并根据您希望如何进行更改,使用事件侦听器添加/删除用于动态样式的类。您无需将节点附加到 DOM 即可完成设计更改。
    • 让我告诉你整个故事我有一个输入类型搜索当我更改搜索输入值时加载的建议列表.. 我只是想改变该建议列表的设计
    【解决方案2】:

    $(e.target).append 正在触发 DOMNodeInserted 事件。这是一个无限循环。

    【讨论】:

    • 你能给我一个解决方案吗?实际上我正在尝试用我的html替换列表项的html
    • 我对您的最终目标知之甚少,无法提供彻底的帮助,但我会研究 CSS 以制作看似边框/下划线的内容。我认为可以组合第一个元素选择器、最后一个元素选择器和边框来获得你想要的东西。
    • 让我告诉你整个故事我有一个输入类型搜索当我更改搜索输入值时加载的建议列表.. 我只是想改变该建议列表的设计
    • &lt;script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"&gt;&lt;/script&gt;我用过这个库
    【解决方案3】:

    现在从其他答案中清楚您的问题的原因,您的用例的一个可能解决方案是在第一次执行后删除事件侦听器(如果您确实只希望事件处理程序执行一次)。比如:

    $('.ui-front').on('DOMNodeInserted', 'li', function(e) {
        var arjuna="e.target.firstElementChild.innerHTML";
        e.target.removeChild(e.target.childNodes[0]);
    
        //disables the event handler after first execution
        $('.ui-front').off('DOMNodeInserted');
    
        //now this won't fire the event anymore :)
        $(e.target).append('<hr style="margin-top:7px;margin-bottom:7px">');
    });
    

    更多信息this SO question.

    编辑:我不太确定您想要的输出,但如果您所做的只是在目标&lt;li&gt; 下方插入一条水平线,那么这绝对可以仅使用 CSS (想想border-bottomtext-decoration: underline 或类似的)。

    【讨论】:

    • 不,这不是我的确切输出......但我试过你的它也不起作用
    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2013-05-17
    • 1970-01-01
    • 2013-07-08
    • 2012-08-15
    • 2012-03-30
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多