Ошибка обратной передачи на странице ASP.NET при использовании Google Analytics - PullRequest
4 голосов
/ 03 июня 2011

Я использую ASP.NET для создания небольшого веб-приложения.Одна из моих страниц содержит некоторые элементы управления LinkButton, которые работали нормально, пока я не добавил ссылку на код Google Analytics .Теперь, когда я нажимаю на кнопку ссылки, я получаю сообщение об ошибке:

Ошибка времени выполнения Microsoft JScript: значение свойства '__doPostBack' является нулевым или неопределенным, а не функцией или объектом

Другие ссылки и элементы управления на странице работают нормально.Если я удалю ссылку на скрипт Google Analytics со страницы, все будет работать нормально.Кажется, что проблема возникает из-за взаимодействия между скриптом Google Analytics и , который LinkButton контролирует, пытаясь отослать страницу назад.

UPDATE .Далее я заметил следующее.При отсутствии ссылки на скрипт Google Analytics HTML-код, сгенерированный ASP.NET, выглядит нормально:

HTML structure with no Google Analytics code

Однако, как только я добавляю код Google Analytics, HTML-код облажается:

HTML structure with Google Analytics code

Проверьте этот тег формы!Теперь я представляю, что ошибка обратной передачи возникает из-за того, что элементы управления кнопкой ссылки размещаются вне формы ASP.NET.Но почему? END UPDATE .

Есть идеи, как решить эту проблему?Спасибо.

ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ .После долгих экспериментов я смог решить это сам.Я добавил ответ ниже, показывая мои выводы.Спасибо всем, кто разместил ответы здесь. END UPDATE .

Ответы [ 5 ]

3 голосов
/ 06 июня 2011

После большого количества настроек, технической поддержки и экспериментов я исправил проблему.Мой код выглядел так:

<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 может быть самозакрывающимся без побочных эффектов, но, по-видимому, все происходит иначе, когда вы закрываете его по-другому. Это проливает свет на то, почему.

1 голос
/ 19 июня 2012

Just

<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>
1 голос
/ 10 июня 2011

Я использую метод Матиаса Биненса :

<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>, чтобы я знал, что все мои отслеженные посетители полностью загрузили страницу.

1 голос
/ 05 июня 2011

Это неправильный способ добавления кода 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>, согласно Google:

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

1 голос
/ 05 июня 2011

Как уже предлагал клавиатура P, вы должны поместить скрипт Google Analytics в элемент <body>, предпочтительно в конце (то есть непосредственно перед закрывающим тегом </body>), чтобы он не блокировал загрузку страницы. См. http://developer.yahoo.com/performance/rules.html#js_bottom для обоснования.

Кроме того, вполне возможно, что скрипт Google Analytics добавляет элементы (например, <input>), которые недопустимы внутри элемента <head>, что объясняет, почему текущая настройка так эффектно ломает вашу страницу.

...