Jav*_*rez 2 javascript javascript-framework
几个月前我为我的工作制作了一个Javascript库,现在看起来它有一个事件处理程序的问题,问题是我有一个触发器事件函数使用fireEvent方法,这很好用,我有这样的事情:
["focus", "click", "blur", ...].each(function(e){
MyEvents[e] = function(fn){
if(!fn){
trigger(element, e);
} else {
addEvent(element, e, fn);
}
}
});
Run Code Online (Sandbox Code Playgroud)
当然这只是一个想法,原始功能要大得多......好吧,你可以注意到,我为所有标准事件创建了一个自定义函数,所以我只是把它称为"element.click(function ...);所以...
问题是现在如果我做"input.focus();" 它没有得到焦点,但它触发事件,我怎么能这样做元素实际上焦点?也许从数组中删除焦点?如果我这样做,我将不得不删除一些其他事件,如提交,模糊等?
谢谢,实际上库正在测试中,所以这个bug需要尽快纠正.
再次感谢你.
要使元素处于焦点 - (即,不触发事件本身,而是聚焦元素),您可以使用该.focus()方法.
你不能用上面列出的函数做到这一点,因为它只分配事件..
你只需要这样做:
document.getElementById('#inputbox').focus();
Run Code Online (Sandbox Code Playgroud)
是的,就这么简单
当然,我不知道你是如何首先引用这些元素的.
我将重述你的问题:"我正在覆盖原始的.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();
Run Code Online (Sandbox Code Playgroud)
JS小提琴链接:http://jsfiddle.net/DK8M7/
好的,我不确定你熟悉的那些变量有多少.我给出了一个概述:
HTMLInputElement 是所有输入元素的原始对象的名称(将其视为"类名").prototype是引用已经创建或尚未创建的所有对象共享的静态对象的对象.有点像起源..apply() 是一个用于从特定上下文调用函数的方法 - 也就是说,你选择它是"this"对象,后一个参数是它的参数数组arguments 是一个特殊的javascript数组,可以从所有函数访问,包括所有函数的数组.有关apply方法的更多信息:https: //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
还有一件事......如果你想让你所有的输入元素都有这种行为,最简单的方法是实际覆盖它的原型..所以既然我们在这条路上,你就是这样做的:
HTMLInputElement.prototype.blurCpy = HTMLInputElement.prototype.blur;
HTMLInputElement.prototype.blur = function () {
HTMLInputElement.prototype.blurCpy.apply(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)
干杯..