几个月前我为我的工作创建了一个Javascript库,现在看起来它有一个事件处理程序的问题,问题是我有一个触发器事件函数使用fireEvent方法,这很好用,我有这样的事情:
["focus", "click", "blur", ...].each(function(e){
MyEvents[e] = function(fn){
if(!fn){
trigger(element, e);
} else {
addEvent(element, e, fn);
}
}
});
当然这只是一个想法,原来的功能要大得多......好吧,你可以注意到,我为所有标准事件创建了一个自定义函数,所以我只是把它称为“element.click(函数.. 。);等......
现在的问题是,如果我做“input.focus();”它没有得到焦点,但它触发事件,我怎么能这样做元素实际上焦点?也许从数组中删除焦点?如果我这样做,我是否必须删除其他一些事件,如提交,模糊等?
谢谢,实际上这个库正在测试中,所以这个bug需要尽快纠正。
再次感谢你。
答案 0 :(得分:6)
要使元素处于焦点 - (即,不触发事件本身,但要关注元素),请使用.focus()
方法。
您无法使用上面列出的功能执行此操作,因为这只会分配事件..
您只需执行以下操作:
document.getElementById('#inputbox').focus();
是的,它就像那个一样简单
当然,我不知道你是如何首先引用这些元素的。
我要重述你的问题: “我正在覆盖原始的.focus()方法。有没有办法让我继续这样做,而不会破坏原来的行为?”
是的:)
这是一个例子 - 因为我不知道你的变量或任何东西,我正在为这个例子动态创建一个元素 - 它不是必需的:
e = document.createElement('input');
document.body.appendChild(e);
// note: I'm using .focus() just because it was easier for me to debug.. you
// just as well replace it with .blur() instead.
e.focus = function () {
HTMLInputElement.prototype.focus.apply(this, arguments);
}
e.focus();
JS小提琴链接:http://jsfiddle.net/DK8M7/
好的,我不确定你熟悉的变量中有多少。我正在概述:
HTMLInputElement
是所有输入元素的原始对象的名称(将其视为“类名”).prototype
是一个对象,引用在已经创建或尚未创建的所有对象之间共享的静态对象。有点像起源。.apply()
是一个用于从特定上下文调用函数的方法 - 也就是说,你选择它是“this”对象,后一个参数是它的参数数组arguments
是一个特殊的javascript数组,可以从所有函数访问,其中包含所有函数的数组。有关apply方法的更多信息: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
还有一件事......如果你希望 all 你的输入元素有这种行为,最简单的方法是实际覆盖它的原型..所以既然我们在这条路上,这个你是怎么做到的:
HTMLInputElement.prototype.blurCpy = HTMLInputElement.prototype.blur;
HTMLInputElement.prototype.blur = function () {
HTMLInputElement.prototype.blurCpy.apply(this, arguments);
}
干杯..