2011-06-03 46 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>