1

組織の登録メンバーが使用する外部アップロードのコンテンツに基づいて、一連の ajax フォームと単純な js hide/show div を処理する Web ページ (php) があります。より保守しやすく拡張可能なサイトを構築するために、私はアーキテクチャ パターンを使用して無限の jQuery 連鎖を防ぐことを検討してきました。つまり、メディエーター パターンです。

Jack Lawson のMediator.jsを使用した人はいますか? 基本的に、メディエーターにサブスクライブして、同じチャネルで何かが発行されたときに実行される関数を使用して「チャネル」(名前空間) をリッスンできます (必要に応じて、応答する前に述語の true/false 関数をチェックすることもできます)。

目標: mediator.js API には大きな可能性があり、有効な xhtml ドキュメントを実装して名前空間を正しく使用する必要があるようです。メディエーター パターンを実装することは、javascript コードを分離し、将来的に複雑な Web アプリをより保守しやすく拡張しやすくするための優れた方法のように思えます。

フラストレーション: 名前空間と mediator.js API によって実装されるメディエーター パターンの両方を理解していると思います。特定の「チャネル」(名前空間) でメディエーターを介して DOM 属性イベントを正常に発行し、それらのチャネルにサブスクライブしてそれらに反応することができました。対応が必要かどうかを確認します。しかし、新しい名前空間が原因で、CSS が要素を認識できなくなりました。

次のような名前空間を作成しました。

<xmlns:active='http://www.xxx.com/tracks/active'  
xmlns:completed='http://www.xxx.com/tracks/completed'  
xmlns:inactive='http://www.xxx.com/tracks/inactive'>

そして、それらを次のような html 要素に適用します。

<active:div ...>stuff</active:div>

それに応じてcssファイルを変更しました:

active|div {   css formatting }

それでも、ページの css フォーマットは壊れています。

レンダリングされたページの doctype 部分は次のようになります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

これが必須ではないかどうかは完全にはわかりませんが、追加しようとしました:

<? header('Content-Type: application/xhtml+xml'); ?>

次の XML 解析エラーが発生します。

XML 解析エラー: 整形式ではありません

これは、この名前空間定義の等号をxmlns:active='http://www.xxx.com/tracks/active'問題として指摘していますが、私が読んだすべてのドキュメントは、これが正しい構文であることを示しています。

質問:

  1. 上記の名前空間を実装した後、CSS が壊れるのはなぜですか?
  2. ヘッダーに を追加する<? header('Content-Type: application/xhtml+xml'); ?>と、前述の解析エラーが発生するのはなぜですか?

助けてくれてありがとう。

4

1 に答える 1

2
  1. 上記の名前空間を実装した後、CSS が壊れるのはなぜですか?

    @namespaceXML 名前空間に対応する宣言を追加する場合、名前空間は CSS 内でのみ解決できます。これは仕様で説明されています。

    @charsetスタイルシートに次のステートメントが含まれていることを確認し、適切な場所 (すべての および@importの直後) に配置します。

    @namespace active 'http://www.xxx.com/tracks/active';
    

    残りの名前空間のスタイルがある場合は、それらも含める必要があります。

    @namespace completed 'http://www.xxx.com/tracks/completed';
    @namespace inactive 'http://www.xxx.com/tracks/inactive';
    
  2. ヘッダーに を追加する<? header('Content-Type: application/xhtml+xml'); ?>と、前述の解析エラーが発生するのはなぜですか?

    これは、ヘッダーを追加すると、XHTML ページが XML でシリアル化されたドキュメントとして提供されるためです。ちなみに、XHTML は XML から派生したものであるため、XHTML ページはこのように提供されるはずです。ヘッダーを含めない場合、通常、サーバーはヘッダーをtext/html代わりに送信します。つまり、XHTML は XML パーサーではなく、HTML タグ スープ パーサーを介して実行されます。

    XML の構文解析規則は非常に厳格です。構文エラーが 1 つあると、ドキュメント全体が表示されなくなります。不正な形式のxmlns宣言があるように見えるため、XHTML ページが正しくレンダリングされません。一方、HTML 構文規則の柔軟性と寛大さを考えると、ブラウザーは、マークアップで深刻な構文問題に遭遇したとしても、エラー メッセージを吐き出すことはありません — エラーを通り抜けて推測をしようとするだけです。意図されたDOM構造が何であったか。

    エラー自体に関しては、属性は属性であるため、独自の要素ではなくxmlns開始タグの一部である必要があるように見えます。html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:active="http://www.xxx.com/tracks/active"  
          xmlns:completed="http://www.xxx.com/tracks/completed"  
          xmlns:inactive="http://www.xxx.com/tracks/inactive">
    

    最後に、そのヘッダーが必要です! これがないと、XHTML は The Way It Should Be™ で解析されないため、CSS 名前空間も機能しません。

于 2012-07-18T17:45:58.677 に答える