Как и Пол Диксон сказал, что вы можете использовать call , но я предлагаю вам использовать применить вместо.
Однако причина, по которой я отвечаю, заключается в том, что я обнаружил тревожную ошибку: Вы фактически заменяете все свои обработчики событий на обработчик событий последней кнопки. Не думаю, что это было то, что вы предполагалось, не так ли? (Подсказка: вы заменяете значение для originalEventHandler в каждой итерации)
В приведенном ниже коде вы найдете работающее кросс-браузерное решение:
function btnWrap_onClick()
{
var btns = document.getElementsByTagName("button");
for( var i = 0; i < btns.length; i++)
{
var btn = btns[i];
// handle wrap button differerntly
if( "btnWrap" == btn.id)
{
btn.disabled = true;
continue; // skip this button
}
// wrap it
var newOnClick = function()
{
alert("Starting event handler");
var src=arguments.callee;
src.original.apply(src.source,arguments);
alert("Finished event handler");
}
newOnClick.original = btn.onclick; // Save original onClick
newOnClick.source = btn; // Save source for "this"
btn.onclick = newOnClick; //Assign new handler
}
alert("Buttons wrapped successfully");
}
Сначала я создаю новую анонимную функцию и сохраняю ее в переменной newOnClick . Поскольку функция является объектом, я могу создавать свойства объекта функции, как и любой другой объект. Я использую это для создания свойства original , которое является исходным обработчиком onclick, и source , которое является исходным элементом, который будет this , когда исходный обработчик называется.
Внутри анонимной функции мне нужно получить ссылку на функцию, чтобы можно было получить значение свойств original и source . Поскольку у анонимной функции нет имени, я использую arguments.callee (которая поддерживается с MSIE5.5), чтобы получить эту ссылку и сохранить ее в переменной src.
Затем я использую метод apply , чтобы выполнить оригинальный обработчик onclick. apply принимает два параметра: первый будет значением this , а второй - массив аргументов. this должен быть элементом, к которому был прикреплен оригинальный обработчик onclick, и это значение было сохранено в source . arguments является внутренним свойством всех функций и содержит все аргументы, с которыми была вызвана функция (обратите внимание, что для анонимной функции не заданы какие-либо параметры, но если она все равно вызывается с некоторыми параметрами, они будут находится в свойстве arguments ).
Причина, по которой я использую apply , заключается в том, что я могу переслать все аргументы, с которыми была вызвана анонимная функция, и это делает эту функцию прозрачной и кросс-браузерной. (Microsoft помещает событие в window.event, но другие браузеры предоставляют его в первом параметре вызова обработчика)