【发布时间】:2021-02-17 00:14:01
【问题描述】:
我正在尝试动态创建一个输入元素并在将其添加到 DOM 之前为其附加一个 jquery.ui 自动完成控件。我通常创建动态元素的方式似乎是创建 Cannot read property 'element' of undefined 错误,我不知道为什么。
$(document).ready(() => {
const content = document.getElementById('content');
const input = document.createElement('input');
const inputFromTemplate = createFromTemplate(`<input></input>`);
console.log(input);
console.log(inputFromTemplate);
$(input).autocomplete({
source: ['one', 'two', 'three']
});
$(inputFromTemplate).autocomplete({
source: ['one', 'two', 'three']
});
content.append(input);
content.append(inputFromTemplate);
});
function createFromTemplate(template) {
const htmlTemplate = document.createElement('template');
htmlTemplate.innerHTML = template;
return htmlTemplate.content.firstElementChild.cloneNode(true);
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<div id="content"></div>
在上面的代码示例中,当我使用document.createElement('input') 方法创建input 元素时,自动完成控件会毫无问题地附加。
当我使用自己的createFromTemplate 方法创建input 元素时,会引发上述错误。
注销到控制台时,这两个元素看起来相同,但似乎在console.log 触发之前附加了自动完成控件(您可以通过按原样运行,然后注释掉.autocomplete 代码行来查看这一点并查看登录到控制台的input 代码的差异)。
我认为我对 jquery 如何将控件附加到元素的理解是有缺陷的,因为我不明白为什么两者之间会有差异。
(注意:是的,这是一个简单的复制,我想使用像 createFromTemplate 这样的函数的原因是因为实际输入是更大的 html 模板的一部分,所以将 document.createElement 方法链接在一起是行不通的发生)。
编辑: 只是为了解决当元素首先附加到 DOM 时它工作的问题,不幸的是,在我正在处理的项目的情况下,这不是一个选项。 Something akin to this issue was reported and fixed in a previous version of jquery.ui back in 2012,所以很可能是库的错误
【问题讨论】:
-
如果你重新安排你的逻辑,以便定义自动完成 after 将元素附加到 DOM 它工作正常:jsfiddle.net/9bsyemzd - 我现在无法不过,请解释为什么在创建元素的方法之间会出现这种差异。
-
@RoryMcCrossan 是的,但就我而言,这不是一个选择。这是一项涉及重新编写非常大的块代码的工作,我不明白为什么这是一个问题。 2013 年(我认为)在 jquery 错误板上列出了一个错误,列出了与未附加元素相同类型的问题,但已解决。这是我创建似乎导致问题的元素的方式所特有的。
-
这是你想要的@DarkHippo 吗? jsfiddle.net/6k2do9vb
-
@CarstenLøvboAndersen 不错的尝试,但不行,因为在附加自动完成控件之前我无法将生成的元素附加到 DOM(见上面的评论)
-
当我运行你的代码时,我确实看到了错误:
jQuery.Deferred exception: this.menu is undefined小部件通常需要 DOM 中的元素。将检查是否可以预先创建该元素。
标签: javascript jquery jquery-ui jquery-ui-autocomplete