LinkButtonから派生し、小さなjavascript関数をページにレンダリングするasp.netサーバーコントロールを作成しました。
このコントロールをページで何度も使用したいのですが、JavaScriptをページで1回だけレンダリングしたいだけです。一方で、将来的にjsファイルを追加するのを忘れたくないので、手動でjsファイルに追加するのではありません。
これを行うための最良の方法は何でしょうか?
LinkButtonから派生し、小さなjavascript関数をページにレンダリングするasp.netサーバーコントロールを作成しました。
このコントロールをページで何度も使用したいのですが、JavaScriptをページで1回だけレンダリングしたいだけです。一方で、将来的にjsファイルを追加するのを忘れたくないので、手動でjsファイルに追加するのではありません。
これを行うための最良の方法は何でしょうか?
Page.ClientScript.RegisterClientScriptBlock(..)などの登録メソッドを使用します。いくつかのオーバーロードがありますが、それらはすべて同じように機能します。発行されたコントロールインスタンスの数に関係なく、スクリプトを1回だけレンダリングするのは十分に賢い方法です。
MSDNドキュメントでのMicrosoftのコメント:
クライアントスクリプトは、そのキーとタイプによって一意に識別されます。同じキーとタイプのスクリプトは重複と見なされます。このページに登録できるのは、特定のタイプとキーのペアを持つ1つのスクリプトのみです。すでに登録されているスクリプトを登録しようとしても、スクリプトの複製は作成されません。
MSDNのドキュメントには、次のようなサンプルコードも含まれています。
// Check to see if the client script is already registered.
if (!cs.IsClientScriptBlockRegistered(cstype, csname2))
{
StringBuilder cstext2 = new StringBuilder();
cstext2.Append("<script type=text/javascript> function DoClick() {");
cstext2.Append("Form1.Message.value='Text from client script.'} </");
cstext2.Append("script>");
cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false);
}
さまざまな方法を使用して、さまざまな方法でクライアントスクリプトを登録できます。それぞれの詳細については、MSDNの各ClientScriptManager.RegisterClientScript *(..)メソッドを参照してください。これらはすべて、レンダリングされたページでの重複を防ぐために構築されています。
これにより、スクリプトを心配したり、追跡したりカウントしたりすることなく、制御レベルでスクリプトを出力する自由が得られます。
編集:
ClientScriptManagerインスタンスには、Page.ClientScriptプロパティを介してアクセスします。
Page.RegisterClientScriptBlockメソッドを使用できます。
これがMSDNの例です。
if (!this.IsClientScriptBlockRegistered("clientScript"))
{
// Form the script that is to be registered at client side.
String scriptString = "<script language=\"JavaScript\"> function DoClick() {";
scriptString += "myForm.show.value='Welcome to Microsoft .NET'}<";
scriptString += "/";
scriptString += "script>";
this.RegisterClientScriptBlock("clientScript", scriptString);
}
HTH
CDN上のスクリプトを参照し、それを複数回複製しないようにする方法はありますか?それとも、それはとにかく単なるポインタであり、ブラウザは(?)同じライブラリを2回ロードしないほど賢いので、心配する必要はありませんか?
つまり、サーバーコントロールから次のコードを挿入したいとします。
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
RegisterClientScriptBlockを使用する場合、IsClientScriptBlockRegisteredメソッドを使用して、サーバーコントロールに複数回ロードさせないようにすることができます。ただし、前述のコードは、別の(異なる)サーバーコントロールによって、またはサーバーコントロールの外部でjQueryを使用したい開発者によってページに配置された可能性があります。
開発者がすでにスクリプトをロードしている場合、サーバーコントロールにスクリプトをロードしないようにするにはどうすればよいですか?