gpt4 book ai didi

javascript - 为 focus() 设置正确的上下文;

转载 作者:行者123 更新时间:2023-11-30 18:55:51 24 4
gpt4 key购买 nike

当我想应用 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: WRONG_THIS_ERR
Firefox: uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" (...)]

如何让它发挥作用?

(我试图理解这个问题,所以我对“使用框架 X”的答案不感兴趣)

更新:
对于为什么我将参数传递给 focus() 似乎有些困惑:我只包含参数以表明将参数传递给 focus() 不会导致错误。

我还不如输入:

document.getElementById('someFormField').focus();

更新(2):
因为Anonymous的答案在 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 兼容性不在您的需求表中,Anonymous's solution is the answer

最佳答案

为了避免混淆什么函数做什么,我总是从闭包开始,直到我需要减少内存使用:

var dofocus = function(){element.focus()};
dofocus();

如果你在一个循环中并且 element 正在改变,你可以使用一个返回另一个函数的函数:(function(e,m){return function(){e[ m]()}})(元素, 方法)

编辑:在重读问题时,我认为您的代码不起作用的原因是您传递的是某个名为“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>

编辑:如果传递函数是问题所在,您始终可以传递一个可选的方法名称并测试该方法是字符串还是函数,然后可以使用“焦点”或自定义函数,而不必将其放在元素上。

关于javascript - 为 focus() 设置正确的上下文;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2123959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com