【问题标题】:Is it possible to use Optimizely (or other DOM manipulating A/B testing tools) on a site using Angularjs?是否可以在使用 Angularjs 的网站上使用 Optimizely(或其他 DOM 操作 A/B 测试工具)?
【发布时间】:2014-03-22 05:30:51
【问题描述】:

我希望在我们将使用 Angularjs 的网站上使用 Optimizely,但据我了解,这将很困难,因为 Angularjs 的全部目的是不操纵 DOM,而 Optimizely 通过操纵 DOM 来工作。

关于如何使这些工具一起使用成为可能,是否有人对文档有任何指导?也许我可以创建指令来帮助工具工作的结构?

【问题讨论】:

  • “AngularJS 的全部目的是不操纵 DOM”——嗯?我向你保证,AngularJS 对 DOM 进行了很多操作。

标签: javascript angularjs dom optimizely


【解决方案1】:

首先,您需要将实验的“激活模式”设置为“手动”。

然后,为了让 Optimizely 检查实验是否应该运行(即满足 URL 目标),您需要调用 window.optimizely.push(["activate"])。这告诉 Optimizely 做与正常整页加载相同的事情。因此,根据您的情况,您可以从几个不同的位置调用优化 api...

在视图加载时应用的 run 方法中

当您的实验更改与视图加载后 angular 可能生成的动态片段无关时,此方法有效。 $routeChangeSuccess 事件在激活 Optimizely 时不起作用,因为它在有任何 DOM 可操作之前触发。

app.run(function run($rootScope){
    $rootScope.$on('$viewContentLoaded', function() {
        window.optimizely = window.optimizely || [];
        window.optimizely.push(["activate"]);
    });
});

更明确的方法是在实际进行实验的控制器或指令中调用window.optimizely.push(["activate"])。通过这种方式,您可以控制激活的确切时间,例如在加载数据之后。我更喜欢这种方法,因为通常情况下,您将不得不调用优化 API 来记录自定义事件以记录用户无论如何完成了所需的目标,所以如果我明确地进行事件跟踪,我还不如显式优化激活。这是我在需要激活或记录事件时注入的服务...

(function () {
    'use strict';

    function Optimizely($window) {
        $window.optimizely = $window.optimizely || [];

        this.Activate = function () {
            $window.optimizely.push(["activate"]);
        };

        this.TrackEvent = function (eventName) {
            $window.optimizely.push(["trackEvent", eventName]);
        };
    }

    angular.module('myApp').service('Optimizely', Optimizely);
}());

在控制器中的使用...

function MyCtrl(Optimizely) {
    Optimizely.Activate();
    Optimizely.TrackEvent("my_goal_success");
}

【讨论】:

  • 如果您想删除某个页面或事件中的某个项目,我正在想象您是否希望在 TrackEvent 中发生这种情况?
【解决方案2】:

可以,但您需要使用 Optimizely 的 Javascript API。

http://developers.optimizely.com/javascript/

对于任何更深入的内容,您还可以查看自己的分桶和使用自定义维度

自己的分桶示例:https://github.com/tomfuertes/gaab

自定义维度文档:https://support.google.com/analytics/answer/2709829?hl=en

编辑:

在高层次上,Optimizely 是对存储和操作 DOM 的系统的前端抽象。它旨在供非开发人员或想要使用报告部分的开发人员使用。如果您通过使用单独的分析工具(如 GA)编写自己的分桶、拆分和功能来自定义编码 Angular 应用程序,您仍然可以得到同样的结果。听起来令人生畏,但如果您看一下上面的 gaab 示例代码,就会相当简单。

【讨论】:

    【解决方案3】:

    我不确定 Optimizely 是如何工作的,但是 Visual Website Optimizer 有一个功能允许我们使用 JS 添加变体。我们像这样操作内容:

    // get Angular scope from a known DOM element
    e = document.getElementById('some-dom-id');
    scope = angular.element(e).scope();
    // update the model with a wrap in $apply(fn) which will refresh the view for us
    scope.$apply(function() {
        scope.campaign.headline = 'This is a headline.';
    }); 
    

    【讨论】:

      【解决方案4】:

      Optimizely 是使用 jQuery 来操作 DOM。 jQuery 适用于所有 XML 文档。 Angular.js 产生的 DOM(我有这方面的经验)仍然只是一个 DOM。所以你可以修改它。

      但了解 Optimizely 的工作原理后,您也可以将 Angular.js 糖 JavaScript 代码放入 Optimizely 变体代码中。或 jQuery。或任何其他 JS 框架,或普通的旧 JavaScript。没关系。变体代码将由 Optimizely 获得evaled,如果它是有效的 JS(如果您使用 Angular.js 代码并加载了库,它将变为有效),它将被执行。因此,您可以通过 Angular.js 语法进行所有您想要的修改。

      Optimizely 只会决定何时执行并在页面上运行它。它还将为您进行跟踪。从 Angular.js 跟踪 Optimizely 的触发事件应该没有问题。

      【讨论】:

      • 如何从角度范围之外运行角度代码?我是否必须定义在优化运行时可以访问的窗口级辅助函数?
      • 有范围吗?正如我所说,我不熟悉角度。我在jsfiddle.net/KzxB9 中使用了 jquery 和 angular,并且完全可以添加 angular 将与之交互的 DOM 结构。请记住 Optimizely 在您的 JS 已经存在的页面上运行。全球性的一切都可以通过某种方式访问​​。如果您可以在开发控制台中执行此操作,则可以从 Optimizely 使用它。
      • Angular 实际上使用了一个名为 jqLit​​e 的 jQuery 子集。
      【解决方案5】:

      我正在尝试使用输入字段绑定到我的模型,使用优化来更改输入字段,然后强制 angular 重新加载字段

      但似乎 angular 需要触发 .trigger('input') 事件,该事件在 firebug 中有效,但在优化编辑器中无效

      //优化编辑器会添加这一行(用户等) $('.debug.edit-ab-test'.val('abc');

      //在编辑器中不起作用,我尝试过 setInterval 和 setTimeout 来延迟等 $('.debug.edit-ab-test input[type="text"]').trigger('input');

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 1970-01-01
        • 2021-04-25
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多