2009-01-14 63 views
9

如何將一個事件處理程序從一個元素複製到另一個元素?例如:將一個元素的事件處理程序複製到另一個元素上?

$('#firstEl') 
    .click(function() { 
     alert("Handled!"); 
    }) 
; 

// here's where the magic happens 
$('#secondEl').click = $('#firstEl').click; // ???? 

注意,第二個元素在不同的時間被處理時的第一要素是獲取其處理程序,這意味着這樣的:

$('#firstEl, #secondEl').click(function() { ... }); 

...不會工作。

+0

顯示它不使用jQuery。 – 2012-05-04 09:12:01

+0

@ShaneReustle這是一個關於jQuery事件的問題... – nickf 2012-05-06 19:21:00

+0

在後臺工作就像普通事件一樣。我希望看到如何在標準JS事件上使用jQuery。 – 2012-05-26 03:28:08

回答

4

您不能輕易(也可能不應該)「複製」事件。你可以做的是使用相同的函數來處理每個:

var clickHandler = function() { alert('click'); }; 
// or just function clickHandler() { alert('click'); }; 

$('#firstEl').click(clickHandler); 

// and later 
$('#secondEl').click(clickHandler); 

另外,您可以真正火的第一個元素的事件在第二個處理程序:

$('#firstEl').click(function() { 
    alert('click'); 
}); 

$('secondEl').click(function() { 
    $('#firstEl').click(); 
}); 

編輯:@nickf擔心污染全局命名空間,但是這幾乎總是可以通過在對象包裝代碼來避免:

function SomeObject() { 
    this.clickHandler = function() { alert('click'); }; 
} 
SomeObject.prototype.initFirstEvent = function() { 
    $('#firstEl').click(this.clickHandler); 
}; 
SomeObject.prototype.initSecondEvent = function() { 
    $('#secondEl').click(this.clickHandler); 
}; 

或匿名函數包裝一下你的代碼,並立即調用它:

(function() { 
    var clickHandler = function() { alert('click'); }; 
    $('#firstEl').click(clickHandler); 
    $('#secondEl').click(clickHandler); 
})(); 
+0

啊是的,這將工作,但我希望有一種方法不會污染全局名稱空間。 – nickf 2009-01-14 03:57:52

0

這是你在找什麼? 。

var clickHandler = function() { alert("Handled!"); } 
$('#firstEl').click(clickHandler); 
$('#secondEl').click(clickHandler); 
1

你可能會感興趣的triggerHandler method

// here's where the magic happens 
//$('#secondEl').click = $('#firstEl').click; // ???? 
$('#secondEl').click(function() { 
    $('#firstEl').triggerHandler('click'); 
}); 
21

這個問題已經回答了,但以供將來參考:你可以將它們拷貝通過迭代原始元素的事件並將其處理程序綁定到目標。

>請參閱下面的編輯!

// iterate event types of original 
$.each($('#original').data('events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

這是非常方便,當你有沒有原始元素的控制,只是想克隆某個元素的行爲(使用插件時,例如)。

編輯:訪問元素事件處理程序已在後來的jQuery版本中進行了更改。這應該對新版本的工作:

$.each($._data($('#original').get(0), 'events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

乾杯遺憾的是沒有一個答案

相關問題