Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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 如何使用shadowdom创建聚合自定义元素,以便访问它';树影根?_Javascript_Polymer_Web Component_Shadow Dom_Polymer Cli - Fatal编程技术网

Javascript 如何使用shadowdom创建聚合自定义元素,以便访问它';树影根?

Javascript 如何使用shadowdom创建聚合自定义元素,以便访问它';树影根?,javascript,polymer,web-component,shadow-dom,polymer-cli,Javascript,Polymer,Web Component,Shadow Dom,Polymer Cli,我已使用Polymer cli(版本0.16.0)构建Polymer项目,但无法使用控制台访问shadow root: var element=document.getElementsByTagName(“我的应用程序”)[0]。shadowRoot返回未定义,因此看起来shadow DOM处于关闭模式 如何强制自定义元素使用开放模式,以便从外部访问其shadowRoot 编辑2: 这里的主要问题是访问shadowRoot需要做些什么,所以我稍微改变了这个问题,使其与shadowdom模式无关

我已使用Polymer cli(版本0.16.0)构建Polymer项目,但无法使用控制台访问shadow root:

var element=document.getElementsByTagName(“我的应用程序”)[0]。shadowRoot
返回未定义,因此看起来shadow DOM处于关闭模式

如何强制自定义元素使用开放模式,以便从外部访问其shadowRoot

编辑2: 这里的主要问题是访问shadowRoot需要做些什么,所以我稍微改变了这个问题,使其与shadowdom模式无关

编辑:

参考“高级主题上的关闭模式”部分

重现场景的步骤:

npm install -g polymer-cli
mkdir my-app
cd my-app
polymer init starter-kit
polymer serve --open
一些代码片段:

index.html:

...
<head>
...
    <script>
      // Setup Polymer options
      window.Polymer = {
        dom: 'shadow',
        lazyRegister: true
      };

      // Load webcomponentsjs polyfill if browser does not support native Web Components
      (function() {
        'use strict';

        var onload = function() {
          // For native Imports, manually fire WebComponentsReady so user code
          // can use the same code path for native and polyfill'd imports.
          if (!window.HTMLImports) {
            document.dispatchEvent(
              new CustomEvent('WebComponentsReady', {bubbles: true})
            );
          }
        };

        var webComponentsSupported = (
          'registerElement' in document
          && 'import' in document.createElement('link')
          && 'content' in document.createElement('template')
        );

        if (!webComponentsSupported) {
          var script = document.createElement('script');
          script.async = true;
          script.src = '/bower_components/webcomponentsjs/webcomponents-lite.min.js';
          script.onload = onload;
          document.head.appendChild(script);
        } else {
          onload();
        }
      })();

      // Load pre-caching Service Worker
      if ('serviceWorker' in navigator) {
        window.addEventListener('load', function() {
          navigator.serviceWorker.register('/service-worker.js');
        });
      }
    </script>

    <link rel="import" href="/src/my-app.html">
...
</head>
<body>
    <my-app></my-app>
</body>
</html>
。。。
...
//设置聚合物选项
窗口聚合物={
dom:“影子”,
懒汉:没错
};
//如果浏览器不支持本机Web组件,请加载webcomponentsjs polyfill
(功能(){
"严格使用",;
var onload=函数(){
//对于本机导入,手动激发WebComponentsReady so用户代码
//可以为本机导入和多填充导入使用相同的代码路径。
如果(!window.HTMLImports){
document.dispatchEvent(
新的CustomEvent('WebComponentsReady',{bubbles:true})
);
}
};
var webComponentsSupported=(
文档中的“registerElement”
&&document.createElement(“链接”)中的“导入”
&&document.createElement(“模板”)中的“内容”
);
如果(!WebComponents受支持){
var script=document.createElement('script');
script.async=true;
script.src='/bower_components/webcomponentsjs/webcomponents lite.min.js';
script.onload=onload;
document.head.appendChild(脚本);
}否则{
onload();
}
})();
//加载预缓存服务工作者
if(导航器中的“serviceWorker”){
addEventListener('load',function()){
register('/service-worker.js');
});
}
...
my-app.html:

...
<dom-module id="my-app">

<template>
...
</template>

  <script>

    Polymer({

      is: 'my-app',

      properties: {

        page: {
          type: String,
          reflectToAttribute: true,
          observer: '_pageChanged'
        }

      },

      observers: [
      '_routePageChanged(routeData.page)'
      ],

      _routePageChanged: function(page) {
        this.page = page || 'view1';
      },

      _pageChanged: function(page) {
        // Load page import on demand. Show 404 page if fails
        var resolvedPageUrl = this.resolveUrl('my-' + page + '.html');
        this.importHref(resolvedPageUrl, null, this._showPage404, true);
      },

      _showPage404: function() {
        this.page = 'view404';
      }

    });

  </script>

</dom-module>
。。。
...
聚合物({
是:“我的应用程序”,
特性:{
第页:{
类型:字符串,
reflectToAttribute:true,
观察者:''u pageChanged'
}
},
观察员:[
“_routePageChanged(routeData.page)”
],
_routePageChanged:功能(第页){
this.page=page | |“view1”;
},
_页面更改:功能(第页){
//按需加载页面导入。如果失败,则显示404页面
var resolvedPageUrl=this.resolveUrl('my-'+page+'.html');
this.importHref(resolvedPageUrl,null,this.\u showPage404,true);
},
_showPage404:函数(){
this.page='view404';
}
});
如果使用shady DOM(默认),则没有
shadowRoot

请参见如何启用阴影DOM

像这样的东西应该有用

var element = Polymer.dom(document.getElementsByTagName("my-app")[0]).root

有关更多详细信息,请参见实际上它应该可以工作。请参阅下面的代码片段

也许您没有在正确的位置添加
{dom:'shadow'}
设置。它应该在
polymer.html
之前定义

output.textContent=document.querySelector('my-app')。shadowRoot

窗口聚合物={
dom:“影子”,
懒汉:没错
}
你好
聚合物({
是:“我的应用程序”
})

您可以添加一些代码什么是打开和关闭模式?还要注意,如果您想在Firefox上多填充Shadow DOM,您应该下载webcomponents.js,而不是不包含Shadow DOM多填充的webcomponents-lite.js。控制台中写了什么?编辑以包含DOM设置:它被定义为“Shadow”
var element=Polymer.dom(document.getElementsByTagName(“我的应用”)[0])。root
还从控制台返回未定义的值启用卷影dom时,不需要
Polymer.dom(…)
document.getElementsByTagName(“我的应用程序”)[0]
返回什么?
document.getElementsByTagName(“我的应用程序”)[0]
返回
#shadow root(open)
带.root或.shadowRoot或带Polymer.dom它返回未定义的谷歌浏览器linux版本53.0.2785.116(64位)Mozilla Firefox linux 49.0.1抱歉,不知道。我只在Dart中使用Polymer,不知道在JS中使用它的细节。我没有编辑代码,它是在问题中的“复制场景的步骤”部分搭建的。而且测试是在浏览器控制台上运行的,我也认为它应该运行,但是如果你认为问题不是你的错,那么不要在编辑器的网站上打开问题