2011-07-11 22 views
3

次のコード行は、SharePoint Webサイトのユーザーコントロールにあります。部分的なポストバック後にRegisterClientScriptCodeが機能しない

ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "jquery144", "<script type=\"text/javascript\" src=\"/_layouts/Unicre.Web.RUOnline.Controlos/Scripts/jquery-1.4.4.min.js\"></script>", false); 
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "javascriptgeral", "<script type=\"text/javascript\" src=\"/_layouts/Unicre.Web.RUOnline.Controlos/Scripts/javascript.js\"></script>", false); 

なぜ機能しないのですか?私はまた、応答で生成されたHTML内のそれぞれのスクリプトタグを見つけることができません。

問題はアップデートパネルと関係があります。部分的なポストバックの後、Javascriptは機能しなくなります。上記のコードでは動作しませんか?

(私もRegisterClientScriptInclude方法を試してみましたが、同じ結果に。)

+0

ねえindependend問題が何であるか、あなたはここにタイプミスがありますから。<スクリプトタイプ= \ "テキスト/ javascript \ " – Kirill

+0

OK、この恥ずかしい!私はいつかそれを見ていて、タイプミスを見つけることができません。それはどこにある? –

+0

申し訳ありませんが、私のせいです。スラッシュとバックスラッシュを混ぜるだけです。もう一度申し訳ありません:) – Kirill

答えて

6

これは、部分的なポストバックで仕事に行くされていません。スクリプトはPage_Loadに登録する必要があります。ユーザーコントロールでLoadイベントにアタッチし、そのハンドラからScriptManager.RegisterClientScriptBlock()を呼び出します。 Javascriptが

アンUpdatePanelの部分ポストバック動作しなくなった部分ポストバック後

は、UpdatePanelの <div>コンテンツのDOMの更新です。これは、以前の内容が失われたことを意味します。そのため、 <div>に含まれるインラインスクリプトの状態は失われます。

は、より多くの情報のためhereを参照してください:

のUpdatePanelは、innerHTMLのDOMプロパティを通じてクライアント上でその作業を行います。デルタはサーバーから取得され、既存のDOMでそれ自身を見つけ出し、コンテンツを破棄して、innerHTMLを介して新しいコンテンツを割り当てます。 ...しかし、インラインスクリプトはこのように動作しません。 DOM要素のinnerHTMLをスクリプトブロックを含むHTMLに設定しても、そのスクリプトは実行されません。

同様に、UpdatePanelアップデートでScriptManager.RegisterClientScriptBlock()を呼び出すと、ページの読み込みのように動作しません。 <script>要素をUpdatePanelの内容に直接追加できますが、実行されません。

あなたはadding an endRequest handler to the PageRequestManagerによって部分ポストバック後にJavaScriptコードを呼び出すことができます

更新:

<script> 
function load() { 
    //register the handler 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 
} 
//this handler will execute after a partial postback 
function EndRequestHandler(){ 
    //...arbitrary code... 
} 
window.onload = load; 
</script> 
+0

申し訳ありません@Just M. Keyes、しかし私は動作しない理由を参照してください。私はそれをどのように機能させるべきですか?ところで、私はHelloWorld()のようなインラインスクリプト関数を実行できます。しかし、この場合、私がする必要があるのは、javascriptファイルを呼び出すことです。そのようなことをどうすればいいのですか? –

+1

最初のサーバ側の 'Page_Load'で' ScriptManager.RegisterClientScriptBlock() 'を呼び出す必要があります(これは毎回行う必要があるので、'!IsPostBack'をチェックしないでください)。次に、UpdatePanelの更新後にのみ実行したい特定の関数がある場合は、上記の更新された答えに示されている 'add_endRequest()'アプローチを使用してください。 –

+0

そうですね、私はすでにそのコールバックを使用していました。問題は、重複したコードを作成しなければならなかったことです。そのため、JavaScriptファイルを参照したいのですが、少なくとも問題は解決されています。ありがとう! –

関連する問題