2013-03-27 3 views
1

Исправлена ​​проблема, когда мне нужно использовать GET vs POST для метода формы, но данные cookie GATC не добавляются к URL правильно, потому что данные формы перескакивают данные GATC Google (используя linkByPost).Google Analytics - использование GET вместо POST

Я прочитал потенциальное решение, размещенное here, но, похоже, безумный объем работы, чтобы заставить GET вести себя. Я также наткнулся на другое решение here, но IE не уважает ничего после «якорной» части URL-адреса.

У кого-нибудь есть идеи? Если я не могу справиться с этим через JS, мне придется перейти к скрипту, обрабатывающему действие формы, и массировать запрос вручную (при условии, что данные GATC находятся в массиве $ _REQUEST). FTR, данные GATC недоступны через массив $ _REQUEST при использовании get.

+0

Попробуйте использовать [один из этих методов] (http://stackoverflow.com/questions/316781/how-to-build-query-string-with-javascript), чтобы получить строку запроса вашей формы и использовать '_link()'. – nwellnhof

+0

Спасибо, я посмотрю. –

+0

Спасибо за подсказку, но мне нужно было локализовать данные GATC, прежде чем я смогу построить запрос с помощью вашего предложения. Не знаете, почему есть голос, чтобы закрыть, так как отмеченный дубликат не ответил на мой вопрос. –

ответ

2

Для справки в будущем, если кто-то столкнется с одной и той же проблемой, это решение, которое я реализовал. Я снял код из ответа на этот вопрос SO post и объединил его с идеей this post, где он локализует данные GATC и добавляет скрытые поля в форму для каждого из них.

Результирующий код:

$(document).ready(function() { 
    $('#formId').submit(function(e) { 

     try { 

      e.preventDefault(); 

      var form = this; 

      if (typeof _gat !== 'undefined') { 

       _gaq.push(['_linkByPost', this]); 

       var pageTracker = _gat._getTrackerByName(); 

       var url = pageTracker._getLinkerUrl(form.action); 

       var match = url.match(/[^=&?]+\s*=\s*[^&#]*/g); 

       for (var i = match.length; i--;) { 

        var spl = match[i].split("="); 

        var name = spl[0].replace("[]", ""); 

        var value = spl[1]; 

        $('<input>').attr({ 
         type: 'hidden', 
         name: name, 
         value: value 
        }).appendTo(form); 
       } 
      } 

      setTimeout(function() { form.submit(); }, 400); 
     } catch (e) { form.submit(); } 
    }); 
}); 
+0

Хороший ответ, спасибо - хотя var spl = match [i] .split ("="); не учитывает значения тегов, которые могут содержать более одного «=», то есть более одной части. Значение также должно быть закодировано для учета этой вероятности (для резервирования пар имя-значение): var str = match [i]; var index = str.indexOf ("="); var name = str.substr (0, index); var value = encodeURIComponent (str.substr (индекс + 1, str.length - 1)); – GPMorgan

+0

Согласовано, регулярное выражение url ожидает пары k/v без гнездования, вы говорите, что у вашей проблемы было что-то вроде публикации массива значений? –

+0

Да, именно это - теги utm (которые меня интересовали) иногда вложены, поэтому мне необходимо было использовать указанное ранее расширение для передачи правильного количества параметров. Еще раз спасибо, хотя в противном случае я, возможно, никогда не смог бы получить все теги utm :) – GPMorgan

0

Вы можете использовать JQuery сериализовать, чтобы получить элементы формы, а затем _getLinkerUrl присоединить данные отслеживания междоменных

$('#formID').submit(function(e) { 
    var pageTracker = _gat._getTrackerByName(); 
    var url = this.action + '?' + $(this).serialize(); 
    url = pageTracker._getLinkerUrl(url); 
    if (this.target != '_blank') location.href = url; 
    else window.open(url); 
}); 
+0

Спасибо за предложение, но я предпочитаю не изменять поведение функции .submit(). В моем конкретном случае у меня есть два вызова функции .submit(), связанных с одним и тем же formId, к счастью, jQuery может использовать пространство имён, чтобы один submit ссылался на другой. Это позволяет мне разделить различные фрагменты JS друг от друга. Если я изменю свой submit(), чтобы не вызывать .submit(), а кто-то добавляет еще одну функцию .submit() позже, она никогда не будет реализована. –

Смежные вопросы