【发布时间】:2016-01-18 14:27:36
【问题描述】:
Optimizely A/B 测试服务广泛使用.replaceWith("new HTML") 来生成简单的 A/B 测试。这具有从被替换元素中移除正在侦听事件的任何事件侦听器的副作用,即使新元素具有相同的 ID/类。
例子:
-
DOM 包含:
<div class="something"> <button id="myButton"></button> </div> 收听者:
$("#myButton").click(function() { console.log('clicked!'); });替换为:
$(".something").replaceWith("some new HTML, containing #myButton");
在第 3 步之后,点击 #myButton 不再起作用,因为原始 DOM 元素已被销毁并添加了一个新元素。
解决这个问题的好方法是什么?
可能的解决方案
- 了解您的代码库并在 Optimizely 的实验中“重新添加”适当的事件侦听器。
- 问题:A/B 测试人员可能不是真正的软件开发人员,认为这很麻烦。
- 似乎不是很干净的方式
在 Optimizely 之后找到一种执行代码的方法,以这种方式添加所有事件侦听器。有什么好办法吗?
-
使用“使用 $.on() 的事件委托”,如下所述:how to replace HTML with jQuery but keep event bindings
- 问题:很难预测 A/B 测试和替换的具体内容
编辑: 我正在使用 jQuery 1.11.x
【问题讨论】:
-
为什么不直接使用
on()来处理任何可能的 a\b 目标? -
我当前的问题 atm 中有一些
.blur()和.click()电话。这些不只是.on('blur',fn)和.on('click', fn)的别名吗? -
它们不是别名。一个粗略的解释是
$('identifier').on()将侦听任何匹配'identifier'的元素,而click()或blur()将仅将侦听器附加到现有元素。更多信息:stackoverflow.com/questions/9122078/… -
.blur() 上的 jQuery API 文档:“此方法是 .on("blur", handler) 的快捷方式" (api.jquery.com/blur)... -.- 这只是糟糕的措辞在文档中还是我看错了地方?
-
事情可能发生了变化,但我认为这种宣传有点令人困惑。查看api.jquery.com/on 的“委托事件”部分。我认为快捷方式是
on(event, handler),而您可能想要on(event, delegatedElement, handler)。
标签: javascript jquery ab-testing optimizely