1

私は多くのXML操作を含むHTML5アプリケーションを作成しています。この操作の一部には、2つの異なるXML要素のバージョンの比較が含まれます。

必要なのは、バージョン情報が関連付けられた状態で作成され、通常のElement、Attr、またはTextNodeのように動作できるすべてのElement、Attr、およびTextNode(すべてNode、AFAIKから継承)オブジェクトです。バージョン情報を保存するために使用している現在の実用的なソリューションは次のとおりです。

Node.prototype.MyAppAnnotation = {
        Version : null
};

これで、組み込み型の拡張は悪い形式と見なされることを理解しましたが、この手法を超えて、目的の機能を取得する方法がわかりません。ラッパーで公開されるノード関連のプロパティと関数が必要なため、ノードをラッパーにカプセル化できるとは思いません。ラッパー用にある種のパススルー関数を書くことができるかもしれませんが、それは本当に不格好なようです。

私が書いているアプリはHTML5アプリであり、最新のブラウザー(すべてが組み込みの拡張をサポートしている)でのみ実行する必要があるため、この手法が適切であると感じています。また、拡張オブジェクトに十分にあいまいな名前を付けることで、すべての名前の衝突(意図的な衝突を除く)を回避できます。また、GoogleのClosureライブラリを使用した継承ベースのソリューションについても検討しました。ただし、Element、Node、およびTextNodeには直接コンストラクターがないため(つまり、Documentオブジェクトから作成されているため)、この手法も機能しないようです。

誰かがa)Elementを拡張せずにこの効果を達成するためのエレガントな方法を推奨するか、b)この場合「組み込みを拡張しない」ルールを破るべきではないという説得力のある理由を提供できるかどうか疑問に思いました。

どうもありがとう、Jarabek

4

1 に答える 1

1

あなたの考えは理論的には正しいのですが、それについて読んでいると奇妙な感じがします。

まず第一に、プロトタイプを拡張する必要はありません。そのまま行けばsomedomnode.myweirdname='foo'、そのオブジェクトのフィールドになります。それが javascript の機能です ;) したがって、バージョンがない場合は、null ではなく未定義になります。

しかし、より多くの機能を追加したり、DOM ノードを何かにラップしたりする場合は、それを行った歴史が少しあります。その歴史のほとんどは、jQuery のようなものによって支配されています :)

ノードを含むフィールドを持つオブジェクトを作成するだけです。そして、本当に簡単にアクセスできます:

myobject.node

そして、いくつかのコンストラクターまたは単にファクトリー関数を使用してオブジェクトを作成します。

var myobject = createDomNodeWrapper(domnode)

于 2012-10-01T18:23:17.557 に答える