私はpolymerでコンポーネントを次のように定義しました:
<polymer-element name="my-component">
<template>
<div id='test'>CONTENT</div>
</template>
</polymer-element>
たとえば、シャドウDOMにアクセスしたいとします。たとえば、div id = 'test'のコンテンツを取得するには
var x = $("div#test").html();
指定されたコードは機能しません。 jqueryでシャドウDOMにアクセスできますか?
いいえ、Polymer要素の外側ではありません。
Polymerを読んだ後は、Polymer要素内のスクリプトでPolymer要素のシャドウDOMにしかアクセスできないようです。 自動ノード検索 に関するPolymerドキュメントはこう言います:
Id属性でタグ付けされたコンポーネントのシャドウDOM内のすべてのノードは、コンポーネントのthis。$ハッシュで自動的に参照されます。
つまり、<script>
タグを兄弟として<template>
の兄弟として追加できます。ここで、this.$.test
は必要な要素です。
<polymer-element name="my-component">
<template>
<div id='test'>CONTENT</div>
</template>
<script>
Polymer('my-component', {
logNameValue: function () {
console.log('polymer element', this.$.test);
console.log('jQuery wrapper of polymer element', $(this.$.test));
}
});
</script>
</polymer-element>
$('body /deep/ your-selector')
パターンを使用して、シャドウDOMを突き抜け、その内部でJqueryを機能させることができます。
pdate:これまでのところ、これはデスクトップでchromeでのみ機能します。他のブラウザは/ deep /コンビネータをサポートしていないと思います。
更新2:/deep/
Combinatorは非推奨であり、今後は使用しないでください。 Chromeから削除される予定です。
これはうまくいくと思います...
$('polymer-element::shadow #test')
chromeでのみテストしました
私はChromeのshadowRoot要素に次のようにアクセスできます:
$("#idOfElementInShadowRoot", $("#idOfShadowRootElement").shadowRoot)
この問題を解決するために、TypeScriptで簡単なヘルパーを作成しました。
class DomUtils {
public static getShadowElementById(id: string):any {
try {
// Try to get it by simple id in case of browser doesn't support shadow DOM
var element = $("#" + id);
if (element.length <= 0) {
// Support Chrome browser
element = $("body /deep/ #" + id);
}
return element;
} catch (error) {
console.log("Error: " + error + ", while trying to get shadow element with id: " + id);
return null;
}
}
}
使用法:
var element = DomUtils.getShadowElementById('mainContainer');
デスクトップのChrome、Internet Explorer、Firefoxでテスト済み
このようなものを使用してください:
jQuery.fn.extend({
shadowRoot: function() {
return $(this.get(0).shadowRoot);
},
});
そして呼び出す:
$("my-element").shadowRoot());
これは、シャドウルートでキャプチャを変更するための単純な関数です
const get_captcha = (CustomElement)=>{
var src = `./app/create_captcha/${chance.natural()}`;
var rootElement = $(CustomElement)[0].shadowRoot;
var captchaElement = $(rootElement).find('#img_captcha');
$(captchaElement).attr('src',src);
};