在UpdatePanel回发时立即执行Javascript

在UpdatePanel回发时立即执行Javascript,javascript,jquery,asp.net,ajax,updatepanel,Javascript,Jquery,Asp.net,Ajax,Updatepanel,我在UpdatePanel中有一个控件。单击该按钮时,我希望它立即执行Javascript函数(这是一个轮询函数,在UpdatePanel进行回发时将持续运行)。我该怎么做 我试过这个: var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_pageLoaded(pageLoaded); function pageLoaded(sender, args) { $(".btnExport").click(funct

我在UpdatePanel中有一个
控件。单击该按钮时,我希望它立即执行Javascript函数(这是一个轮询函数,在UpdatePanel进行回发时将持续运行)。我该怎么做

我试过这个:

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(pageLoaded);
function pageLoaded(sender, args) {
    $(".btnExport").click(function (e) {
        timer = window.setInterval(pollStatus, 1000);//        
    });
}
这是可行的,但它不会执行btnExport事件处理程序。我尝试的任何操作都会执行事件处理程序而不是轮询函数,反之亦然。我真正想要的是一种方法:

1) 单击导出按钮

2) 设置一个计时器以每秒进行一次轮询事件(javascript函数)

3) 执行导出按钮的事件处理程序

4) 回发完成后,清除计时器

有人对实现这一目标的最佳方法有什么建议吗

下面是一些示例代码。这是我编写的一个小示例应用程序,只是为了说明这一点,我的实际应用程序有点太复杂,无法在这里发布

DEFAULT.ASPX

<asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>

    <asp:UpdatePanel runat="server" ID="UpdatePanel1">
        <ContentTemplate>
            <asp:Button runat="server" ID="btnExport" Text="Begin Export" OnClick="btnExport_Click" ClientIDMode="Static" /><div id="message"></div>
        </ContentTemplate>
    </asp:UpdatePanel>

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script type="text/javascript" language="javascript">
        var timer;

        function pollStatus() {
            $.ajax({
                type: "POST",
                url: "<%= Page.ResolveUrl("~/Default.aspx/PollStatus") %>",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    $("#message").html(response.d);
                }
            });   
        }

        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_pageLoaded(pageLoaded);
        function pageLoaded(sender, args) {
            $("#btnExport").click(function (e) {
                timer = window.setInterval(pollStatus, 50);
            });
        }
</script>

无功定时器;
函数pollStatus(){
$.ajax({
类型:“POST”,
url:“”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(响应){
$(“#message”).html(response.d);
}
});   
}
var prm=Sys.WebForms.PageRequestManager.getInstance();
prm.添加页面加载(页面加载);
已加载函数页(发送方,参数){
$(“#btnExport”)。单击(函数(e){
定时器=窗口设置间隔(轮询状态,50);
});
}
DEFAULT.ASPX.CS

protected void btnExport_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= 10000000; i++ )
            {
                Session["PollStatus"] = i;
            }
        }

        [WebMethod]
        public static string PollStatus()
        {
            return HttpContext.Current.Session["PollStatus"] != null ? HttpContext.Current.Session["PollStatus"].ToString() : "No result";
        }
protectedvoid btnExport\u单击(对象发送方,事件参数e)
{

对于(int i=1;i我没有看到此处指定的css类:

<asp:Button ID="btnExport">
因此,您应该为按钮设置CssClass属性或更改选择器

UPD: 这段代码对我来说很好(这是一个例子,它需要在产品使用前进行一些润色)

在服务器向客户端提供响应之前,您应该会看到“测试”警报。

您可以尝试此方法

Javascript:

<script type="text/javascript">
    var timer;

    function fn() {
        //alert('hi');
        //clear the timer here.
    }
    function fn2() {
        //alert('hello');
        //Set a timer to do a polling event here
        return true;
    }
</script>
<asp:Button ID="btnExport" runat="server" Text="Begin Export" OnClientClick="return fn2();" onclick="btnExport_Click" />  
protected void btnExport_Click(object sender, EventArgs e)
    {
        for (int i = 1; i <= 10000000; i++ )
        {
            Session["PollStatus"] = i;
        }

        string myScript = @"fn();";
        Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", myScript, true);
    }  

无功定时器;
函数fn(){
//警报(“hi”);
//清除这里的计时器。
}
函数fn2(){
//警惕(“你好”);
//在此处设置计时器以执行轮询事件
返回true;
}
Html:

<script type="text/javascript">
    var timer;

    function fn() {
        //alert('hi');
        //clear the timer here.
    }
    function fn2() {
        //alert('hello');
        //Set a timer to do a polling event here
        return true;
    }
</script>
<asp:Button ID="btnExport" runat="server" Text="Begin Export" OnClientClick="return fn2();" onclick="btnExport_Click" />  
protected void btnExport_Click(object sender, EventArgs e)
    {
        for (int i = 1; i <= 10000000; i++ )
        {
            Session["PollStatus"] = i;
        }

        string myScript = @"fn();";
        Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", myScript, true);
    }  

代码隐藏:

<script type="text/javascript">
    var timer;

    function fn() {
        //alert('hi');
        //clear the timer here.
    }
    function fn2() {
        //alert('hello');
        //Set a timer to do a polling event here
        return true;
    }
</script>
<asp:Button ID="btnExport" runat="server" Text="Begin Export" OnClientClick="return fn2();" onclick="btnExport_Click" />  
protected void btnExport_Click(object sender, EventArgs e)
    {
        for (int i = 1; i <= 10000000; i++ )
        {
            Session["PollStatus"] = i;
        }

        string myScript = @"fn();";
        Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", myScript, true);
    }  
protectedvoid btnExport\u单击(对象发送方,事件参数e)
{

对于(int i=1;i如果您使用示例中的interval,您将有许多并发轮询请求,因为从服务器返回请求需要时间。您应该等待最后一个轮询请求从服务器返回,然后重试

function poll() {
    $.ajax({
        type: "POST",
        url: "<%= Page.ResolveUrl("~/Default.aspx/PollStatus") %>",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            if (response.d != 'No Result') {
                // done
            } else {
                setTimeout(poll, 50);
            }
        }
    }); 
}

$(function() {
    $("#btnExport").click(function (e) {
        poll();
    });
});
函数轮询(){
$.ajax({
类型:“POST”,
url:“”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(响应){
if(response.d!=“无结果”){
//完成
}否则{
设置超时(轮询,50);
}
}
}); 
}
$(函数(){
$(“#btnExport”)。单击(函数(e){
poll();
});
});

我可以看一下您的html代码吗?这只是为了简单起见……有一个css类。是的,我明白了。有时候这些简单的东西(例如类名等)在处理javascript时可能会带来严重的麻烦。顺便说一句:我已经更新了答案-希望这对你有用。这是唯一对我有用的解决方案,不管它值多少钱。我试图在手风琴交易中运行一个脚本。在这里,当你单击
btnExport
按钮时,首先
fn2()
运行,然后导出按钮的事件处理程序运行,然后
fn()
运行。