Передача параметра в вызванный обработчик события, т.е. element.onchange ();Javascript - PullRequest
2 голосов
/ 14 июля 2011

У меня есть такая функция:

function doSomething()
{
  // do something with select element
}

document.getElementById("selectel").onchange = doSomething;

// Call onchange event
document.getElementById("selectel").onchange();

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

document.getElementById("selectel").onchange("hello");

, но это не сработало.

Спасибо за вашу помощь.

Ответы [ 4 ]

4 голосов
/ 14 июля 2011

Вам необходимо привязать параметр к вашей функции.Я собираюсь скопировать вставить функцию из Ext-JS, которая позволяет вам сделать это. Предупреждение : не для начинающих

/**
 * Create a new function from the provided <code>fn</code>, change <code>this</code> to the provided scope, optionally
 * overrides arguments for the call. (Defaults to the arguments passed by the caller)
 *
 * @param {Function} fn The function to delegate.
 * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
 * <b>If omitted, defaults to the browser window.</b>
 * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
 * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
 * if a number the args are inserted at the specified position
 * @return {Function} The new function
 */
function bind(fn, scope, args, appendArgs) {
    var method = fn,
        applyArgs;

    return function() {
        var callArgs = args || arguments;

        if (appendArgs === true) {
            callArgs = Array.prototype.slice.call(arguments, 0);
            callArgs = callArgs.concat(args);
        }
        else if (typeof appendArgs == 'number') {
            callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
            applyArgs = [appendArgs, 0].concat(args); // create method call params
            Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
        }

        return method.apply(scope || window, callArgs);
    };
}

Вы можете использовать его как

function onChange(e, customParameter) {
  // Whatever code
}

document.getElementById("selectel").onchange = bind(onChange, null, ["customParameter"], true);

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

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

Вот jsfiddle, чтобы увидеть его в действии http://jsfiddle.net/yBhG6/

3 голосов
/ 14 июля 2011

Объявление анонимной функции:

document.getElementById("selectel").onchange = function() { doSomething("hello"); }
1 голос
/ 14 июля 2011

Я вижу два подхода к этому вопросу.

Один из них - это обратный вызов напрямую, передав select как this:

doSomething.apply(document.getElementById("selectel"), "Hello");

Второй аналогичен Игорю, но с помощью других переменных:

var param = "foo"; // Whatever default is
document.getElementById("selectel").onchange = function() {
    doSomething(param);
} 

param = "hello";
document.getElementById("selectel").onchange();
1 голос
/ 14 июля 2011

Вы можете использовать метод apply (), который позволяет передавать аргументы.

doSomething.apply(document.getElementById("selectel"), "hello");
...