代码之家  ›  专栏  ›  技术社区  ›  Protector one reece

通过更新面板在异步回发后重新加载外部javascript

  •  3
  • Protector one reece  · 技术社区  · 15 年前

    我的页面上有一个外部javascript,例如:

    <script src="http://foo.com/script.js" type="text/javascript"></script>
    

    在某个地方有一个更新面板。脚本会写入一些内容,并在JS文件中的匿名javascript函数中执行此操作。也就是说,脚本中有这样的内容:

    (function(){document.write('content');})();
    

    每当通过异步回发更新updatepanel时,脚本所做的一切(或者我页面上的任何javascript,就此而言)都将被撤消。 对于普通的javascript,我只使用:

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(myFunction)
    

    要重做所有这些,但是由于脚本源文件中的函数是匿名的,并且在定义上被调用,所以我是sol!有什么想法吗?

    注意:外部JS源来自另一个域,其内容超出了我的控制。

    3 回复  |  直到 13 年前
        1
  •  3
  •   Ani    13 年前

    试试这个

    private string _myScript = @"(function (){
                                var ys = document.createElement('script');
                                ys.type='text/javascript'; ys.async=true;
                                ys.src='http://foo.com/script.js';
                                var s = document.getElementsByTagName('script')[0];
                                s.parentNode.insertBefore(ys,s);
                                });";
    

    然后在页面中加载

    ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "myScript", _myScript , true); 
    
        2
  •  2
  •   Protector one reece    15 年前

    好吧,我想出的“解决办法”(“肮脏丑陋的黑客”,如果你愿意的话)是:

    我不是直接加载JS文件,而是通过一个读取该文件的包装器加载它,将结果包装成自定义的javascript,将匿名函数放入全局数组中,并在加载时和每次异步回发之后调用该数组中的所有函数。

    请不要在任何选美活动中输入此解决方案。

        3
  •  1
  •   Protector one reece    14 年前

    这里真正的问题是我没有正确使用更新面板。如果页面上所有UpdatePanels的UpdateMode设置为Conditional,并且您的脚本管理器启用了部分更新,那么它实际上不应该“[撤消]脚本所做的一切”。

    推荐文章