Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Ace编辑器创建自定义HTML元素?_Javascript_Html_Web Component_Ace Editor_Custom Element - Fatal编程技术网

Javascript 如何使用Ace编辑器创建自定义HTML元素?

Javascript 如何使用Ace编辑器创建自定义HTML元素?,javascript,html,web-component,ace-editor,custom-element,Javascript,Html,Web Component,Ace Editor,Custom Element,我正在尝试使用包含Ace编辑器实例的Web组件创建自定义HTML元素。我尝试的解决方案如下 customElements.define("test-editor", class extends HTMLElement { constructor() { super(); const editorContainer = document.createElement("div");

我正在尝试使用包含Ace编辑器实例的Web组件创建自定义HTML元素。我尝试的解决方案如下

 customElements.define("test-editor", class  extends HTMLElement {
      constructor() {
           super();

           const editorContainer = document.createElement("div");
           editorContainer.setAttribute("id", "editor_container");

           const root = this.attachShadow({mode: "open"});
           root.appendChild(editorContainer);
      }

      connectedCallback() {
           ace.edit("editor_container");
      }
 });
然后我尝试在下面的HTML中使用这个自定义元素(custom_element.js包含上述内容)


html,正文,#编辑器#容器{
宽度:100%;
身高:100%;
}
当我在Chrome或Firefox中加载此页面时,控制台中出现以下错误

未捕获错误:ace.edit找不到div#editor_容器
在Object.t.edit(ace.js:1)
在HTMLElement.connectedCallback(custom_element.js:17)上
在custom_element.js:3


是否有任何方法可以将Ace Editor的实例嵌入到自定义元素中?

您已将shadowDOM附加到组件中

因为ACE编辑器代码加载在页面DOM(绿色)中,
它只能在页面DOM(绿色)中找到ACE容器

注意:您在pageDOM中也有
。这将永远不会在阴影中设置元素的样式。
shadowDOM的全部本质是封装

见:

有两个选项可使ACE编辑器在自定义元素中工作:
  • 使用shadowDOM,确实需要大量脚本。但是您可以在一个页面中获得多个编辑器。见:

  • 不使用阴影域
    (当我们进行此操作时,让元素加载所有依赖项):


define(“我的编辑器”,类扩展了HtmleElement{
connectedCallback(){
常量脚本=document.createElement(“脚本”);
script.src=“//cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js”;
script.onload=()=>{
this.innerHTML=`${myEditor.innerHTML}`;
ace.edit(“编辑器容器”{
模式:“ace/mode/javascript”,
主题:“ace/主题/钴”
});
}
document.head.append(脚本);
}
});
html,
身体,
#编辑器容器{
宽度:100%;
身高:100%;
}

您已将shadowDOM附加到组件

因为ACE编辑器代码加载在页面DOM(绿色)中,
它只能在页面DOM(绿色)中找到ACE容器

注意:您在pageDOM中也有
。这将永远不会在阴影中设置元素的样式。
shadowDOM的全部本质是封装

见:

有两个选项可使ACE编辑器在自定义元素中工作:
  • 使用shadowDOM,确实需要大量脚本。但是您可以在一个页面中获得多个编辑器。见:

  • 不使用阴影域
    (当我们进行此操作时,让元素加载所有依赖项):


define(“我的编辑器”,类扩展了HtmleElement{
connectedCallback(){
常量脚本=document.createElement(“脚本”);
script.src=“//cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js”;
script.onload=()=>{
this.innerHTML=`${myEditor.innerHTML}`;
ace.edit(“编辑器容器”{
模式:“ace/mode/javascript”,
主题:“ace/主题/钴”
});
}
document.head.append(脚本);
}
});
html,
身体,
#编辑器容器{
宽度:100%;
身高:100%;
}
在ace存储库中使用影子dom的方法不多

重要的部分是将dom元素而不是字符串传递给edit方法 调用

还有在ace存储库中使用影子dom的方法

重要的部分是将dom元素而不是字符串传递给edit方法 打电话

 <!DOCTYPE html>
 <html lang="en">
 <head>
      <meta charset="UTF-8">
      <style>
           html, body, #editor_container {
                width: 100%;
                height: 100%;
           }
      </style>
 </head>
 <body>
      <test-editor></test-editor>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js"></script>
      <script src="custom_element.js"></script>
 </body>
 </html>