Копирование события onclick - PullRequest
1 голос
/ 26 марта 2010

У меня есть функция jQuery, с которой, по сути, можно кликать по всей строке таблицы, но при этом копируется ссылка и дублируется ссылка в каждой дочерней ячейке строки. В моих проектах некоторые ссылки могут содержать события javascript onclick, поэтому мне нужно, чтобы моя функция также могла копировать эти события, но у меня возникают проблемы с этим.

Вот моя текущая функция:

jQuery.fn.linker = function(selector) {
    $(this).each(function() {
        var from = $(selector, this);
        if (from.length > 0) {
            var href = from.attr('href');
            if (href) {
                var link = $('<a href="' + $(selector, this).attr('href') + '"></a>').css({
                    'text-decoration': 'none',
                    'display': 'block',
                    'padding': '0px',
                    'cursor': 'pointer',
                    'color': $(this).css('color')
                });

                $(this).children()
                //.css('padding', '0')
               .wrapInner(link);
            }
        }
    });
};

Я пробовал разные методы для копирования событий, но не могу заставить его работать:

1) из [0] .events всегда неопределено:

if (from.size() && from[0].events && link.size()) {

    var events = from[0].events;
    link.each(function() {
        for (var type in events) {
            for (var handler in events[type]) {
                jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
            }
        }
    });
}

2) Кажется, это работает нормально, но нажатие на скопированные ссылки ничего не делает

link.attr('onclick',from.attr('onclick'));

Ответы [ 3 ]

1 голос
/ 26 марта 2010

Начиная с jQuery 1.4, вы можете сделать это с .clone() , теперь он имеет .clone(true) перегрузку .

Это дает команду копировать данные и события (события хранятся в .data('events')).

Ваша ссылка может быть такой:

            var link = from.clone(true).css({
                'text-decoration': 'none',
                'display': 'block',
                'padding': '0px',
                'cursor': 'pointer',
                'color': $(this).css('color')
            });
0 голосов
/ 26 марта 2010

Вы можете перепривязать события после копирования. Но новый клон намного лучше.

0 голосов
/ 26 марта 2010

для обработчиков событий для продолжения существующих на элементах. Вы не можете использовать

$ ('bla'). Click ... или что-нибудь подобное, что реализует

Вместо этого вы должны использовать один из следующих методов:

$('bla').live('click', function(){...});

или

$("table").delegate("tr", "click", function(){
    .....
});

Разница между действующим и делегатом заключается в том, что делегат может легко существовать в цепочке. в отличие от жизни. делегат - это новая функция.

для отдельных элементов в случае использования функции clone () вам необходимо передать истинный параметр в clone, чтобы сохранить оригинальный обработчик событий. это не ваш случай, но это полезно знать.

$('.bla').clone(true).appendTo('body or something');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...