在没有事件监听器的情况下使用GTM停止链接点击传播和更改href

时间:2017-03-21 15:32:18

标签: javascript google-tag-manager

我正在使用Google跟踪代码管理器在我的其他分析脚本中触发Facebook像素。没有深入细节,我想做的是以下几点:

  1. 在点击链接并编写cookie时触发。
    • 如果写了所述cookie,则触发自定义html标记。
  2. 该自定义html标记将检查该链接是否为出站链接。
    • 如果链接出站:
      1. 停止传播链接
      2. 然后根据是否已经写入查询字符串,附加“?fb = 1”或“& fb = 1”。
      3. 然后重定向到带有附加字符串的新网址。
    • 如果链接没有出站,则不执行任何操作
  3. 我的自定义HTML标记代码:

    <script>
      var element = {{Click Element}};;
      
      var linkclickurl = '{{Click URL}}';
      
      alert('Click URL is ' + linkclickurl + '. Hostname is {{Page Hostname}}');
      
      // Check if hostname is contained in linkclickurl
      if(linkclickurl.indexOf("{{Page Hostname}}") > -1) {
        alert('Not outbound link');
      }
      else {
        // Check if query string already exists
        if(linkclickurl.indexOf("?") > -1) {
          window.location.href =  linkclickurl + '&fb=1';
          alert('Found a query');
        }
        else {
          window.location.href =  linkclickurl + '?fb=1';
          alert('Found no query');
        }
      }
    </script>

    所以我当前的问题是我不知道在链接点击后如何阻止链接传播。我正在改变href,因为页面将重定向到原始链接,因此无效。

    有没有办法阻止链接在传出时传播,然后将其切换到更新版本?

1 个答案:

答案 0 :(得分:0)

采用@sdhaus建议,我能够使用以下脚本执行此操作:

&#13;
&#13;
function updateLinks(parameter, value)
{

   var links = document.getElementsByTagName('a');
   var includeDomains = self.location.host;
   
   for (var i=0;i<links.length;i++)
   {
       if(links[i].href != "#" && links[i].href != "/" && links[i].href != "" && links[i].href != window.location) //Ignore links with empty src attribute, linking to site root, or anchor tags (#)
       {
           var updateLink = true;           
           
           if(links[i].href.toLowerCase().indexOf(includeDomains.toLowerCase()) != -1) //Domain of current link is included i the includeDomains array.  Update Required...
           {
             updateLink = false;
           }           
       
           if(!updateLink)
           {
               //Do nothing - link is internal
           }
           else
           {
               var queryStringComplete = "";
               var paramCount = 0;
           
               var linkParts = links[i].href.split("?");
               
               if(linkParts.length > 1) // Has Query String Params
               {
                   queryStringComplete = "?";
               
                   var fullQString = linkParts[1];
                   var paramArray = fullQString.split("&");    
                   var found = false;
                   
                   for (j=0;j<paramArray.length;j++)
                   {
                       
                       var currentParameter = paramArray[j].split("=");
                       
                       if(paramCount > 0)
                           queryStringComplete = queryStringComplete + "&";
                       
                       if(currentParameter[0] == parameter) //Parameter exists in url, refresh value
                        {
                            queryStringComplete = queryStringComplete + parameter + "=" + value;
                            found = true;
                        }
                        else
                        {
                            queryStringComplete = queryStringComplete + paramArray[j]; //Not related parameter - re-include in url
                        }
                       
                        paramCount++;
                   }
                   
                   if(!found) //Add new param to end of query string
                       queryStringComplete = queryStringComplete + "&" + parameter + "=" + value;
               }
               else
               {
                   queryStringComplete = "?" + parameter + "=" + value;
               }
                   
               links[i].href = links[i].href.split("?")[0] + queryStringComplete;        
           }
       }
       else
       {
           //Do nothing
       }
   }
}
&#13;
&#13;
&#13;