9

私には、あなたができることは少し奇妙に思えます。

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);

その後、JavaScriptの登録を解除したり、プログラムによるレンダリングを停止したりすることはできません。

なぜマイクロソフトはこれを行うのでしょうか?

この回避策は好きではありません 。http://hemant-vikram.blogspot.com/2005/11/unregister-startup-script-workaround.html

そして、私はそれを再登録して何もしないというオプションが好きではありません。

考え?

4

4 に答える 4

10

実際には、あなたが思っているよりも悪いです。「再登録して何もしない」という選択肢もありません。registerメソッドは、スクリプトがそのキーにすでに登録されているかどうかを確認し、登録されている場合は何もしません。を呼び出すとRegisterStartupScript、そのスクリプトのレンダリングを停止することはできません。

RegisterStartupScriptマイクロソフトがそれを行った理由については、登録されたスクリプトを変更または削除する可能性は、最初に設計されたときに単に忘れられていたと思います。設計上の選択により、たまたま戻って登録解除メソッドを作成するのは簡単ではなかったので、それを行うには正当な理由が必要になります。

スクリプトを登録すると、ClientScriptManager内の2つの場所に保存されます。ListDictionaryを使用すると、スクリプトがすでに登録されているかどうかを確認でき、ArrayListは、実際のスクリプトをレンダリング時に保存します。ArrayListは、スクリプトが登録された順序でレンダリングされるようにするために使用されると思いますが、ArrayListのどの文字列がどのキーに属しているかがわからないことも意味します。

MaybeAddStartupScript(key,script)独自のページクラスにとのメソッドを装備することはそれほど難しくありませんChangedMyMindAboutThatStartupScript(key)。キーとスクリプトを独自の辞書に保存してから、PreRenderに、これまでに作成したスクリプトを登録します。ただし、自分でやらなければならないのは確かに面倒です。

于 2009-08-25T15:26:44.973 に答える
5

次のような条件で、(すでに登録されている)スクリプトを「登録解除」したいと思います。

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);
...
if(condition)
    Page.ClientScript.UnregisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);

これを単純に次のように変更できないのはなぜですか。

if(!condition)
    Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);
于 2009-08-25T14:20:39.673 に答える
2

よく調べてみたところ、イベントに基づいて登録済みのスクリプトを1回だけ実行したい場合は、問題の解決策を見つけました。問題が実際に何であったかを理解するのに役立った@stevemegsonのここでの回答に特に感謝します。

このソリューションには、Sys.Application.add_loadremove_loadjavascriptメソッドが含まれます。

それはこのように動作します。最初にworker関数を呼び出し、次にそれ自体を削除するジェネリックjavascript関数が最初のステートメントであり、次にadd_loadその関数を呼び出してフォローアップします。

protected void Button1_Click(object sender, EventArgs e)
{
    var script = @"<script language='javascript'>
                       function f(){ MyWorkerFunction(); 
                                     Sys.Application.remove_load(f);}; 
                       Sys.Application.add_load(f);
               </script>";

    ClientScript.RegisterStartupScript(GetType(), 
                                   "MyWorkerFunctionKey", 
                                    script, 
                                    false);
}

これはtelerikソリューションに基づいています。これはtelerikコントロールを参照しますが、すべての機能はASP.NETです。

于 2014-04-09T17:58:30.907 に答える
0

Asp.Net UpdatePanelによって(動的に)追加されたJavascript関数を上書きするにはどうすればよいですか?

updatepanelを使用することはjsを上書きするための解決策の1つだと思います。更新パネルを使用する場合、JavaScriptは部分的なポストバックで実行されないため、コードで登録する必要があります。

    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest(someFunciton);

これを行わない場合は、更新パネルの部分的なポストバックで、変更された関数を再度登録/レンダリングできます。このような場合、機能の範囲に問題があります。

英語でごめんなさい。

于 2017-11-15T07:31:16.737 に答える