我正在编写一个Firefox附加组件,目前依赖于jQuery来执行以下操作:
jQuery不适合在XUL中运行,这是我们用它做到这一点的奇迹。我们试图删除jQuery的要求,前两个是简单的(动画很简单,我们可以使用.querySelector()而不是jQuery),但.live已证明不可能自己做。我已经尝试过阅读源代码,但我无法将其分开。
jQuery .live函数在做什么? 显然比document.addEventListener(“focus”/“focusin”,function_to_pick_apart_events)更多。还有什么事发生在这里?
答案 0 :(得分:0)
正如其他人所说,在Firefox插件中使用JQuery可能并不像听起来那么无望。但是直接回答你的问题:JQuery是开源的,所以你总是可以自己寻找。我自己并不熟悉JQuery源代码,但我认为https://github.com/jquery/jquery/blob/master/src/event.js#L552可能是一个很好的起点......
答案 1 :(得分:0)
一种方法可能是在窗口级别捕获焦点事件,然后循环查找可能尚未具有焦点事件侦听器的兴趣元素并添加一个。一个过于简化的例子:
<script>
function handleFocus(event) {
event.target.value = "";
}
function captureFocus() {
document.getElementById("target").onfocus = handleFocus;
}
window.onload = function() {
addEventListener("focus", captureFocus, true);
}
</script>
<input id="target" value="Enter the value">
正如您所看到的,在脚本执行时不需要输入存在于文档中,它将在第一个焦点事件上附加事件侦听器。
答案 2 :(得分:-1)
您是否在noConflict模式下运行JQuery?我有一些同事在Firefox附加组件中发誓JQuery。我已经看到了他们的工作,包括结果和代码,这太棒了。我建议使用noConflict模式,并使用jQuery来引用JQuery而不是$符号。
.live与.bind不同。事实上,现场非常惊人。它不仅将事件处理程序绑定到与特定CSS选择器匹配的元素,还将处理程序绑定到导入到与该选择器匹配的页面上的任何新元素。显然必须进行某种监控以继续将事件绑定到新元素 EDIT :例如下面评论中描述的事件冒泡授权。
考虑到XUL与HTML DOM的结构不同,这可以解释为什么你会遇到.live的问题。
可能的解决方法可能是使用.bind,然后自己为任何新元素添加处理程序,如果这确实是您使用.live的目标。本质上,如果在页面上添加与选择器匹配的新元素,则需要将任何事件绑定到那些在窗口加载时存在这些元素的元素。