Javascript 为focus()设置正确的上下文;
当我想应用focus()时,如何获得正确的上下文集 我尝试做的基本上是:Javascript 为focus()设置正确的上下文;,javascript,javascript-events,Javascript,Javascript Events,当我想应用focus()时,如何获得正确的上下文集 我尝试做的基本上是: elemnt = document.getElementById('someFormField'); elemnt.focus('none'); 只有对焦点的调用在脚本中的其他地方生成,在应用程序请求时排队并应用 function testIt() { var queued = { elementId: 'someFormField' , func: focus
elemnt = document.getElementById('someFormField');
elemnt.focus('none');
只有对焦点的调用在脚本中的其他地方生成,在应用程序请求时排队并应用
function testIt() {
var queued = {
elementId: 'someFormField'
, func: focus
, args: ['none']};
elemnt = document.getElementById(queued.elementId);
queued.func.apply(elemnt, queued.args);
}
上述方法适用于其他函数,但对于focus方法,我得到一个错误:
Opera:这个错误是错误的
Firefox:uncaughtexception:[exception…”“WrappedNative原型对象上的非法操作”(…)]
如何才能使其正常工作? (我试图理解这个问题,所以我对“使用框架X”的答案不感兴趣)
更新:
关于我为什么将参数传递给
focus()
,似乎有一些混淆:我只包含了该参数,以表明将参数传递给focus()
不会导致错误
我不妨键入:
document.getElementById('someFormField').focus();
更新(2):
因为的答案在IE6中不起作用,我现在使用一个中间函数来解决这个问题:
function testIt() {
var queued = {
elementId: 'someFormField'
, func: setFocus
, args: ['someFormField']};
elemnt = document.getElementById(queued.elementId);
queued.func.apply(elemnt, queued.args);
}
function setFocus(elemntId) {
document.getElementById(elemntId).focus();
}
如果IE6兼容性不在您的需求表中,为了避免混淆自己的功能是什么,我总是从一个闭包开始,直到我需要减少内存使用:
var dofocus = function(){element.focus()};
dofocus();
如果您处于循环中且元素
正在更改,则可以使用返回另一个函数的函数:(函数(e,m){return function(){e[m]()})(元素,方法)
编辑:重读这个问题时,我认为您的代码不起作用的原因是因为您传入了名为“focus”的变量的值,而不是字符串方法名“focus”,或者更确切地说是focus函数(它是在别处定义的吗?)
编辑:此功能:
<html><title>test</title><script>
function foo (id, method, args) {
var d = {"id": id, "method": method, "args": args};
// ... time passes
var e = document.getElementById(d.id); // test exists
var f = e[d.method]; // test exists
var a = d.args; // test is an array
f.apply(e, a);
}
</script><body id="thebody">
<p>
<button onclick="foo('bar', 'setSelectionRange', [4,6]);">select</button>
<button onclick="foo('bar', 'focus', []);">focus</button>
<input type="text" id="bar" value="foo bar baz">
<p>
<button onclick="foo('thebody', 'appendChild', [document.createTextNode(new Date())]);">body</button>
</body></html>
测试
函数foo(id、方法、参数){
var d={“id”:id,“method”:method,“args”:args};
//…时间流逝
var e=document.getElementById(d.id);//测试存在
var f=e[d.method];//测试存在
var a=d.args;//测试是一个数组
f、 适用(e,a);
}
选择
集中
身体
编辑:如果传递函数是问题所在,您可以始终传递可选的方法名称并测试该方法是字符串还是函数,然后可以使用“焦点”或自定义函数,而无需将其放置在元素上。读取线程
从这个线索中,我们了解到仅仅使用“焦点”是行不通的,就像这样:
focus.apply(document.getElementById('someElement'));
(你正在尝试的一个简单例子)因为“焦点”必须有一个绑定到的元素。否则,它不是绑定函数,而是没有实际引用的本机调用。我的猜测是,对于任何特定于元素的函数都是这样
您需要做的是从目标元素或另一个具有焦点函数的DOM元素中获取焦点元素。例如,这将起作用:
var fn = document.createElement('input').focus;
fn.apply( document.getElementById('someElement') );
您可以将某些内容传递给focus?您可以将任何内容传递给focus,javascript会很高兴地忽略它。@Paolo:focus()忽略参数。如果需要“解焦”,可以使用blur()方法。@Joel:是的,我很清楚。我不确定他到底想做什么?不,我指的焦点方法是原生javascript方法。这是因为我的回答中描述的原因-你不再传递方法,而是传递字符串,然后f变成了对dom元素上存在的方法的引用。在现代浏览器中,函数的工作方式与预期一样。。。它只是没有在IE6中运行,所以我必须编写一些其他的解决方案:(
(函数(e,m){return function(){e[m]()})(元素,方法)
应该是(函数(e,m){return function(){e[m];};})(元素,方法)
@Justin Johnson:在脚本中,在块的最后一个语句上分号是可选的(例如,Firefox javascript.options.strict=true),这可能会让人恼火或引入粗心的bug…除非整个事情都在一行上,无论如何,像这里这样。