0

2つの可能な解決策がある問題が発生しています。どの解決策が「より正しい」かわかりません。

ページの上に開くモーダルダイアログがあります。このダイアログは、IDが「foo」の要素をホストします。

さて、それ自体はまったく問題ではありません。ただし、非ダイアログページには複数のタブがあります。一部のコンテンツの奥深くにあるこれらの他のタブの1つにも、ID「foo」があります。これにより、DOMツリーをトラバースするときに最初に検出される「foo」に応じて、奇妙で断続的な問題が発生します。

残念ながら、両方の値はまったく同じ方法でまったく同じ情報を示しています。唯一の違いは、ダイアログ内でホストされていることです。同じモデルが使用されているため、ViewModelによって同じIDが生成されています。

私は2つのことのうちの1つをすることができます:

  • これらのID作成メソッドの1つを明示的にオーバーライドして、ダイアログで生成されたIDが非ダイアログのIDと比較したときに一意になるようにします。
  • jQuery検索セレクターを変更して、ダイアログのフォームから内側にのみ読み取るようにします。ダイアログが予期しないDOM要素をキャプチャしないようにします。

2番目のアイデアがより良い方法のように思われます。トラバースするDOMノードが少なく、何もハッキングする必要はありません。ただし、知らない開発者にとっては、適切な領域から検索を開始しないと、誤ってこの問題が再発生する可能性があります。

ただし、同じ問題は、アプリケーションに取り組んでいるすべての開発者に言えることです。同じIDを作成しないように、ViewModelのID作成をオーバーライドすることを明示的に知る必要があります。

異なる形式でカプセル化されている場合、IDを繰り返すことは許容されますか?IDが一意であるという期待はどこで意味をなさなくなりますか?

IDは、MVCのEditorForHTMLHelperを介して生成されます。フォーム固有のIDを生成するようにこれをオーバーライドできますが、それは明らかにMVCの意図ではありませんでした。

<%= Html.EditorFor(model => model.CustomerDisplayName) %>

更新: IDの一意性を強制する必要があるようです。ただし、ASP.NET MVC3は、IDがDOMに一意であることを確認する簡単な方法を提供していないようです。フォームのIDを追加することはできますが、それによって巨大なIDが生成されます。それが最適な呼び出しかどうかはわかりません。何かご意見は?

4

4 に答える 4

7

異なる形式でカプセル化されている場合、IDを繰り返すことは許容されますか?

IDは一意である必要があります。そうしないと、ドキュメントが無効になります。

IDが一意であるという期待はどこで意味をなさなくなりますか?

IDが一意であるという期待は、意味をなさなくなりません。要素ごとに一意のIDを持つことは仕様の一部です。

于 2013-01-23T01:05:39.203 に答える
3

IDを管理できますか?もしそうなら、おそらくIDはそれを回避するための最も「適切な」方法ではありません。代わりにクラスを使用した場合は、次のようになります。

$("#DialogID .foo")

fooIDが重複する可能性なしにそれを選択します。上記のセレクターは、検索を指定されたダイアログ内に制限します。

于 2013-01-23T01:03:06.427 に答える
3

DOM要素のIDの一意性をどの程度強制する必要がありますか? 」という質問に対して、「一意のIDを強制しないでください」と大胆に答えます。

「冒涜!」と、パリサイ人がW3C聖書を激しく振って叫ぶのが聞こえます。しかし、私は現実の世界に住んでいます。

1.それは不可能です。
IDの一意性を保証する大規模なWebサイトを作成することは事実上不可能です。最新のWebサイトは、プラグイン、広告、ウィジェットなど、関係のないコンポーネントから構成されています。ページ上の他のIDの存在を知らなくても、すべて独自のIDセットを使用します。技術的には、一意のIDは、ある種のGUIDを使用することによってのみ強制できます。もちろん、IDにクラス名または親IDを修飾、接頭辞、または接尾辞として付けて、それを長い階層構成IDに変換することもできます。実際、これはそれほど悪い習慣ではありません。ただし、保証はありません。結論。

2.それはあなたのせいではありません。
私の後に繰り返してください:「それは私のせいではありません...それは私のせいではありません...」。W3Cチームが、現実の世界を見ずに、これをあまりにも単純化した教義を生き続けていることは、知的に怠惰で苛立たしいことだと思います。彼らはこのルールを実施する方法を提案していますか?もちろんそうではありません-それは彼らの仕事ではありません。彼らはスペックを書くだけです。しかし、誰も法を守らないのなら、私たち全員が邪悪で運命にあるか、あるいは法自体に責任があります。それで、もう一度、私の後に繰り返してください:「それは私のせいではありません...それは私のせいではありません...」。

3.少しの創造性、おそらく?
その厳格なルールを調整して実用的な解決策を考え出す方法は本当にありませんか?スペックにあるのか、それともブラウザに実装されているのか?「idスコープ」の形式?名前空間?

4.ダーウィンは「生き残るためには適応する必要がある」と言っています。
現実の世界で生き残るための唯一の方法は、すべての欠陥を伴って、現実の世界に適応することです。いくつかの生存アドバイス(すでに他の人が示唆しているように):

  • IDを一意にすると、エラーが発生する可能性が低くなります。
  • IDを検索するときは、ページに重複がある可能性があると想定してください。したがって、検索を可能な限り制限してください。

今私を石で打ってください、私はあなたをあえてします。

于 2013-06-10T20:19:40.573 に答える
1

IDの一意性を100%強制する必要があります

DOMでは、IDがID内で一意である必要があります。そうでない場合、IDは無効になります。また、その要件に違反すると、奇妙な、場合によっては断続的なエラーが発生します。

前述のように、コンテキストに基づいてIDを変更する方法を導入することも、クラスを組み合わせて、たとえばセレクター<div class="main foo"><div class="dialog foo">使用して「div.main.foo」を見つけることができるようにすることもできます。または「div.dialog.foo」-または「div.foo」だけを使用して両方を取得します

于 2013-01-23T01:10:55.257 に答える