【问题标题】:Postback fails on ASP.NET page when using Google Analytics使用 Google Analytics 时,ASP.NET 页面上的回发失败
【发布时间】:2011-06-03 14:28:55
【问题描述】:

我正在使用 ASP.NET 创建一个小型 Web 应用程序。我的其中一个页面包含一些 LinkBut​​ton 控件,在我添加对 Google Analytics 代码的引用之前,这些控件可以正常工作。现在,当我单击链接按钮时,我收到错误消息:

Microsoft JScript 运行时错误: 属性“__doPostBack”的值 为空或未定义,不是函数 或对象

页面上的其他链接和控件工作正常。如果我从页面中删除对 Google Analytics 脚本的引用,一切正常。似乎问题出在 Google Analytics 脚本和试图回发页面的 LinkBut​​ton 控件之间的交互。

更新。我进一步观察到以下情况。当没有 Google Analytics 脚本引用时,ASP.NET 生成的 HTML 看起来不错:

但是,一旦我添加了 Google Analytics 代码,HTML 就会搞砸:

看看那个表单标签!我现在想象回发错误是由于链接按钮控件被放置在 ASP.NET 表单之外的事实引起的。但为什么? 结束更新。

关于如何解决这个问题的任何想法?谢谢。

进一步更新。经过多次试验,我已经能够自己解决这个问题。我在下面添加了一个答案,显示了我的结论。感谢所有在这里发布答案的人。 结束更新。

【问题讨论】:

  • 我们可以查看您页面源代码的相关部分吗?检查您的脚本标签是否已关闭,或许可以尝试将它们移动到页面的末尾而不是开头。
  • @mikey:所有标签都正确关闭;我已经(至少)检查了四次。明天一到办公室,我就会发布一些资源。您想查看页面源代码的哪些部分?我还将尝试将对 Google Analytics 脚本的引用移至页面末尾。谢谢。
  • 请检查您是否也关闭了 标签。我从未见过如此奇怪的东西,但我确实认为这是一件小事,但很容易错过。除此之外,我可能会开始查看 .js 代码本身是否有任何奇怪之处。
  • 澄清一下,您是否将 Google Analytics(分析)代码粘贴到页面末尾(就在 </body> 之前)?
  • @keyboardP:不。我将它粘贴在结束 标记之前,正如 Google 所建议的那样。

标签: javascript asp.net google-analytics postback linkbutton


【解决方案1】:

经过大量调整、技术支持和试验,我已经解决了这个问题。我的代码如下所示:

<head runat="server">
    <title><asp:ContentPlaceHolder ID="cphPageTitle" runat="server"></asp:ContentPlaceHolder></title>
    <link href="_private/Normal.css" rel="stylesheet" type="text/css" />
    <script src="_private/GoogleAnalytics.js" type="text/javascript" />
</head>

这导致了我在我的 OP 中描述的问题。当我切换到以下内容时,一切都已修复:

<head runat="server">
    <title><asp:ContentPlaceHolder ID="cphPageTitle" runat="server"></asp:ContentPlaceHolder></title>
    <link href="_private/Normal.css" rel="stylesheet" type="text/css" />
    <script src="_private/GoogleAnalytics.js" type="text/javascript"></script>
</head>

请注意,script 现在由一个完整的结束标记而不是自结束标记关闭。我假设script 可以自动关闭而没有副作用,但是当你以不同的方式关闭它时,显然情况会有所不同。 This 解释了原因。

【讨论】:

  • 你已经找到了你自己问题的答案......干杯:D
  • @NitinJS:是的,我有。谢谢。 :-)
  • @TFD:我正在使用新的异步代码。请参阅google.com/support/googleanalytics/bin/answer.py?answer=174090,其中以粗体字清楚地表明代码应插入“就在结束 标记之前”。您引用的页面指的是旧(“传统”)版本的代码。
  • @CeasarGon - 见我的回答。 Paul Irish 在开发社区为 Google 工作,并表示 Google 建议将 sn-p 放置在尽可能高的位置以便尽快跟踪的唯一原因。他说,他不同意跟踪在页面加载之前离开的访问的概念,因此,将其放在结束 &lt;/body&gt; 标记之前,以便他知道每次跟踪的访问都是真正的访问。
  • @Scott:感谢您的评论。我的 OP 不是关于将脚本放在哪里;这个话题不知何故作为次要问题出现了,但我不打算讨论它。我的 OP 是关于格式错误的 HTML,显然是由于谷歌分析代码和其他东西的交互而产生的。幸运的是,这已经在几天前解决了,正如您在我自己的答案和 OP 中看到的那样。还是非常感谢。 :-)
【解决方案2】:

正如keyboardP 已经建议的那样,您应该将谷歌分析脚本放在&lt;body&gt; 元素中,最好放在最后(所以就在关闭&lt;/body&gt; 标记之前),这样它就不会阻止页面的加载。请参阅http://developer.yahoo.com/performance/rules.html#js_bottom 了解基本原理。

此外,Google Analytics 脚本很可能会在 &lt;head&gt; 元素中添加无效的元素(例如 &lt;input&gt; ),这可以解释为什么当前设置如此引人注目地破坏了您的页面。

【讨论】:

  • Google 建议您将脚本放在结束 标记之前,而不是放在正文中。我正在听从谷歌的建议。我也尝试将它移到身体上,但情况并没有改善。
  • 实际上,如果您仔细阅读 Theofanis 的链接,Google 会说,&lt;head&gt; 的末尾和正文的末尾都可以。如果您将标签放在正文中,如果破损相同,我会感到非常惊讶,因为&lt;head&gt; 标签将与没有任何谷歌分析脚本时相同。该脚本将在第一个脚本标记旁边插入一个脚本元素,因此您也可以尝试将所有脚本移动到正文。无论如何,我们可能需要生成的 HTML 源代码(而不是屏幕截图)来找出这里出了什么问题。
  • 另外,_private google analytics js 文件的内容是什么?你是document.writing 那里的任何东西吗?以其他方式修改 DOM?
  • @Gijs:我在 Google 的文档中找不到将 GA 脚本放入正文的任何​​参考。 Theofanis 提供的链接说 other 脚本可以放在正文中,但没有说 GA 脚本应该;至少,我看不到它。关于您的其他问题,_private/GoogleAnalytics.js 文件包含完全 Theofanis 发布的代码,即您将在页面中的&lt;script&gt; 和&lt;/script&gt; 标记之间粘贴的代码。
  • @CesarGon:很高兴你解决了这个问题!至于我的参考,确切的引用是:“为了在所有浏览器中获得最佳性能,我们建议您通过以下方式之一在您的站点中放置其他脚本:-在 HTML 部分中的跟踪代码 sn-p 之前- 在跟踪代码 sn-p 和所有页面内容之后(例如,在 HTML 正文的底部)”(我对糟糕的格式表示歉意,我无法弄清楚如何让 Markdown 在 cmets 中表现得更好......)
【解决方案3】:

这是添加 Google Analytics(分析)代码的不正确方式。 它应该看起来像这样:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

...根据 Google 的说法,它应该粘贴在 &lt;/head&gt; 标签之前:

http://www.google.com/support/analytics/bin/answer.py?hl=en_US&answer=174090&utm_id=ad

【讨论】:

  • 我所说的“不正确”是什么?我知道 Google Analytics 脚本是什么样的;谢谢。 :-) 我把它放在那里,就在结束 标记之前。
【解决方案4】:

我用Mathias Bynens' method:

<script>

    var _gaq = [['_setAccount', 'UA-XXXXX-X'], ['_trackPageview']];

    (function(d, t) {

        var g = d.createElement(t),
            s = d.getElementsByTagName(t)[0];

        g.async = g.src = '//www.google-analytics.com/ga.js';
        s.parentNode.insertBefore(g, s);

    }(document, 'script'));

</script>

此外,Google 建议您将其放在文档上尽可能高的唯一原因是,您可以跟踪可能在页面完全加载之前关闭的访问。我不知道谁真的想跟踪不等待页面完全加载的访问者。对我来说,这不是一次真正的访问,并且会抛出数字。我将它放在结束 &lt;/body&gt; 标记之前,这样我就知道我跟踪的所有访问者都已完全加载了页面。

【讨论】:

  • 感谢伟大的链接,斯科特。关于不跟踪部分加载的页面的有趣点。不过,我在 OP 中描述的问题已在几天前得到解决。
【解决方案5】:

只是

<script type="text/javascript">
    if (!<%=Page.IsPostBack.ToString().Tolower()%>)
    {
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'UA-xxxxxxxx-xx']);
        _gaq.push(['_trackPageview']);
        (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();
    }
</script>

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多