2011-06-03 41 views
4

我使用ASP.NET创建小型网络应用程序。我的一个页面包含一些LinkBut​​ton控件,它们用于在我添加对Google Analytics代码的引用之前正常工作。现在,当我点击链接按钮时,我收到错误消息:使用Google Analytics时在ASP.NET页面上回传失败

Microsoft JScript runtime error: The value of the property '__doPostBack' is null or undefined, not a Function or object

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

UPDATE。我进一步观察了以下内容。如果没有谷歌Analytics(分析)脚本引用存在,是ASP.NET生成HTML看起来很好:

HTML structure with no Google Analytics code

然而,当我加入谷歌Analytics(分析)代码,该HTML被拧:

HTML structure with Google Analytics code

检查出表单标签!我想现在的回发错误是由于linkbutton控件被放置在之外的ASP.NET窗体。但为什么? END UPDATE

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

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

+0

可我们看到的源的相关章节为您的网页?检查脚本标记是否已关闭,并尝试将它们移动到页面的末尾而不是开头。 – mikey 2011-06-05 15:59:31

+0

@mikey:所有标签都正确关闭;我有四重(至少)检查。我一到我的办公室就会明天发布一些消息。您希望看到哪些页面源代码部分?我还会尝试将对Google Analytics脚本的引用移至页面末尾。谢谢。 – CesarGon 2011-06-05 17:24:08

+0

请检查您是否也正在关闭标签。我从来没有见过这样的奇怪,我认为这是一个小而容易错过的事情。除此之外,我可能会开始寻找.js代码本身来寻找任何奇怪的东西。 – mikey 2011-06-05 17:52:21

回答

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> 

这引起了我在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揭示了为什么。

+0

你已经找到了自己的问题的答案...干杯:D – 2011-06-08 07:27:12

+0

@NitinJS:是的,我有。谢谢。 :-) – CesarGon 2011-06-08 15:54:46

+0

@TFD:我正在使用新的异步代码。请参阅http://www.google.com/support/googleanalytics/bin/answer.py?answer=174090&hl=zh_CN粗体清楚并以粗体显示代码应在“关闭标记之前”插入。您引用的页面是指旧的(“传统”)版本的代码。 – CesarGon 2011-06-09 01:29:59

1

由于keyboardP已经建议,您应该将google analytics脚本放在<body>元素中,最好是在最后(因此在关闭</body>标记之前),因此它不会阻止加载页面。理由参见http://developer.yahoo.com/performance/rules.html#js_bottom

此外,Google Analytics(分析)脚本很可能会添加<head>元素内无效的元素(如<input>),这可以解释为什么当前的设置会让您的页面非常壮观。

+0

谷歌建议您在关闭标记之前放置脚本,而不是放在身体内。我遵循Google的建议。我也尝试将它移动到身体上,但事情并没有改善。 – CesarGon 2011-06-06 11:10:15

+0

事实上,如果你仔细阅读Theofanis的链接,Google说在''末尾和身体末尾都是好的。如果您将标签放入正文中,如果破损程度相同,我会非常惊讶,因为''标签与没有任何谷歌分析脚本的标签相同。该脚本将在第一个脚本标记旁边插入一个脚本元素,以便您还可以尝试将所有脚本移动到正文。无论如何,我们可能需要生成的HTML源代码(而不是屏幕截图)来找出这里出了什么问题。 – Gijs 2011-06-06 11:36:37

+0

另外,'_private'谷歌分析js文件的内容是什么?你从那里得到了什么“document.writing”?以其他方式修改DOM? – Gijs 2011-06-06 11:38:25

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

+0

什么是我说的“不正确”?我知道Google Analytics脚本的样子,谢谢。 :-)我正准备在关闭标签之前。 – CesarGon 2011-06-06 11:11:28

1

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

此外,唯一的原因,谷歌建议您把它作为高高的文件成为可能,是让你可以跟踪可能会关闭您的网页了访问在完全加载之前。我不知道谁会诚实地追踪不等待页面完全加载的访问者。对我来说,这不是一次真正的访问,并会甩掉数字。我把它放在关闭</body>标签之前,以便我知道所有跟踪访问者完全加载了页面。

+0

感谢伟大的链接,斯科特。关于不跟踪部分加载页面的有趣点。但是,我在OP中描述的问题几天前解决了。 – CesarGon 2011-06-09 23:29:33

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>