Javascript 为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

当我想应用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…除非整个事情都在一行上,无论如何,像这里这样。