質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

9611閲覧

required属性の、attributeでの操作とpropertyでの操作の違いについて

maisumakun

総合スコア145184

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

1グッド

1クリップ

投稿2017/07/31 08:43

コードは取りあえず動く状況なのですが、気持ちが良くないし、正しいのかわからないので質問します。

プロジェクトで使っているjQueryをバージョン3まで上げるために、jQuery 3.2.1とjQuery Migrate 3.0.0を導入しました。

古いライブラリで警告を出るものは手を入れていったりしていたのですが、1つだけ、「果たしてこれを直す必要はあるのか」と言うものが出てきました。

JQMIGRATE: jQuery.fn.removeAttr no longer sets boolean properties: required

AttributeとPropertyの区別は重々承知ですし、selectedcheckedみたいにユーザー操作で値が変わるものは正しい方を操作しないといけないのもわかってはいます。ただ、requiredについてこの2つの操作を区別する意味があるのかが、よくわかりません。

  • requiredの値の意味(有効/無効)を、attributeとpropertyで違えられる事例
  • property操作のほうが性能がいいなどの評価
  • その他、attributeで操作すべきでない理由

などがありましたら、ご教示いただけましたら幸いです。

x_x👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

(2017/08/02 20:47追記) 仕様を勘違いしていた為、本文を大幅に変更しました。

required 属性

The accept, alt, max, min, multiple, pattern, placeholder, required, size, src, and step IDL attributes must reflect the respective content attributes of the same name. The dirName IDL attribute must reflect the dirname content attribute. The readOnly IDL attribute must reflect the readonly content attribute. The defaultChecked IDL attribute must reflect the checked content attribute. The defaultValue IDL attribute must reflect the value content attribute.

(意訳)
accept、alt、max、min、multiple、pattern、placeholder、required、size、src、およびstep IDL属性は、同じ名前のそれぞれのコンテンツ属性を反映(reflect)しなければならない(MUST)。

反映(reflect)は後述の「反映型IDL属性 (Reflecting content attributes)」を参照しています。

反映型IDL属性 (Reflecting content attributes)

If a reflecting IDL attribute is a boolean attribute, then on getting the IDL attribute must return true if the content attribute is set, and false if it is absent. On setting, the content attribute must be removed if the IDL attribute is set to false, and must be set to the empty string if the IDL attribute is set to true. (This corresponds to the rules for boolean content attributes.)

(意訳)
反映型IDL属性(Reflecting content attributes)が boolean 属性の場合、IDL属性を取得すると、content属性が設定されている場合はtrueを返し、存在しない場合はfalseを返さなければならない(MUST)。
IDL属性がfalseに設定されている場合はコンテンツ属性を削除し、IDL属性がtrueに設定されている場合は空の文字列に設定しなければならない(MUST)。
(これは boolean content 属性のルールに相当する。)

まとめ

required 属性は「反映型IDL属性 (Reflecting content attributes)」の為、required プロパティと同様の結果を得ることが出来ます。
ただし、他所からIDL属性が変更された場合は属性値に空文字(falsy)がセットされる為、注意が必要です。

HTML

1<form> 2 <input type="text" /> 3 <input type="submit" value="submit" /> 4</form> 5<script> 6'use strict'; 7var input = document.querySelector('input[type=text]'); 8 9console.log(input.getAttribute('required')); // null (required 属性は存在しない) 10console.log(input.attributes.getNamedItem('required')); // null (required 属性は存在しない) 11input.required = true; 12console.log(input.required); // true (反映型IDL属性の規定によって、required 属性が作成され、値は "" になる) 13console.log(input.getAttribute('required')); // "" (required 属性は存在する) 14console.log(input.attributes.getNamedItem('required')); // [object Attr] required="" (required 属性は存在する) 15</script>

つまり、次のコードの評価値は常に等価となります。

JavaScript

1input.required; 2input.getAttribute('required') !== null; 3Boolean(input.attributes.getNamedItem('required'));

if 文に適用すると、次のコードになります。

JavaScript

1// good 2if (input.required) { 3 // 処理 4} 5 6// good 7if (input.getAttribute('required') !== null) { 8 // 処理 9} 10 11// bad 12if (input.getAttribute('required')) { 13 // 処理 14} 15 16// good 17if (input.attributes.getNamedItem('required')) { 18 // 処理 19}

仕様上、getAttributeattributes.getNamedItem で required 属性を参照する事に問題はありません。
が、getAttribute だけは直観的でない為、直観的でシンプルな required プロパティが使われる傾向はあると思います。
後は使う人が判断する事になります。

Re: maisumakun さん

投稿2017/08/02 09:12

編集2017/08/02 11:49
think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/08/02 10:01

自分でもちょくちょく検証してみたのですが、空文字列というfalsyな値になることを除けば、「propertyと連動している」んですよね…(propertyでfalseにすると、attributeはnullになります)
think49

2017/08/02 10:25

失礼しました。 確かに getAttribute が null を返さないという事は required 属性が存在する事の保証になりますね。 仕様を読み直してきます。
think49

2017/08/02 11:49

親記事を大幅に編集しました。
guest

0

###removeAttr()じゃなくてprop()使えってさ!

2年前にこういうやりとりがありました
https://github.com/jquery/jquery/issues/1759

jQuery Migrate Plugin - Warning Messages
https://github.com/jquery/jquery-migrate/blob/master/warnings.md#jqmigrate-jqueryfnremoveattr-no-longer-sets-boolean-properties

投稿2017/07/31 15:08

IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問