6

我在使用带有动态添加链接的 mixpanel.track_links 时遇到问题(页面加载后)。

对于一个一般示例,给定此页面:

<div id="link-div"></div>
<input type="button" id="add-link" />
<script type="text/javascript">
mixpanel.track_links(".mixpanel-event", "event name", function(ele) { return { "type": $(ele).attr("type")}});
</script>

在某些用户操作中,使用 jquery 将链接添加到页面。例如:

$('#add-link).click(function() {
    $('#link-div').html('<a class="mixpanel-event" type="event-type" href="#>Link to track</a>');
})

问题是在单击新创建的链接时不会触发 track_links 。我希望有人可以分享他们在启用 track_link 函数以用于动态添加的链接方面的经验。

4

2 回答 2

7

我很好奇,所以我检查了他们的代码并继续按照他们的建议进行操作。我测试了它,它工作得很好。不过,这需要 jQuery。

示例用法:mixpanel.delegate_links(document.body, 'a', 'clicked link');

// with jQuery and mixpanel
mixpanel.delegate_links = function (parent, selector, event_name, properties) {
    properties = properties || {};
    parent = parent || document.body;
    parent = $(parent);

    parent.on('click', selector, function (event) {
        var new_tab = event.which === 2 || event.metaKey || event.target.target === '_blank';

        properties.url = event.target.href;

        function callback() {
            if (new_tab) {
                return;
            }

            window.location = properties.url;
        }

        if (!new_tab) {
            event.preventDefault();
            setTimeout(callback, 300);
        }

        mixpanel.track(event_name, properties, callback);
    });
};
于 2013-08-30T22:37:46.350 回答
0

我很难让跟踪链接在反应中按预期工作。我注意到的主要警告是重复的事件可能会突然发送到混合面板。我使用了一个稍微修改过的@Kyle 版本来解决我的问题。此外,这properties可能是 mixpanel API 支持的功能。

// mixpanelSetup.js
import md5 from "md5";

const setup = () => {
  mixpanel.init(TOKEN);
  // Sets ensure unique items
  mixpanel.delegated_links = new Set();
  mixpanel.delegate_links = (parent, selector, eventName, eventProperties, {ignoreUrl=false}) => {
    // Hash by whatever thing(s) the use case considers 'unique' (e.g md5(`${selector}__${eventName}`))
    const linkHash = md5(selector);
    parent = parent || document.body;
    parent = $(parent);
    // Do not add additional trackers for an already tracked event.
    if (mixpanel.delegated_links.has(linkHash)) {
      return;
    }
    mixpanel.delegated_links.add(linkHash);
    parent.on("click", selector, (event) => {
      const newTab = event.which === 2 || event.metaKey || event.target.target === "_blank";
      if (typeof eventProperties === "function") {
        eventProperties = eventProperties(event.target) || {};
      }
      eventProperties.url = event.target.href;
      // In case we don't want the url on the properties.
      if (ignoreUrl) {
        delete eventProperties.url;
      }
      const callback = () => {
        if (newTab) {
          return;
        }
        window.location = event.target.href;
      };
      if (!newTab) {
        event.preventDefault();
        setTimeout(callback, 300);
      }
      console.debug("Tracking link click!");
      mixpanel.track(eventName, eventProperties, callback);
    });
  };
}

并可用作:

// MyComponent.jsx
import React, { useEffect } from "react";
import { Link, useLocation } from "@reach/router";

const MyComponent = ({ moduleName, key, ...props }) => {
  const id = `#${id}__${moduleName}`;

  useEffect(() => {
    mixpanel.delegate_links(document.parent, id, event => {
      return {
          module: event.id.split("__").pop(),
          ...props.otherPropsToTrack
      };
    })
  }, [])

  return <>
    <Link {...props} to="/some/path" id={id}>My Page</Link>
  </>
}
于 2020-09-25T03:01:39.900 回答