DOM要素(HTMLやSVG要素など)に実行時に動的に、つまりユーザーの入力に基づいて属性をプログラムで追加する必要があります。属性が標準のものであればそのまま使用しますが、そうでない場合、つまりカスタム属性に変換する必要がある場合は、「data-」という接頭辞を追加します。属性が標準HTML(またはSVG)で有効かどうかを確認
文字列が「標準/標準」DOM属性を表すかどうかを判断する方法はありますか?例えば
、次のように私はSVG矩形を持っていると言う:
<rect x="10" y="10" width="80" height="40" stroke="black"/>
注塗りつぶしの色が(まだ)指定されていないこと。二つの属性を追加すること
ユーザーの要求:
fill="red"
が- という名前の属性「価格(接頭辞が存在しないことに注意)が得値「赤」と「満たす」という名前の属性、
data-price="expensive"
を得なければならない 『高価な、"値を』
は、どのように私は動的にこれら二つを区別しない(data-
接頭辞に注意してください)? fill
属性は現在のDOM要素には存在しないため、その名前の属性に既存の値があるかどうかを確認することはできません。プレフィックスを付けずに属性を作成すると、エラーがスローされるかどうかを確認することもできないと私は信じていません。少なくとも現在のブラウザ(Chrome v61.0)では属性を追加できますこれはベストプラクティスではありませんが、price="expensive"
(data-
の接頭辞なし)です。
私は、次のような何かをしたい:
const elementNodeName = "rect";
const attributeName = "height"; // or, e.g. "price"
const nameIsValid = testAttributeNameValidity(elementNodeName, attributeName);
if (!nameIsValid) attributeName = 'data-' + attributeName;
はそこに任意の既存のtestAttributeNameValidity
型の機能はありますか?
私はjavascript
とタグ付けしました.Javascriptソリューションを探しています。
** UPDATE:私は非のための有効な属性名のtrue
とfalse
を返すことになっているattributeName in document.createElement(elementNodeName)
を使用してみましたthe suggested link in the commentsに基づいてHTMLではなくSVG **
内の他のSO答える作品からソリューション有効なもの。 HTML要素に有効な属性名 "id"を使用すると(<p>
)、このアプローチが有効です。
これとは対照的に、私はまだこのアプローチをSVGで動作させていません。 createElement
をcreateElementNS
に変換しようとしましたが、それでも問題を解決していないようです。以下の私のテストコードを参照してください。テストコードの重要な機能は、testHtmlAttributeNameValidity
とtestSvgAttributeNameValidity
です。コードを実行してコンソールの出力を確認すると、HTMLで正しく動作することが示されます。つまり、id="someId" data-price="expensive"
が生成されます。しかし、SVGでは、望ましくない出力しか生成しません:data-fill="yellow" data-price="expensive"
。
違いがある場合は、Chrome v61で作業しています。
テストコード:正しくコードが起こらない、黄色に黒の塗りつぶし矩形を変更する必要があり作業
const testHtmlAttributeNameValidity = (elementNodeName, attributeName) => {
return (attributeName in document.createElement(elementNodeName));
};
const testHtmlAttributeName = (attributeName, attributeValue) => {
const elementNodeName = "p";
const nameIsValid = testHtmlAttributeNameValidity(elementNodeName, attributeName);
if (!nameIsValid) attributeName = 'data-' + attributeName;
const element = document.querySelector(elementNodeName);
element.setAttribute(attributeName, attributeValue);
};
testHtmlAttributeName("id", "someId");
testHtmlAttributeName("price", "expensive");
console.log(document.querySelector('div').innerHTML);
const svgNS = "http://www.w3.org/2000/svg";
const testSvgAttributeNameValidity = (elementNodeName, attributeName) => {
return (attributeName in document.createElementNS(svgNS, elementNodeName));
};
const testSvgAttributeName = (attributeName, attributeValue) => {
const elementNodeName = "rect";
const nameIsValid = testSvgAttributeNameValidity(elementNodeName, attributeName);
if (!nameIsValid) attributeName = 'data-' + attributeName;
const element = document.querySelector(elementNodeName);
element.setAttribute(attributeName, attributeValue);
};
testSvgAttributeName("fill", "yellow");
testSvgAttributeName("price", "expensive");
console.log(document.querySelector('svg').innerHTML);
#someId {
color: green;
}
<svg height="55">
<rect x="10" y="10" width="80" height="40" stroke="red"/>
</svg>
<div>
<p>Hello world</p>
</div>
。
に関連するようです[DOM要素および/または属性が有効であるかどうかを確認するには?](https://stackoverflow.com/questions/33584700/how-to-check-if -dom-element-and-or-attribute-is-valid) –
これがXHTMLが作られた理由です。しかし、誰もがHTMLを好んで墓に投げかけている。 – BoltClock
@ShreyanshGandhi、私はそのリンクを見て、それは私の問題を解決するようだ。しかし、私はそれを実装することができないようですが、希望の結果をもたらさないテストコードを含む私の質問へのアップデートに示されています。さらに、私はHTMLのための標準の 'createElement'とsvgのためのより特定的な' createElementNS'の両方を使ってみました...どちらもうまくいきませんでした。 –