代码之家  ›  专栏  ›  技术社区  ›  Jez

从asp.net代码隐藏中执行Javascript函数?

  •  3
  • Jez  · 技术社区  · 15 年前

    我想做的是逐渐消失 div fadeTo() 在触发UpdatePanel更新之前(以指示数据不新鲜),我希望在UpdatePanel更新后再次淡入。我已经更新了codebhind中的UpdatePanel,结果 分区 的内容正在更改。。。但我该如何淡化 又回来了?

    在我看来,有两种方法;在页面加载时注册一个事件处理程序,以检测 分区 的内容已更改并淡入,或者在更新 分区 把它淡入。

    任何 由触发的事件 分区 分区 ,那将是一个很好的解决方案。

    在第二种情况下,我想这就是 ClientScriptManager 客户端脚本管理器 然后告诉我 客户端脚本管理器 在客户端执行,从我的代码隐藏。你不能这么做。 ClientScriptManager.RegisterClientScriptBlock() 只需插入一些 <script> 而不是调用函数。如果我继续注册以下内容,这可能会起作用:

    <script>fadeBackIn();</script>
    

    因为Javascript会立即被评估和运行,但这感觉很混乱,而且这种感觉会因为我必须不断地为 key 论证 ClientScriptManager.RegisterClientScriptBlock() ,因为它是专门为 这种重复的代码。然而,我正在努力寻找另一种选择。有谁能想出一个更好的机制来让它发挥作用呢?

    ClientScriptManager.RegisterClientScriptFunction("fadeBackIn", "function fadeBackIn(){ ... }");
    
    [...]
    
    ClientScriptManager.ExecuteClientScriptFunction("fadeBackIn");
    

    但我看不到这个功能。:-(

    4 回复  |  直到 15 年前
        1
  •  1
  •   kevev22    15 年前

    您可以附加到页面加载事件。pageLoaded处理程序接收pageloadedventargs类型的参数,该参数包含get_panelsUpdated方法,您可以调用该方法枚举其内容刚刚更新的所有updatepanel。

    例子:

    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_pageLoaded(pageLoaded);
    
    function pageLoaded(sender, args) 
    {
        var panels = args.get_panelsUpdated();
    
        if (panels.length > 0) 
        {
            for (var i in panels) 
            {
                if (panels[i].id == "DesiredUpdatePanelId") 
                {
                    fadeBackIn(); 
                }
            }
        }
    }
    
        2
  •  0
  •   Chris Ellingsworth    15 年前

    因为html是无状态的,所以您需要一种异步方式来确定div中的内容是否已更改。我将尝试使用window.setInterval检查您的内容是否每500毫秒更改一次。

    如果你的div是这样的:

    <div id="mycontent">Blah, blah.</div>
    

    那么这可能是一个解决方案:

    $(function(){
    
       var $mycontent = $('#mycontent');
       var myContentHtml = $mycontent.html();
       var intervalId;
    
       function checkIfDivChanged()
       {
          window.clearInterval(intervalId);
    
          if (myContentHtml != $mycontent.html())
          {
             myContentHtml = $mycontent.html();
    
             // run update here..
             fadeBackIn();
    
             // if you want to stop the check then uncomment next line..
             // return;
          }
    
          intervalId = window.setInterval(checkIfDivChanged, 500);          
       }
    
       checkIfDivChanged();
    });
    
        3
  •  0
  •   kevev22    15 年前

    如果您正在使用或愿意使用ASP.NET Ajax控件工具包,它包含一个完全符合您所需的控件:UpdatePanelAnimation。

    here 有关该控件的详细信息,以及 here 有关使用动画的详细信息。

        4
  •  0
  •   Shadow Wizard    15 年前

    我用纯JavaScript编写了一个小脚本(不需要jQuery),您可以在页面中使用这个脚本并更改警报部分。。当然还要加上div元素的ID。

    <script type="text/javascript">
    var _watchTimer = 0;
    window.onload = function WindowLoad(evt) {
        _watchTimer = window.setInterval("WatchForChange();", 100);
    }
    
    function WatchForChange()
    {
        var oDiv = document.getElementById("MyDivToWatch");
        if (oDiv == null)
        {
            window.clearInterval(_watchTimer);
            return;
        }
        var prevHtml = oDiv.getAttribute("prev_html") || "";
        var curHtml = oDiv.innerHTML;
        if (prevHtml != curHtml)
        {
            if (prevHtml.length > 0)
            {
                alert("content changed");
            }
            else
            {
                //first run, ignore
            }
            oDiv.setAttribute("prev_html", curHtml);
        }
    }
    </script>
    <div id="MyDivToWatch">I can be changed..</div>
    <button type="button" onclick="document.getElementById('MyDivToWatch').innerHTML += ' like this..';">Change</button>