2011-12-01 87 views
4

在ASP.NET中點擊按鈕後,我需要一個JavaScript來執行其操作。我試圖OnClientClick功能,但與此事件的問題是第一OnClientClick功能發生,然後OnServerClick功能發生,即第一個JavaScript函數運行,然後C#代碼執行,但我需要以相反的順序首先我需要執行的C#代碼,然後我不得不運行JavaScript。我在我的代碼中使用AJAX.NET和ScriptManager。無論如何,scriptmanager能幫助我嗎?否則如何在服務器端運行JavaScript。在服務器端運行javascript

我需要在下面的方式。

Button1_Click(object sender, EventArgs e) 
{ 
    ListBox1.Items.Add(TextBox1.Text); //for example 
    ` here I have to run JavaScript ` 
} 

有什麼辦法來實現這一點?

編輯1:

我需要一個div被onbuttonclick向下滾動(上點擊添加新數據使用的DataBinder和中繼器DIV)。如上所述,clientclick首先運行,但我需要在服務器操作後運行它。

JavaScript是..

<script> 
      var objDiv = document.getElementById("div1"); 
      objDiv.scrollTop = objDiv.scrollHeight; 
</script> 

<div id="div1"> //css properties height 200 and width 200 overflow:auto 
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" /> 
    <asp:Timer ID="Timer1" runat="server" Interval="200" /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Repeater id="Repeater1" runat="server" > 
     <ItemTemplate> 
      <%# DataBinder.Eval(Container.DataItem, "Message") %> <br /> 
     </ItemTemplate> 
     </asp:Repeater> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" /> 
    </Triggers> 
    </asp:UpdatePanel> 
    </div> 
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <div id="div2"> 
      <asp:TextBox ID="tb_message" runat="server" Width="250px" EnableViewState="false" /> 
      <br /> 
      <asp:Button ID="btn_send" runat="server" Width="250px" Text="Send" 
       onclick="btn_send_Click" /> 
     </div> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="btn_send" EventName="click" /> 
    </Triggers> 
    </asp:UpdatePanel> 
+0

是回發的AJAX回發或標準回傳? –

+2

如果可能,請提供一些代碼,以便我們可以看到哪種方法適用於您的情況 – danyloid

+0

@danyloid - 添加了代碼。 –

回答

1

編輯

基於前對提供這應該工作,如果你想在服務器端註冊的腳本代碼:

Button1_Click(object sender, EventArgs e) 
{ 
    ListBox1.Items.Add(TextBox1.Text); //for example 

    ScriptManager.RegisterStartupScript(UpdatePanel2, UpdatePanel2.GetType(), "scriptKey", "var objDiv = document.getElementById('div1'); objDiv.scrollTop = objDiv.scrollHeight;", true); 
} 

您可以使用詹姆斯提供以及代碼,如果你想註冊在客戶端的腳本,但請記住,腳本將每一個AJAX請求,將完成時間執行(該腳本會每次更新任何更新面板時都會執行)。如果您每次刷新UpdatePanel1時將向下滾動div1元素,並且在同一頁面上沒有更多使用Timer控件刷新的更新面板,James提供的代碼會更有用,而我的代碼將向下滾動只按下發送按鈕div1

修訂

對不起 - 這似乎是在執行服務器Click事件處理後的代碼被執行,但是第一個更新面板內的HTML之前重新加載(你可以簡單地設置一個斷點在服務器中點擊事件處理程序,並在註冊腳本中發出警報)。所以在腳本執行的時候,div元素仍然包含舊的html。

作爲一個黑客,你可以使用setTimeout函數和一個小的超時時間(在我的例子中,100ms就足夠了)。我正在尋找一種合適的方式來檢查更新面板中的html是否被重新加載,並且會以我找到的速度更新我的答案。

+0

這沒有奏效:( –

+0

@KarsM更新了答案由於提供的代碼 – danyloid

+0

我試過你的代碼,但它仍然不適合我。更正更正? –

1

JavaScript是一種客戶端語言,因此不能在服務器上運行。

編輯

基於更新後的問題,這樣的事情應該很好地工作:

的JavaScript

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 

function endRequestHandler(sender, args) 
{ 
    var objDiv = document.getElementById("div1"); 
    objDiv.scrollTop = objDiv.scrollHeight; 
} 
+1

技術上有[node](http://nodejs.org/)和[rhino](http://www.mozilla.org/rhino/)可以運行服務器端,不是嗎? (並不是說我想建議KarsM的解決方案就是這些。) – Jeroen

+0

@Jeroen,從技術上講,我猜。我認爲這就像比較蘋果和橙子。看看犀牛在它的主頁上說什麼「Rhino是完全用Java編寫的JavaScript的開源實現」。也許它在我的頭上,但對我來說這不像JS。 –

+0

我發現了一些像這樣的btn.attributes.add(「onClick」,javaScriptFunctionCal lHere);但不知道這是否會起作用。 –

1

JavaScript就無法在服務器上運行,但你可以注入在您選擇的服務器代碼中使用Response.Write("<script>..</script>)將HTTP轉換爲HTTP響應流。

Response.Write("<script>..</script>)會寫腳本的頁面,它已經開始呈現,可引起副作用看到Difference between Response.Write() and ClientScript.RegisterStartupScript()?

因此,作爲@dannyloid貼出看看ClientScript.RegisterStartupScript

+0

試過這個,但沒有工作:( –

+0

您是否檢查過腳本是否在客戶端頁面中顯示? –

+0

請看代碼,我剛添加它 –

-1
+2

-1,表明與node.js不同並且複雜,但不理解用戶需求是愚蠢的。大多數時候,有人說他們需要在服務器上運行JS,這是因爲他們不明白JS是什麼以及如何正確使用它。 –