2011-12-01 84 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是什么以及如何正确使用它。 –