首页 \ 问答 \ 在GTM的数据层中使用时,Javascript变量未定义(Javascript variable undefined when used in data layer in GTM)

在GTM的数据层中使用时,Javascript变量未定义(Javascript variable undefined when used in data layer in GTM)

我在GTM数据层中使用了一个从Liferay rest API调用中获取其值的变量。

var openId;
AUI().ready('aui-base', function(A){
Liferay.Service(
       '/user/get-user-by-id',
        {
        userId: Liferay.ThemeDisplay.getUserId()
        },
        function(obj) {
          openId=obj.openId;
        }
                );
    });

这里openId变量在GTM dataLayer中被使用,在那里它不可用并且显示为undefined 。 数据层定义如下:

dataLayer = [{
                "page" : Liferay.currentURL
                ,"pageType" : instrDetail
                ,"user" : {
                            "type" : userType
                            ,"accountId" : openId
                          }
             }];

最后,我们有GTM块,定义标签管理器脚本块。

(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');

现在,当我尝试访问dataLayer中的openId变量时,它显示为未定义,而当我尝试访问同一个浏览器控制台时,它显示正确的值。


I am using a variable in GTM data layer which retrieves its value from Liferay rest API call.

var openId;
AUI().ready('aui-base', function(A){
Liferay.Service(
       '/user/get-user-by-id',
        {
        userId: Liferay.ThemeDisplay.getUserId()
        },
        function(obj) {
          openId=obj.openId;
        }
                );
    });

Here the openId variable is being used in GTM dataLayer,where it is not available and shows as undefined. The data layer is defined as below:

dataLayer = [{
                "page" : Liferay.currentURL
                ,"pageType" : instrDetail
                ,"user" : {
                            "type" : userType
                            ,"accountId" : openId
                          }
             }];

and in the end,we have the GTM block,defining the tag manager script block.

(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');

Now,when I try to access the openId variable in dataLayer,it shows as undefined,whereas when I try to access the same one browser console,it displays the correct value.


原文:https://stackoverflow.com/questions/41738649
更新时间:2023-10-17 17:10

最满意答案

C#md5输出可能如下所示: 09-8F-6B-CD-46-21-D3-73-CA-DE-4E-83-26-27-B4-F6

Javascript md5输出看起来像: 098f6bcd4621d373cade4e832627b4f6

为了使它看起来一样,只需要你的c#输出并执行此操作:

csharp_md5.ToLower().Replace('-', '');

md5是所有语言的相同媒介,结果字母数字字符始终相同。


C# md5 output may look like: 09-8F-6B-CD-46-21-D3-73-CA-DE-4E-83-26-27-B4-F6

Javascript md5 output looks like: 098f6bcd4621d373cade4e832627b4f6

To make it look the same, just take your c# output and do this:

csharp_md5.ToLower().Replace('-', '');

md5 is an identical medium across all languages, the resulted alphanumeric characters are always the same.

相关问答

更多
  • MD5值就像是人的身份证一样 没有重复的 如果有人做了个软件 那么这个软件就有了唯一的MD5值 如果别人改编或者植入病毒 即使文件大小没有改变 MD5也是不一样了 你下载了一个软件或者文件包 如果给了你MD5值 你就可以用MD5效验器查看文件的MD5是否相同 如果相同就是说你的文件下载的是源文件 没有被删改过
  • 以下两个不同的128个字节序列散列到同一个: MD5哈希 :79054025255fb1a26e4bc422aef54eb4 下面的差异被突出显示(粗体)。 对不起,这很难看。 d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6 ...
  • 虽然有MD5算法的JS实现 ,但较老的浏览器通常无法从本地文件系统读取文件 。 我在2009年写了那么新的浏览器呢? 使用支持FileAPI的浏览器,您可以*读取文件的内容 - 用户必须选择它,或者使用元素或拖放。 截至2013年1月,主要浏览器的主要方式如下: FF 3.6支持FileReader ,FF4支持更多的基于文件的功能 Chrome从版本7.0.517.41起支持FileAPI Internet Explorer 10具有部分FileAPI支持 Opera 11.10 对File ...
  • 我听说过约瑟夫的Myers实施速度非常快。 此外,他还有一篇关于Javascript优化的长篇文章 ,描述了他在编写实现过程中学到的内容。 对于对性能javascript感兴趣的人来说,这是一个很好的阅读。 http://www.webreference.com/programming/javascript/jkm3/ 他的MD5实现可以在这里找到 I've heard Joseph's Myers implementation is quite fast. Additionally, he has a l ...
  • C#md5输出可能如下所示: 09-8F-6B-CD-46-21-D3-73-CA-DE-4E-83-26-27-B4-F6 Javascript md5输出看起来像: 098f6bcd4621d373cade4e832627b4f6 为了使它看起来一样,只需要你的c#输出并执行此操作: csharp_md5.ToLower().Replace('-', ''); md5是所有语言的相同媒介,结果字母数字字符始终相同。 C# md5 output may look like: 09-8F-6B-CD-46 ...
  • 你试图以错误的方式解决这个问题。 最好的解决方案是使用HTTPS。 这意味着您不必担心模糊输入的密码。 在我的解决方案中,我通过HTTPS接受纯文本密码,然后更进一步检查他们的密码不是我在本地存储的12,000个左右的“简单”密码之一。 You are trying to go about this the wrong way. The best solution is to use HTTPS. This means you don't have to worry about obfuscating th ...
  • 我使用reader.readAsArrayBuffer()让它工作: $(inputElement).change( function () { var reader = FileReader(); reader.addEventListener( 'load', function () { var wordArray = CryptoJS.lib.WordArray.create(th ...
  • 请参见System.Security.Cryptography.MD5和System.Security.Cryptography.SHA256 。 可以在此处找到.NET框架中实现的哈希算法列表。 您还应该查看此博客文章 ,了解有关滚动您自己的身份验证方案的一些提示。 Bcrypt通常是散列密码的好选择,这里有一个.NET端口。 但是,我不确定该项目是否有任何外部代码审查,因此可能值得四处询问。 关于为什么bcrypt是存储密码的首选方法的优秀帖子: http : //codahale.com/how-to ...
  • 你提到的电子邮件是非常古老的(超过两年),而且这个问题在很久以前就已经解决了。 与所有其他散列算法(如SHA1 ,所有SHA-2系列和RIPEMD160 )一样, RIPEMD160在MonoTouch中都可用。 HMAC,对称和非对称算法也是如此。 在.NET中创建加密实例的正确方法是使用基类的工厂,例如 MD5 hash = MD5.Create (); 这将确保您的代码将使用最佳实现(如果有很多可用的,例如,如果本机或硬件优化版本可用)并且将有助于使您的代码更加便携。 The email you r ...
  • 你不能在javascript函数中使用PHP md5。 你必须使用外部JS库。 例如: https : //github.com/blueimp/JavaScript-MD5 所以你的代码应该是这样的: