Websinte のこの構造を考えると
<html>
<head>
<!-- CSS at the beginning-->
<link/>
</head>
<body>
<div id="mainContainer">
<div id="side"></div>
<div id="content">
<!-- DHTML awesomeness happens here -->
</div>
</div>
<!-- Scripts at the end -->
<script/>
<script>
/* code that attach the JS logic to the HTML items */
</script>
</body>
</html>
通常の Web ナビゲーションを使用すると、ページは完全に HTML でレンダリングされます。プログレッシブ エンハンスメント アプローチに従って、最後に特定の ID やクラスを探し、JavaScript と特に jQuery を使用して動的な動作を与えます。この拡張コードは、外部スクリプトがダウンロードされた後、本文の最後に発生します。
では#content
、多くの jQuery AJAX インタラクションが発生し、サーバーから他の部分ビューを取得してページに挿入するものもありますが、それらの ID とクラスを再度探して、JavaScript オブジェクトをこの新しい要素にアタッチする必要があります。
コントローラー、イベント ハンドラーなどを、既にそれらを持っているオブジェクトに再適用したくないため、非常に面倒な場合があります。
これまでのところ、私が見つけた唯一の解決策は、私の部分的なビューに入れられています:
@if(Request.IsAjaxRequest())
{
<script>
/* code that attach the JS controllers to the HTML items of this view */
</script>
}
たとえば、必要に応じ$('input.date').datepicker()
て新しい要素を動的に追加すると<input type="text" class="date"/>
、jQuery文を再実行しない限り、新しい要素には日付ピッカーがありません。
たとえば、#content
私が持っていることを考えると<input type="text" class="date"/>
:
jQuery の datepicer を初めて機能させるには、外部宣言の後
$('input.date').datepicker()
に , の最後で呼び出す必要があります。<body>
<script>
ページが新しい要素である部分ビューをダウンロードする場合、
<input type="text" class="date"/>
ajax 呼び出しのビューに初期化呼び出しを配置する必要があります。
したがって、コードの繰り返しで終わります。これは、C# のように簡単にコードをリファクタリングできない JS では特に望ましくありません。
これは、これを達成するためのより良い方法があるかどうか疑問に思って、先週私を夢中にさせているものです. より良いテクニック、または他の全体的なアプローチ?
Web アプリケーションをどのように構築しますか?
敬具。
PS:イベントに関連するだけでなく、.live()
またはのようなものがあればいいですね。.delegate()
DOM に何かが追加されるたびに jQuery/browser が発生させるイベントはありませんか?