Установите правильный контекст для фокуса (); - PullRequest
1 голос
/ 23 января 2010

Как получить правильный контекст, если я хочу применить фокус ()?

Я пытаюсь сделать следующее:

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 - это ответ

Ответы [ 2 ]

1 голос
/ 23 января 2010

Читать ветку здесь .

Из этого потока мы узнаем, что использование только «фокуса» не работает, например:

focus.apply(document.getElementById('someElement'));​

(простой случай того, что вы пытаетесь), потому что у «фокуса» должен быть элемент, с которым он связан. В противном случае, это не связанная функция, а просто собственный вызов без реальной ссылки. Я предполагаю, что это будет иметь место для любых специфичных для элемента функций.

Что вам нужно сделать, это извлечь элемент фокусировки либо из целевого элемента, либо из другого элемента DOM, который имеет функцию фокусировки. Например, это будет работать:

var fn = document.createElement('input').focus;
fn.apply( document.getElementById('someElement') );
1 голос
/ 23 января 2010

Во избежание путаницы с тем, что и для чего выполняет функция, я всегда начинал с замыкания, пока мне не потребовалось уменьшить использование памяти:

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

Если вы в цикле и element меняется, вы можете использовать функцию, которая возвращает другую функцию: (function(e,m){return function(){e[m]()}})(element, method)

Редактировать : Если перечитать вопрос, я думаю, что ваш код не работает, потому что вы передаете значение некоторой переменной с именем '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>

Редактировать : И если проблема заключалась в передаче функций, вы всегда можете передать необязательное имя метода и проверить, является ли метод строкой или функцией, а затем использовать «фокус» или пользовательский функция без необходимости помещать его на элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...