特定の名前のカスタム要素が登録されているかどうかを検出しようとしています。そのようなチェックを行う方法はありますか?
または、登録されたカスタム要素のリストを取得する方法はありますか?
ありますが、他に何document.registerElement
がありますか?一方向の API ですか?
特定の名前のカスタム要素が登録されているかどうかを検出しようとしています。そのようなチェックを行う方法はありますか?
または、登録されたカスタム要素のリストを取得する方法はありますか?
ありますが、他に何document.registerElement
がありますか?一方向の API ですか?
要素が登録されたかどうかを確認する方法があります。登録された要素には独自のコンストラクターがありますが、登録されていない要素はコンストラクターにプレーンHTMLElement()
を使用します (またはHTMLUnknownElement()
、名前が有効でないかどうかに関係なく、これは問題の範囲外です)。
document.registerElement('x-my-element');
document.createElement('x-my-element').constructor
//⇒ function x-my-element() { [native code] }
document.createElement('x-my-element-not-registered').constructor
//⇒ function HTMLElement() { [native code] }
つまり、チェッカーは次のようになります。
var isRegistered = function(name) {
return document.createElement(name).constructor !== HTMLElement;
}
または、シンタックス シュガーを使用すると、次のようになります。
String.prototype.isRegistered = function() {
return document.createElement(this).constructor !== HTMLElement;
}
'x-my-element'.isRegistered()
//⇒ true
'xx-my-element'.isRegistered()
//⇒ false
最も慎重なバージョン:
String.prototype.wasRegistered = function() {
switch(document.createElement(this).constructor) {
case HTMLElement: return false;
case HTMLUnknownElement: return undefined;
}
return true;
}
'x-my-element'.wasRegistered()
//⇒ true
'xx-my-element'.wasRegistered()
//⇒ false
'xx'.wasRegistered()
//⇒ undefined
私の知る限り、登録済み要素のリストにアクセスする方法はありません。
ところで、try- catched 登録 (@stephan-muller によって提案された) の方がニーズに合っていると思います。
カスタム要素は最新の標準の一部になったので、2017 年以降にこれを行う方法を共有したいと思いました。
注: この
document.registerElement
関数は廃止され、customElements.define() が優先されました。
customElements
でグローバルとして定義されwindow
ます。3 つのメソッドが定義されています。
define
get
whenDefined
get
ここが重要です。get
要素名の を受け取り、string
指定されたカスタム要素のコンストラクタを返しますundefined
。名前のカスタム要素定義がない場合は、コンストラクタを返します。
したがって、2017 年以降、要素が登録されているかどうかを確認するには、次のようにします。
const myElementExists = !!customElements.get('my-element');
ただし、定義された要素のリストを取得する方法があるかどうかはわかりません。
注:これは IE では機能しません。対応ブラウザはこちら
他の Web コンポーネント フレームワークに当てはまるかどうかはわかりませんが、Chrome で Polymer を使用しているCustomElements
ときに、オブジェクトにオブジェクトがありwindow
ます。オブジェクトには、 と呼ばれるすべての登録済みカスタム要素のCustomElements
キー/値のコレクションがありますregistry
。
function isRegistered(name) {
if (window.CustomElements && window.CustomElements.registry)
return name in window.CustomElements.registry;
return undefined;
}
Polymer の Slack チャンネルに既に書かれているように、これは仕事をすることができる汚いものです:
function isElementRegistered(elementId) {
return Polymer.telemetry.registrations.find(function(item) { return item.is === elementId })
}
ただし、どれだけPolumer.telemetry.registrations
信頼できるかはわかりませんが(ドキュメントで見たことがありません)、Array.prototype.find
クロスブラウザーではありません!
カスタム要素クラス (コンストラクター) が要素を自己登録するシナリオでは、クラスの存在を確認するだけで十分です。