2016-04-20 62 views
0

我一直在使用this code found on Github來收集一些UTM /其他URL參數。無法獲取某些Cookie的價值 - Javascript

我已經能夠成功地將參數保存在cookie中,並將這些值傳遞給隱藏的輸入表單。

此代碼通過Google跟蹤代碼管理器加載到網站的每個頁面上。

場景:

-The的Cookie會話網站的每個網頁上存在預期。

- 主網站位於不安全的HTTP連接(http://www.example.com)。

- 子域上存在一個安全頁面。 (https://www.subdomain.example.com)。

問題:在安全的子域頁面上,我無法從任何UTM cookie中獲取值。我可以從訪問者,IREFERRER,LREFERRER和ILANDINGPAGE餅乾中獲取值,但不能從UTM餅乾中獲取。

這裏是我使用的代碼:

<script type="text/javascript" charset="utf-8"> 

    jQuery(document).ready(function(){ 

    var _uf = _uf || {}; 
    _uf.domain = ".exampledomain.com"; 

    var UtmCookie; 

UtmCookie = (function() { 
    function UtmCookie(options) { 
    if (options == null) { 
     options = {}; 
    } 
    this._cookieNamePrefix = '_uc_'; 
    this._domain = options.domain; 
    this._sessionLength = options.sessionLength || 1; 
    this._cookieExpiryDays = options.cookieExpiryDays || 365; 
    this._additionalParams = options.additionalParams || []; 
    this._utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; 
    this.writeInitialReferrer(); 
    this.writeLastReferrer(); 
    this.writeInitialLandingPageUrl(); 
    this.setCurrentSession(); 
    if (this.additionalParamsPresentInUrl()) { 
     this.writeAdditionalParams(); 
    } 
    if (this.utmPresentInUrl()) { 
     this.writeUtmCookieFromParams(); 
    } 
    return; 
    } 

    UtmCookie.prototype.createCookie = function(name, value, days, path, domain, secure) { 
    var cookieDomain, cookieExpire, cookiePath, cookieSecure, date, expireDate; 
    expireDate = null; 
    if (days) { 
     date = new Date; 
     date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); 
     expireDate = date; 
    } 
    cookieExpire = expireDate != null ? '; expires=' + expireDate.toGMTString() : ''; 
    cookiePath = path != null ? '; path=' + path : '; path=/'; 
    cookieDomain = domain != null ? '; domain=' + domain : ''; 
    cookieSecure = secure != null ? '; secure' : ''; 
    document.cookie = this._cookieNamePrefix + name + '=' + escape(value) + cookieExpire + cookiePath + cookieDomain + cookieSecure; 
    }; 

    UtmCookie.prototype.readCookie = function(name) { 
    var c, ca, i, nameEQ; 
    nameEQ = this._cookieNamePrefix + name + '='; 
    ca = document.cookie.split(';'); 
    i = 0; 
    while (i < ca.length) { 
     c = ca[i]; 
     while (c.charAt(0) === ' ') { 
     c = c.substring(1, c.length); 
     } 
     if (c.indexOf(nameEQ) === 0) { 
     return c.substring(nameEQ.length, c.length); 
     } 
     i++; 
    } 
    return null; 
    }; 

    UtmCookie.prototype.eraseCookie = function(name) { 
    this.createCookie(name, '', -1, null, this._domain); 
    }; 

    UtmCookie.prototype.getParameterByName = function(name) { 
    var regex, regexS, results; 
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); 
    regexS = '[\\?&]' + name + '=([^&#]*)'; 
    regex = new RegExp(regexS); 
    results = regex.exec(window.location.search); 
    if (results) { 
     return decodeURIComponent(results[1].replace(/\+/g, ' ')); 
    } else { 
     return ''; 
    } 
    }; 

    UtmCookie.prototype.additionalParamsPresentInUrl = function() { 
    var j, len, param, ref; 
    ref = this._additionalParams; 
    for (j = 0, len = ref.length; j < len; j++) { 
     param = ref[j]; 
     if (this.getParameterByName(param)) { 
     return true; 
     } 
    } 
    return false; 
    }; 

    UtmCookie.prototype.utmPresentInUrl = function() { 
    var j, len, param, ref; 
    ref = this._utmParams; 
    for (j = 0, len = ref.length; j < len; j++) { 
     param = ref[j]; 
     if (this.getParameterByName(param)) { 
     return true; 
     } 
    } 
    return false; 
    }; 

    UtmCookie.prototype.writeCookie = function(name, value) { 
    this.createCookie(name, value, this._cookieExpiryDays, null, this._domain); 
    }; 

    UtmCookie.prototype.writeAdditionalParams = function() { 
    var j, len, param, ref, value; 
    ref = this._additionalParams; 
    for (j = 0, len = ref.length; j < len; j++) { 
     param = ref[j]; 
     value = this.getParameterByName(param); 
     this.writeCookie(param, value); 
    } 
    }; 

    UtmCookie.prototype.writeUtmCookieFromParams = function() { 
    var j, len, param, ref, value; 
    ref = this._utmParams; 
    for (j = 0, len = ref.length; j < len; j++) { 
     param = ref[j]; 
     value = this.getParameterByName(param); 
     this.writeCookie(param, value); 
    } 
    }; 

    UtmCookie.prototype.writeCookieOnce = function(name, value) { 
    var existingValue; 
    existingValue = this.readCookie(name); 
    if (!existingValue) { 
     this.writeCookie(name, value); 
    } 
    }; 

    UtmCookie.prototype._sameDomainReferrer = function(referrer) { 
    var hostname; 
    hostname = document.location.hostname; 
    return referrer.indexOf(this._domain) > -1 || referrer.indexOf(hostname) > -1; 
    }; 

    UtmCookie.prototype._isInvalidReferrer = function(referrer) { 
    return referrer === '' || referrer === void 0; 
    }; 

    UtmCookie.prototype.writeInitialReferrer = function() { 
    var value; 
    value = document.referrer; 
    if (this._isInvalidReferrer(value)) { 
     value = 'direct'; 
    } 
    this.writeCookieOnce('referrer', value); 
    }; 

    UtmCookie.prototype.writeLastReferrer = function() { 
    var value; 
    value = document.referrer; 
    if (!this._sameDomainReferrer(value)) { 
     if (this._isInvalidReferrer(value)) { 
     value = 'direct'; 
     } 
     this.writeCookie('last_referrer', value); 
    } 
    }; 

    UtmCookie.prototype.writeInitialLandingPageUrl = function() { 
    var value; 
    value = this.cleanUrl(); 
    if (value) { 
     this.writeCookieOnce('initial_landing_page', value); 
    } 
    }; 

    UtmCookie.prototype.initialReferrer = function() { 
    return this.readCookie('referrer'); 
    }; 

    UtmCookie.prototype.lastReferrer = function() { 
    return this.readCookie('last_referrer'); 
    }; 

    UtmCookie.prototype.initialLandingPageUrl = function() { 
    return this.readCookie('initial_landing_page'); 
    }; 

    UtmCookie.prototype.incrementVisitCount = function() { 
    var cookieName, existingValue, newValue; 
    cookieName = 'visits'; 
    existingValue = parseInt(this.readCookie(cookieName), 10); 
    newValue = 1; 
    if (isNaN(existingValue)) { 
     newValue = 1; 
    } else { 
     newValue = existingValue + 1; 
    } 
    this.writeCookie(cookieName, newValue); 
    }; 

    UtmCookie.prototype.visits = function() { 
    return this.readCookie('visits'); 
    }; 

    UtmCookie.prototype.setCurrentSession = function() { 
    var cookieName, existingValue; 
    cookieName = 'current_session'; 
    existingValue = this.readCookie(cookieName); 
    if (!existingValue) { 
     this.createCookie(cookieName, 'true', this._sessionLength/24, null, this._domain); 
     this.incrementVisitCount(); 
    } 
    }; 

    UtmCookie.prototype.cleanUrl = function() { 
    var cleanSearch; 
    cleanSearch = window.location.search.replace(/utm_[^&]+&?/g, '').replace(/&$/, '').replace(/^\?$/, ''); 
    return window.location.origin + window.location.pathname + cleanSearch + window.location.hash; 
    }; 

    return UtmCookie; 

})(); 

var UtmForm, _uf; 

UtmForm = (function() { 
    function UtmForm(options) { 
    if (options == null) { 
     options = {}; 
    } 
    this._utmParamsMap = {}; 
    this._utmParamsMap.utm_source = options.utm_source_field || 'USOURCE'; 
    this._utmParamsMap.utm_medium = options.utm_medium_field || 'UMEDIUM'; 
    this._utmParamsMap.utm_campaign = options.utm_campaign_field || 'UCAMPAIGN'; 
    this._utmParamsMap.utm_content = options.utm_content_field || 'UCONTENT'; 
    this._utmParamsMap.utm_term = options.utm_term_field || 'UTERM'; 
    this._additionalParamsMap = options.additional_params_map || {}; 
    this._initialReferrerField = options.initial_referrer_field || 'IREFERRER'; 
    this._lastReferrerField = options.last_referrer_field || 'LREFERRER'; 
    this._initialLandingPageField = options.initial_landing_page_field || 'ILANDPAGE'; 
    this._visitsField = options.visits_field || 'VISITS'; 
    this._addToForm = options.add_to_form || 'all'; 
    this._formQuerySelector = options.form_query_selector || 'form'; 
    this.utmCookie = new UtmCookie({ 
     domain: options.domain, 
     sessionLength: options.sessionLength, 
     cookieExpiryDays: options.cookieExpiryDays, 
     additionalParams: Object.getOwnPropertyNames(this._additionalParamsMap) 
    }); 
    if (this._addToForm !== 'none') { 
     this.addAllFields(); 
    } 
    } 

    UtmForm.prototype.addAllFields = function() { 
    var fieldName, param, ref, ref1; 
    ref = this._utmParamsMap; 
    for (param in ref) { 
     fieldName = ref[param]; 
     this.addFormElem(fieldName, this.utmCookie.readCookie(param)); 
    } 
    ref1 = this._additionalParamsMap; 
    for (param in ref1) { 
     fieldName = ref1[param]; 
     this.addFormElem(fieldName, this.utmCookie.readCookie(param)); 
    } 
    this.addFormElem(this._initialReferrerField, this.utmCookie.initialReferrer()); 
    this.addFormElem(this._lastReferrerField, this.utmCookie.lastReferrer()); 
    this.addFormElem(this._initialLandingPageField, this.utmCookie.initialLandingPageUrl()); 
    this.addFormElem(this._visitsField, this.utmCookie.visits()); 
    }; 

    UtmForm.prototype.addFormElem = function(fieldName, fieldValue) { 
    var allForms, firstForm, form, i, len; 
    if (fieldValue) { 
     allForms = document.querySelectorAll(this._formQuerySelector); 
     if (allForms.length > 0) { 
     if (this._addToForm === 'first') { 
      firstForm = allForms[0]; 
      firstForm.insertBefore(this.getFieldEl(fieldName, fieldValue), firstForm.firstChild); 
     } else { 
      for (i = 0, len = allForms.length; i < len; i++) { 
      form = allForms[i]; 
      form.insertBefore(this.getFieldEl(fieldName, fieldValue), form.firstChild); 
      } 
     } 
     } 
    } 
    }; 

    UtmForm.prototype.getFieldEl = function(fieldName, fieldValue) { 
    var fieldEl; 
    fieldEl = document.createElement('input'); 
    fieldEl.type = "hidden"; 
    fieldEl.name = fieldName; 
    fieldEl.value = fieldValue; 
    return fieldEl; 
    }; 

    return UtmForm; 

})(); 

_uf = window._uf || {}; 

window.UtmForm = new UtmForm(_uf); 

    /* 
     var USOURCE = jQuery("input[name='USOURCE']").val(); 
     var UMEDIUM = jQuery("input[name='UMEDIUM']").val(); 
     var UCAMPAIGN = jQuery("input[name='UCAMPAIGN']").val(); 
     var UCONTENT = jQuery("input[name='UCONTENT']").val(); 
     var UTERM = jQuery("input[name='UTERM']").val(); 
     var IREFERRER = jQuery("input[name='IREFERRER']").val(); 
     var LREFERRER = jQuery("input[name='LREFERRER']").val(); 
     var ILANDPAGE = jQuery("input[name='ILANDPAGE']").val(); 
     var VISITS = jQuery("input[name='VISITS']").val(); 

    console.log(USOURCE); 
    console.log(UMEDIUM); 
    console.log(UCAMPAIGN); 
    console.log(VISITS); 
    */ 
    jQuery('#saveProfile').on('click', function(e){ 
     console.log('Click submitted'); 
     e.preventDefault(); 
     // Original JavaScript code by Chirp Internet: www.chirp.com.au 
     // Please acknowledge use of this code by including this header. 

function getCookie(cname) { 
    var name = cname + "="; 
    var ca = document.cookie.split(';'); 
    for(var i = 0; i <ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0)==' ') { 
      c = c.substring(1); 
     } 
     if (c.indexOf(name) == 0) { 
      return c.substring(name.length,c.length); 
     } 
    } 
    return ""; 
} 
     var readCampaign = readCookie_uc_utm_campaign 
     var FirstName = jQuery('#ownerInformation_FirstName').val(); 
     var LastName = jQuery('#ownerInformation_LastName').val(); 
     var USOURCE = getCookie('_uc_utm_source'); 
     console.log(USOURCE); 
     var UMEDIUM = getCookie('_uc_utm_medium') || ''; 
     var UCAMPAIGN = getCookie('_uc_utm_campaign') || ''; 
     var UCONTENT = getCookie('_uc_utm_content') || ''; 
     var UTERM = getCookie('_uc_utm_term') || ''; 
     var IREFERRER = jQuery("input[name='IREFERRER']").val(); 
     var LREFERRER = jQuery("input[name='LREFERRER']").val(); 
     var ILANDPAGE = jQuery("input[name='ILANDPAGE']").val(); 
     var VISITS = jQuery("input[name='VISITS']").val(); 
     dataLayer.push({'event':FirstName,'event_cat':LastName,'event_action':USOURCE,'event_label':VISITS}); 

     jQuery.ajax({ 
     url: "https://script.google.com/macros/s/googleappsscript/exec", 
      data: {'FirstName':FirstName,'LastName':LastName,'USOURCE':USOURCE, 'UMEDIUM':UMEDIUM, 'UCAMPAIGN':UCAMPAIGN, 'UCONTENT':UCONTENT, 'UTERM':UTERM, 'IREFERRER':IREFERRER, 'LREFERRER':LREFERRER, 'VISITS':VISITS}, 
     type: "POST", 
     dataType: "json" 
     });  
    }); 
    }) 
</script> 

任何幫助或指導將不勝感激。

感謝,

布萊恩

回答

0

爲什麼Cookie是由域限制這樣是爲了防止安全漏洞的原因。

查看此答案的方式:Cross-Domain Cookies