Я переопределяю оригинальный метод .focus (). Есть ли способ для меня, чтобы продолжать делать это, не нарушая первоначальное поведение - PullRequest
2 голосов
/ 14 марта 2011

Несколько месяцев назад я сделал библиотеку Javascript для своей работы, и теперь похоже, что у нее есть проблема с обработчиком событий, проблема в том, что у меня есть функция триггерных событий с помощью метода fireEvent, который прекрасно работает,и у меня есть что-то вроде этого:

["focus", "click", "blur", ...].each(function(e){
    MyEvents[e] = function(fn){
        if(!fn){
            trigger(element, e);
        } else {
            addEvent(element, e, fn);
        }
    }
});

Конечно, это просто идея, оригинальная функция намного больше ... ну, как вы можете заметить, я создал собственную функцию для всех стандартных событий, так чтоя просто называю это как "element.click (function ...); и так ...

Проблема в том, что теперь, если я делаю" input.focus (); ", он не получает фокус, но этовызвать событие, как я могу сделать так, чтобы элемент оказался в фокусе, может быть, удалить фокус из массива, и если я это сделаю, придется ли мне удалять некоторые другие события, такие как submit, blur и т.д. ??

спасибо, на самом деле библиотека тестируется, поэтому эти ошибки необходимо исправить как можно скорее.

Еще раз спасибо.

1 Ответ

6 голосов
/ 14 марта 2011

Чтобы получить элемент в фокусе - (то есть не вызывать само событие, а фокусировать элемент), вы используете метод .focus().

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

Вы просто делаете что-то вроде этого:

document.getElementById('#inputbox').focus();

да, это так просто, как это

Конечно, я понятия не имею, как вы ссылаетесь на элементы в первую очередь.

после пояснений в комментариях

Я повторю ваш вопрос: «Я переопределяюоригинальный метод .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();

JS Fiddle link: http://jsfiddle.net/DK8M7/

Хорошо, яне уверен, сколько из этих переменных вы знакомы.Я даю обзор:

  • HTMLInputElement - это имя исходного объекта (воспринимается как «имя класса») для всех элементов ввода
  • .prototypeявляется объектом, ссылающимся на статический объект, совместно используемый всеми объектами, которые были или еще не были созданы.Вроде как источник.
  • .apply() - это метод, используемый для вызова функции из определенного контекста - то есть вы выбираете, что это «этот» объект, а последний аргумент представляет собой массив его параметров
  • arguments - это специальный массив javascript, доступный для всех функций, который включает в себя массив всех его параметров.

Подробнее о методе apply: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

Переопределение методов blur () всех входных элементов

Еще одна вещь ... Если вы хотите, чтобы все ваши входные элементы имели такое поведение, самый простой способ - на самом деле переопределить его прототип.так как мы находимся на этом пути, вот как вы это сделаете:

HTMLInputElement.prototype.blurCpy = HTMLInputElement.prototype.blur;

HTMLInputElement.prototype.blur = function () {
    HTMLInputElement.prototype.blurCpy.apply(this, arguments);
}    

Cheers ..

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