无法构建' CustomElement' JavaScript文件放在头部时出错

时间:2017-05-07 21:25:54

标签: javascript html5 custom-element

我有一个像这样定义的自定义元素:

class SquareLetter extends HTMLElement {
    constructor() {
        super();
        this.className = getRandomColor();
    }
}
customElements.define("square-letter", SquareLetter);

当JavaScript文件包含在HTML <head>标记中时,Chrome控制台会报告此错误:

  

未捕获的DOMException:无法构造&#39; CustomElement&#39;:结果必须没有属性

但是当JavaScript文件包含在</body>结束标记之前时,一切正常。原因是什么?

<head>
    <script src="js/SquareLetter.js"></script> <!-- here -->
</head>
<body>
    <square-letter>A</square-letter>
    <script src="js/SquareLetter.js"></script> <!-- or here -->
</body>

2 个答案:

答案 0 :(得分:0)

当CreatElement与CustomComponent一起使用时,我会遇到相同的问题。直到我删除了构造函数中的所有东西,但超级函数才改为connectedCallback函数,该问题才得以解决。

答案 1 :(得分:0)

在大多数情况下,问题在于您试图创建一个元素,该元素在首次添加到DOM时会神奇地具有属性,这对于HTML元素而言并不是预期的行为。考虑一下:

 async function data(pathToCsv) {
        return await d3.csv(pathToCsv, function (data) {
            data.year = +data.year
            data.running_total = +data.running_total
            data.date = new Date(data.year, 0)
            return data
        })
   };

  async function init() {
     let dataset = await data('q3.csv');
     // this should work now assuming you are using d3 function correctly as i'm not aware of d3 functions myself
     console.log(dataset.year); 
  }

  init()

对于div和所有其他元素类型,您将永远不会创建一个已经具有诸如之类的属性的DOM元素。在使用private async void baslatKontrol_CheckedChanged(object sender, EventArgs e) { RegistryKey rk = Registry.CurrentUser.OpenSubKey ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); string yol = Path.Combine(Environment.CurrentDirectory, "Asistanim.exe"); if (baslatKontrol.Checked) { rk.SetValue(yol, Application.ExecutablePath); veri.Baslat = true; await JsonVeriden(veri); } else { rk.DeleteValue(yol, false); veri.Baslat = false; await JsonVeriden(veri); } } 创建元素之后,总是添加类和所有其他属性,例如:

const div = document.createElement("div");
document.body.append(div);

.createElement()将永远不会创建已经具有属性(例如类)的元素。自定义元素也是如此。 因此,如果发生以下情况,这将是意外的:

const div = document.createElement("div");
div.className = "random-class";
document.body.append(div);

添加了一个.createElement()之类的DOM元素。 您不应该在实际的自定义元素中添加类之类的属性。如果要添加属性和样式,则应将shadowRoot附加到元素上,然后添加一个div,例如,可以在其中添加所需的任何属性,同时使实际的自定义元素不包含属性。