【问题标题】:When jGrowl is called, the thickbox stops working properly (using UpdatePanel)当调用 jGrowl 时,thickbox 停止正常工作(使用 UpdatePanel)
【发布时间】:2011-09-09 08:52:35
【问题描述】:

点击链接时我正在调用厚框:

<a href="createContact.aspx?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=400&width=550&modal=true"
                            title="Add a new Contact" class="thickbox">Add a new Contact</a>

并且,当单击服务器按钮时,我调用此 javascript 函数来显示 jGrowl 通知:

ScriptManager.RegisterClientScriptBlock(this, typeof(Page), Guid.NewGuid().ToString(), "$(function(){$.jGrowl('No Contact found: " + searchContactText.Text + "');});", true);

两者都按预期工作,除非 jGrowl 先显示而不是厚框。这将导致thickbox 无法工作,并且页面将显示为正常的web(好像thickbox 已经消失了)。

有人知道发生了什么吗?

更新:这是一个没有母版页的测试页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="RoutingPortal.Presentation.WebForm2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="../Scripts/jquery-1.6.2.js" type="text/javascript"></script>
<script src="../Scripts/jquery-ui-1.8.16.custom.min.js" type="text/javascript"></script>
<script src="../Scripts/thickbox.js" type="text/javascript"></script>
<script src="../Scripts/jquery.jgrowl.js" type="text/javascript"></script>
<link href="../Scripts/css/jquery.jgrowl.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="~/CSS/thickbox.css" type="text/css" media="screen" />
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div>
    <a href="createContact.aspx?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=400&width=550&modal=true"
            title="Add a new Contact" class="thickbox">Add a new Contact</a>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>

这是代码隐藏:

namespace RoutingPortal.Presentation
{
public partial class WebForm2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), Guid.NewGuid().ToString(),
                "$(function(){$.jGrowl('My Message');});", true);
    }
}
}

我刚刚在没有 UpdatePanel 的情况下对其进行了测试,它运行良好。因此,这绝对是 UpdatePanel 的问题 或者它与从代码隐藏调用的 jGrowl 交互的方式。

非常感谢你们的帮助。

更新:我什至创建了一个演示项目,可以轻松识别此问题。不介意将它发送给愿意帮助我解决此问题的任何人。提前谢谢各位!

更新:我也尝试了@Rick 给出的解决方案,改变了从代码隐藏执行 jGrowl 脚本的方式:

ScriptManager.RegisterStartupScript(this.Page, typeof(Page), Guid.NewGuid().ToString(),
        "$.jGrowl('My Message');", true);

但是,由于结果完全相同,问题仍然存在。还有其他想法吗?非常感谢您的帮助。

更新:我也在 IE8 和 Chrome 中尝试过这个,面临同样的问题。因此,这与浏览器无关。以防万一。

【问题讨论】:

  • 澄清一下,您是说问题在于当您在显示 jGrowl 后单击您的链接时,它就像一个普通链接,并没有在厚框中打开页面?
  • 是的,我就是这个意思

标签: c# javascript asp.net thickbox jgrowl


【解决方案1】:

我相信您的问题与 jGrowl 无关,而与您对 UpdatePanel 的使用有关。

当您使用 UpdatePanel 时,它会刷新 DOM 中包含在其中的所有元素。这意味着在页面中创建的原始&lt;a&gt; 标记不再存在,其点击事件设置为使用thickbox。 UpdatePanel 刷新后,您现在有一个新的&lt;a&gt; 标记,它具有thickbox 类,但尚未“初始化”(因为thickbox 在页面加载期间设置了点击处理程序,这在部分回发期间不会像往常一样发生) .因此,当您单击该链接时,它就像一个普通的链接。

有几种方法可以解决此问题,具体取决于您的情况。

选项 1:根据您在上面粘贴的代码,在您的回发处理期间,与链接相关的任何实际更改看起来都没有。因此,也许您可​​以将 &lt;div&gt;&lt;a ...&gt;&lt;/a&gt; &lt;/div&gt; 移到 UpdatePanel 之外,而只将按钮留在里面。这会将您的链接保留为页面的一部分,并且仍会附加其厚盒处理程序。

选项 2:如果出于某种原因您不能使用选项 1,那么您可以设置一些 javascript 在加载 UpdatePanel 期间运行,以重新附加链接的点击处理程序.在调用 jGrowl 的函数中,尝试将tb_init('a.thickbox'); 添加到您的代码中。

选项3:您可以修改thickbox.js 文件以使用jQuery 的实时处理程序而不是普通的点击处理程序。在tb_init 函数中,您可以将其更改为$(domChunk).live('click', function(){..})。我认为这会起作用,尽管更新面板过程可能仍会阻止它。

希望这会有所帮助。

【讨论】:

  • 您可能的解决方案非常有用。等了很久,终于找到问题的答案了。我尝试了您的选项 1 和选项 3,都解决了我的问题。就个人而言,我更喜欢选项 3,因为在某些情况下我可能需要在 UpdatePanel 中包含链接(此示例只是一个简化的案例,以清楚地说明问题)。因此,我想知道在哪些情况下选项 3 不起作用?我什么时候应该更小心地使用这个解决方案?再来一次。非常感谢。
  • +1 表示选项 2。我认为这是解决此问题的最佳方法。
【解决方案2】:

我不完全了解您页面的架构,但正如@patmortech 所指出的,UpdatePanel 会导致 DOM 元素在每次异步回发时被完全替换。您需要重新绑定任何受影响的元素。

$(document).ready 在处理更新面板时不够好。它只会在第一个页面加载时调用(而不是在UpdatePanel 刷新之后)。解决方案是为您的配置代码挂钩到 ASP.NET 的 ajax 架构。

无论您使用什么代码来配置 ThickBox 和 jGrowl 链接,请在此处添加:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() {
    // page config code
});

这将在 ASP.NET 客户端生命周期结束时调用,因此请将您的配置代码放在UpdatePanel 中。如果您有多个 UpdatePanel,您可以测试哪些已更新(google add_endRequest)。但是,使用客户端标记状态来确定是否需要配置某些内容通常更容易,或者仅使用配置代码,如果针对同一标记运行两次也不会破坏事物。

使用 jquery live 也是一种选择,但它并不适用于所有情况。

【讨论】:

  • 这只是javascript。它出现在您的页面上的哪个位置并不重要。您可以像现在一样使用 RegisterStartupScript。您可以将其放在 ascx/aspx 文件中 &lt;script type="text/javascript"&gt;&lt;/script&gt; 标记之间的标记中。您可以放入包含在内的外部.js 文件。
【解决方案3】:
protected void Button1_Click(object sender, EventArgs e)
{
    ScriptManager.RegisterStartupScript(this.Page, typeof(Page), Guid.NewGuid().ToString(),
            "$.jGrowl('My Message');", true);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多