使用Google Analytics时,ASP.NET页面的Postback失败

4
我正在使用ASP.NET创建一个小型Web应用程序。我的其中一个页面包括一些LinkButton控件,在添加对Google Analytics代码的引用之前运作良好。现在,当我点击链接按钮时,会出现以下错误消息:
Microsoft JScript运行时错误:属性“__doPostBack”的值为null或未定义,不是函数或对象
页面上的其他链接和控件工作正常。如果我从页面中删除对Google Analytics脚本的引用,也一切正常。似乎问题出现在Google Analytics脚本与LinkButton控件试图回发页面之间的交互中。
更新。我进一步观察到以下情况。当没有Google Analytics脚本引用时,ASP.NET生成的HTML看起来很好:

HTML structure with no Google Analytics code

然而,一旦我添加Google Analytics代码,HTML就被搞砸了:

HTML structure with Google Analytics code

看看那个表单标签!我想现在的postback错误是由于linkbutton控件被放置在ASP.NET表单外面所致。但为什么呢?更新结束

有什么解决办法吗?谢谢。

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


我们能否看到您页面源代码的相关部分?请检查您的脚本标签是否已关闭,或者尝试将它们移到页面末尾而不是开头。 - mikey
@mikey:所有标签都已正确关闭;我已经进行了至少四次检查。明天我一到办公室就会发布一些源代码。您想看页面源代码的哪些部分?我还将尝试将Google Analytics脚本的引用移动到页面末尾。谢谢。 - CesarGon
请检查是否也关闭了<head>标签。我从来没有见过这样的奇怪问题,但我认为像这样的小错误很容易被忽略。除此之外,我可能会开始查看.js代码本身是否有任何奇怪的问题。 - mikey
只是为了澄清一下,你是将Google Analytics代码粘贴在页面的最后(就在</body>之前)吗? - keyboardP
@keyboardP:不,我正如Google建议的那样,在闭合的</head>标签之前粘贴它。 - CesarGon
显示剩余2条评论
5个回答

3

经过大量的调整、技术支持和实验,我已经解决了这个问题。我的代码看起来像这样:

<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>

这导致了我在原帖中描述的问题。当我切换到以下内容时,一切都被修复了:
<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可以自闭合而没有任何副作用,但显然当你以不同的方式关闭它时,事情会有所不同。这里解释了其中的原因。


你已经找到了自己问题的答案... 干杯 :D - Nitin Sawant
@TFD:我正在使用新的异步代码。请参阅http://www.google.com/support/googleanalytics/bin/answer.py?answer=174090,其中清楚地并且以粗体显示应该在“</head>”结束标签之前插入代码。您引用的页面是指旧版(“传统”)代码。 - CesarGon
@CeasarGon - 看我的回答。Paul Irish 在 Google 的开发者社区工作,他说 Google 建议将代码段尽可能放在靠前的位置只是为了尽早跟踪。他表示,他不赞成在页面加载之前跟踪离开的访问,并因此将其放在关闭 </body> 标记之前,以便知道每个被跟踪的访问都是真实的访问。 - Code Maverick
@Scott:谢谢你的评论。我的问题不是关于脚本放在哪里的问题;那个话题似乎已经成为一个次要问题,但我没有打算讨论它。我的问题是关于糟糕格式化的HTML,显然是由Google Analytics代码和其他东西的交互所产生的。幸运的是,这个问题几天前就已经解决了,你可以在我的答案和原帖中看到。无论如何,还是谢谢你。 :-) - CesarGon
@CesarGon - 不,我知道。我的评论只是在回应你的评论,在那里你说谷歌的网站明确表示代码应该插入在结束的 </head> 标签之前。我只是想告诉你为什么他们这样说。 - Code Maverick
谢谢 - 这也解决了使用 jQuery 插件的类似问题。 - ccook

1

正如keyboardP所建议的那样,您应该将Google Analytics脚本放在<body>元素中,最好是在末尾(即在闭合的</body>标记之前),这样它就不会阻塞页面的加载。请参见http://developer.yahoo.com/performance/rules.html#js_bottom以了解原理。

此外,Google Analytics脚本很可能会添加一些无效的元素(例如<input>),这些元素无法在<head>元素内使用,这就解释了为什么当前的设置会让您的页面出现如此惊人的错误。


另外,_private 谷歌分析 js 文件的内容是什么?你从那里 document.writing 任何东西吗?以其他方式修改 DOM? - Gijs
@Gijs:我在Google的文档中找不到将GA脚本放在body中的任何参考资料。Theofanis提供的链接说可以将其他脚本放在body中,但并没有说GA脚本应该放在哪里;至少我没有看到。关于你的另一个问题,_private/GoogleAnalytics.js文件包含了Theofanis发布的代码,即你在页面中粘贴在<script></script>标签之间的代码。 - CesarGon
@CesarGon:很高兴你解决了问题!至于我的参考资料,确切的引用如下:“为了在所有浏览器上获得最佳性能,我们建议您将站点中的其他脚本放置在以下位置之一:
  • 在HTML的<head>部分中跟踪代码片段之前
  • 在跟踪代码片段和所有页面内容(例如在HTML正文底部)之后”
(对于糟糕的格式,我很抱歉,我无法弄清楚如何使Markdown在评论中更好地运作...)
- Gijs
@Gijs:谢谢!我看到了那个部分,我理解它是指其他脚本(即“...你在你的网站中定位其他脚本...”)。它要求您将其他脚本放在GA脚本之前或最后,例如在body底部。它讨论的是其他脚本的放置位置,而不是GA脚本。 - CesarGon
...我应该学会阅读。抱歉!虽然我尊重地不同意谷歌关于将脚本放在头部标签中是“惯例”的说法...(而在我工作的地方,我们在所有网站属性的<body>末尾使用脚本标签(每天有数百万访问者),但我们没有任何问题)。 - Gijs
显示剩余3条评论

1

这是添加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>

...并且应该粘贴在</head>标签之前,根据谷歌的说法:

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


我所说的话哪里“不正确”了?我知道Google Analytics脚本是什么样子的;谢谢。:-)而且我会把它放在那里,就在关闭</head>标签之前。 - CesarGon

1

我使用Mathias Bynens的方法

<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 建议您尽可能将其放在文档的顶部,唯一原因是为了跟踪可能在页面完全加载之前关闭您的页面的访问。我不知道有谁真正想要跟踪那些不等待页面完全加载的访问者。对我来说,这不是一个真正的访问,会扰乱数据。所以我把它放在闭合的 </body> 标记之前,以便我知道所有被跟踪的访客已经完全加载了页面。

感谢你分享这个好链接,Scott。还有关于不追踪部分加载页面的有趣观点。不过,我在原帖中描述的问题已经在几天前解决了。 - CesarGon

1

只是

<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接