首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript C# UpdatePanel更新之后更新UpdatePanel

在JavaScript C# UpdatePanel更新之后更新UpdatePanel
EN

Stack Overflow用户
提问于 2011-08-02 10:22:46
回答 1查看 3.2K关注 0票数 1

我有一个动态创建的JavaScript块,它在页面加载时执行。JS在UpdatePanel中。

更新UpdatePanel时,我需要更新动态创建的JavaScript。这一切都很好,因为当我查看生成的页面源时,我可以看到更新的JS。

我的问题是,在页面更新之后,我需要手动重新执行JavaScript函数(这通常是在页面加载时自动完成的)。

我尝试过许多方法:

代码语言:javascript
复制
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded);

function pageLoaded(sender, args) {
    var updatedPanels = args.get_panelsUpdated();

    // check if Main Panel was updated 
    for (idx = 0; idx < updatedPanels.length; idx++) {
        if (updatedPanels[idx].id == "PageContent_TabContent_UpdatePanel1") {
            drawVisualization();
            break;
        }
    }
}

或者:

代码语言:javascript
复制
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest);

function handleEndRequest(sender, args) {
    drawVisualization();
}

但上述两种方法都只是执行JavaScript的旧版本,根据生成的源代码,该版本已经发生了更改。

是不是有什么东西我错过了,或者另一种方法我可以试试?

更新:

使用注释@Mehdi Maujood,我编写了一个可行的解决方案:

代码语言:javascript
复制
function handleEndRequest(sender, args)
{
    var updatedPanels = args.get_panelsUpdated();
    for (idx = 0; idx < updatedPanels.length; idx++) {
        if (updatedPanels[idx].id == "PageContent_TabContent_UpdatePanel1") {

            var scripts = updatedPanels[idx].getElementsByTagName('script');
            for(var i=0;i<scripts.length;i++) {
                eval(scripts[i].innerHTML);
            }

            drawVisualization();
            break;
        }
    }
}

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(handleEndRequest);

这结合了How can I recall a javascript function after updatepanel update的回答以及@shatl对Rebinding events in jQuery after Ajax update (updatepanel)的评论。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-02 12:00:06

据我所知,您遇到的问题是,通过update面板呈现的javascript没有被执行。我找了一下,这似乎是个常见的问题。浏览器似乎没有执行封装在更新面板中的脚本。

问题是,虽然更新后的脚本被发送到浏览器,但从未执行。drawVisualization永远不会被重新定义.您可以从您的C#代码中尝试这样的方法:

代码语言:javascript
复制
string script = "function drawVisualization() { alert('Drawing code here') }";

ScriptManager.RegisterClientScriptBlock(this.Page, typeof(SomeClass), Guid.NewGuid().ToString(), script, true);

对RegisterClientScriptBlock的调用可能需要修复一些参数;我只是从某个地方复制了它。

编辑:我从另一个问题中找到了一个更好的方法。请参阅评论。下面是执行update面板呈现的脚本的一段代码(您可以忽略前面的代码):

代码语言:javascript
复制
<script type="text/javascript">
    function handleEndRequest(sender, args)
    {
        var panel = document.getElementById(sender._postBackSettings.panelID);
        var scripts = panel.getElementsByTagName('script');
        for(var i=0;i<scripts.length;i++) {
            eval(scripts[i].innerHTML);
        }
    }

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest);
</script>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6910555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档