Ссылка и вызов метода в JavaScript - PullRequest
3 голосов
/ 04 июня 2010

У меня есть некоторый код JavaScript / jQuery, который отслеживает «измененное» событие в флажке:

$(control).change(function() {
    alert("changed to: " + $(this).is(":checked"));
});

Это отлично работает.

Я хотел бы создать ссылку на функцию change () для конкретного объекта и вызвать ее косвенно, например, так:

var onSomeChange = $(control).change;
onSomeChange(function() {
    alert("changed to: " + $(this).is(":checked"));
});

Мне нужно вызвать его косвенно, потому что я хочу поменять метод, который я назначаю onSomeChange, на другой, в зависимости от обстоятельств. (Единственное назначение onSomeChange приведено здесь только для иллюстрации).

Это не работает. В Firebug я получаю эту ошибку:

this.bind не является функцией

Как я могу получить ссылку на метод объекта и вызвать его, не вызывая его непосредственно из объекта?

Фон

Контекст может быть значительным; если есть совершенно другой способ делать то, что я хочу, то это тоже нормально.

Поведение события change в JavaScript немного отличается для флажков и переключателей. Флажок срабатывает каждый раз, когда меняется его состояние (отмечено или не отмечено). Однако переключатели (по крайней мере, в Firefox; я думаю, что это еще сложнее в других браузерах) запускают изменения только для группы переключателей в целом. Это понятно, но я хочу привязать различные действия к состояниям отдельных переключателей. (В частности, я хочу скрыть или показать некоторые элементы div в зависимости от состояния переключателя).

Я думаю, что могу справиться с расхождениями в событиях, привязав пользовательское событие к каждой радиостанции и затем запустив его на основе change в группе. Поэтому я расширил jQuery для добавления метода radioChange (). Этот метод

Теперь я хотел бы заменить этот код чем-то, что вызывает другой метод обработки событий в зависимости от типа элемента управления. (Помимо: это потому, что переключатели, кажется, обрабатываются иначе, чем флажки, поэтому у меня другое событие, относящееся к переключателям). Я добавил метод расширения radioChanged () в jQuery для поддержки этого.

Теперь я хочу иметь метод, который регистрирует прослушиватель на change () или radioChanged () в зависимости от типа объекта. Определить это легко:

var change = $(control).is(":radio") ? $(control).radioChange : $(control).change;

Проблема в том, что я на самом деле не могу вызвать метод по ссылке change, не генерируя ошибку выше.

Есть что-то еще, что я должен сделать, чтобы сделать эту работу?

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Ответ на оригинальный вопрос:

Вам необходимо применить его к объекту, который имеет привязку как прототип. вероятно, достаточно просто передать $ (control) как рассматриваемый объект, или, возможно, достаточно $.

var $control = $(control);
var change = $control.change;
change.call( $control, 
    function() {
      alert("changed to: " + $(this).is(":checked"));
    }
);
2 голосов
/ 04 июня 2010

звучит так, как будто вам просто нужно вызвать событие bind и передать ему целевую строку события

$(control).bind($(control).is(":radio") ? "radioChange", "change", function () {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...