我有一个实用函数,可以将 HTML 插入到 div 中,然后调用 javascript 初始化函数,将事件处理程序附加到插入的 HTML 中的各种元素。这些函数在 90% 的情况下都可以正常工作,但在下面的 jquery html() 调用中会定期失败。当失败时,HTML 会被正确插入,但下一行的代码永远不会到达。
function loadSection(id, url, initializer = null, param = null) {
const $div = $('#' + id);
return $.ajax({
method: 'GET',
url: url,
})
.done(function (html) {
$div.html(html);
if (initializer) { // This line is never reached.
initializer(param);
}
});
}
如果我使用 $div.empty().append(html) 而不是 $div.html(html) ,也会发生同样的故障,因此问题不在于 html() 函数本身。事实上,如果我单步执行 html() 代码,它会执行 this.empty().append(value) 并且永远不会返回到调用函数。
插入的html可能包含设置变量值,但不直接调用任何javascript函数。
我已经在 StackOverflow 和网络上进行了相当详尽的搜索,但一无所获。我还跟踪了 jQuery 代码,但无法确定问题所在。谁能告诉我为什么会失败?
<小时/>一些问题的答案:
它是确定性的。失败的案例总是会失败,反之亦然。
我知道代码成功了,因为代码执行到了 $div.html(html)。并且GET中返回的html是正确的。
调用方式示例:
函数loadNewContracts() { loadSection('prospector-newContracts', '../newContracts', initNewContracts); }
每个部分的初始化器都不同。关键点是初始化器永远不会被调用。
正确的初始值设定项已传递到函数中并且确实存在。
唯一在HTML标签中设置变量值。没有调用js函数。成功的调用也会设置变量值。标签中没有循环。
$div 变量在所有情况下都存在。
最佳答案
Barmar 很接近,给了我解决这个问题的想法。 html 中设置的 js 变量是在 jinja2 模板中生成的。一个不存在的值被传递给模板,因此脚本最终看起来像......
var currentValue = ;
...所以js在加载html时失败。另一位也以类似的方式失败了。由于最近在服务器代码中引入了错误,这些失败了。
回想起来很明显,但我忽略了它,因为你无法破坏 .谢谢,巴马尔!
关于javascript - jQuery html() 未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45889202/