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

C# 从asp.net代码隐藏执行Javascript函数?,c#,javascript,asp.net,jquery,code-behind,C#,Javascript,Asp.net,Jquery,Code Behind,好的,这感觉像是一个应该很容易回答的问题,但是由于asp.net和jQuery的大量混合,这有点像一场噩梦 我想做的是在客户端查看我的asp.net页面时,在不同的时间淡入淡出一个div;在触发UpdatePanel更新之前,我使用jQuery的fadeTo()将其淡入淡出(以指示那里的数据不新鲜),并希望在UpdatePanel更新后再次淡入淡出。我已经在codebehind中更新了UpdatePanel,这导致div的内容发生了变化。。。但是如何将div重新淡入 在我看来,有两种方式;在页面

好的,这感觉像是一个应该很容易回答的问题,但是由于asp.net和jQuery的大量混合,这有点像一场噩梦

我想做的是在客户端查看我的asp.net页面时,在不同的时间淡入淡出一个
div
;在触发UpdatePanel更新之前,我使用jQuery的
fadeTo()
将其淡入淡出(以指示那里的数据不新鲜),并希望在UpdatePanel更新后再次淡入淡出。我已经在codebehind中更新了UpdatePanel,这导致
div
的内容发生了变化。。。但是如何将
div
重新淡入

在我看来,有两种方式;在页面加载上注册事件处理程序,以检测
div
的内容何时已更改并淡入,或者在更新
div
后从asp.net codebehind调用函数以淡入

在第一种情况下,
div
的内容更改似乎没有触发任何事件,因此我似乎无法这样做。如果有人知道我如何在更新
div
时触发客户机事件,那将是一个很好的解决方案

在第二种情况下,我认为这就是
ClientScriptManager
的用途,但它并没有达到我想要的效果。我希望能够在
ClientScriptManager
中注册一个特定的Javascript函数,然后告诉
ClientScriptManager
在客户机中从我的codebehind执行它。你似乎不能那样做
ClientScriptManager.RegisterClientScriptBlock()
只是将一些
插入HTML输出,而不是调用函数。如果我继续注册以下内容,这可能会起作用:

<script>fadeBackIn();</script>

但我看不到该功能可用:-(

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

如果您的div如下所示:

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

如果您正在使用或愿意使用ASP.NET Ajax控件工具包,那么它包含一个完全符合您要求的控件:UpdatePanimation


查看有关该控件的更多信息,以及有关使用动画的更多信息。

我用纯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>

var _watchTimer=0;
window.onload=函数WindowLoad(evt){
_watchTimer=window.setInterval(“WatchForChange();”,100);
}
函数WatchForChange()
{
var oDiv=document.getElementById(“MyDivToWatch”);
如果(oDiv==null)
{
窗口清除间隔(_watchTimer);
返回;
}
var prevHtml=oDiv.getAttribute(“prev_html”)| |“”;
var curHtml=oDiv.innerHTML;
if(prevHtml!=curHtml)
{
如果(prevHtml.length>0)
{
警报(“内容更改”);
}
其他的
{
//第一次运行,忽略
}
setAttribute(“prev_html”,curHtml);
}
}
我可以改变。。
改变

添加了用于测试的全部代码,使用了一个按钮来动态更改内容,但它应该通过AJAX调用aka UpdatePanel来进行更改。

您可以附加到页面加载事件。页面加载处理程序接收一个类型为PageLoadedEventArgs的参数,该参数包含一个get\u 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(); 
            }
        }
    }
}

当客户端代码在服务器上执行时,您希望ClientScriptManager如何调用客户端代码?大概是使用了允许codebehind动态更新UpdatePanel内容的相同机制。这是一个允许客户端和服务器之间进行AJAX通信的框架。我不知道状态与此有什么关系。这是关于检测事件的。如果您正在查找客户端事件,则需要将内容放入、或标记中。然后,使用jquery,您可以绑定到更改事件。我正是这么做的;我创建了一个
文本框,并在codebehind中更改了其内容,但没有触发任何事件。有什么想法吗?为什么您是否提供了一个代码示例?如果不查看您的代码,我不确定如何从代码背后触发客户端javascript更改事件,因为更改输入值发生在浏览器接收html之前。为了使javascript更改事件发生,需要在页面加载后更改输入值。是否这有帮助还是有意义?我试图避免使用这个怪物来支持jQuery:-)这很公平。我不怪你。不幸的是,这依赖于一个计时器在后台滴答作响,这感觉像是一个混乱的解决方案;如果可能的话,我希望有一个基于事件的解决方案或codebehind以某种方式触发Javascript函数。更改元素内容不会引发任何事件(除了表单元素,但与您的情况无关),因此“基于事件的解决方案”是死胡同。。服务器和客户端并没有实时连接,它是“面向请求/响应”的,所以触发JS函数的代码隐藏也是死胡同。没有什么乱七八糟的计时器滴答作响,jQuery也有它的幕后。为什么表单元素在这里不相关?我可以让codebehind更改表单元素的内容,不是吗?相关,但没有尽头,因为没有引发事件。很高兴你现在解决了这个问题,这是一个地方这么多专家的优点。。大多数情况下,他们中的一个会得到答案。:)
<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>
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(); 
            }
        }
    }
}