Tengo que decir que muchas de las respuestas son interesantes, pero recientemente tuve un problema similar y la solución fue extremadamente simple siguiendo el camino del DOM. Es diferente porque no itera sino que apunta directamente al evento que necesita, pero a continuación le daré una respuesta más general.
Tenía una imagen en una fila:
<table>
<td><tr><img class="folder" /></tr><tr>...</tr></td>
</table>
Y esa imagen tenía un controlador de eventos de clic adjunto:
imageNode.click(function () { ... });
Mi intención era expandir el área en la que se podía hacer clic a toda la fila, por lo que primero obtuve todas las imágenes y filas relativas:
tableNode.find("img.folder").each(function () {
var tr;
tr = $(this).closest("tr");
// <-- actual answer
});
Ahora, en la línea de respuesta real , acabo de hacer lo siguiente, respondiendo a la pregunta original:
tr.click(this.onclick);
Así que busqué el controlador de eventos directamente desde el elemento DOM y lo puse en el controlador de eventos jQuery click. Funciona de maravilla.
Ahora, al caso general. En los viejos días anteriores a jQuery, se podían conectar todos los eventos a un objeto con dos funciones simples pero poderosas que Douglas Crockford nos regaló a los mortales :
function walkTheDOM(node, func)
{
func(node);
node = node.firstChild;
while (node)
{
walkTheDOM(node, func);
node = node.nextSibling;
}
}
function purgeEventHandlers(node)
{
walkTheDOM(node, function (n) {
var f;
for (f in n)
{
if (typeof n[f] === "function")
{
n[f] = null;
}
}
});
}