получить все элементы с помощью onclick? - PullRequest
3 голосов
/ 21 мая 2010

Я ищу способ перечислить все элементы, которые имеют onclick событие на странице.

Ответы [ 6 ]

4 голосов
/ 21 мая 2010

Отредактировано для ответа на дополнительные вопросы ...


Я не совсем уверен, что вы спрашиваете, но я подозреваю, что вы ищете способ проверить, не был ли код прикреплен к событию onclick элемента? Если это так, попробуйте это:

var allElements = document.getElementsByTagName('*');
for ( var i = 0; i<allElements.length; i++ ) {
    if ( allElements[i].className !== 'theClassNameYoureLookingFor' ) {
        continue;
    }
    if ( typeof allElements[i].onclick === 'function' ) {
        // do something with the element here
        console.log( allElements[i] );
    }
}

Если вы хотите получить некоторую информацию о фактической функции, присоединенной к событию onclick, вам нужно использовать Firebug или что-то подобное для вывода функции и проверки ее на предмет ее возможного генерирования во время выполнения (т.е. объявление функции может не просто располагаться на странице, к которой теоретически можно было бы легко получить доступ). Попробуйте использовать приведенный выше код, но вместо

console.log (allElements [i]);

до

console.log (allElements [i] .onclick);

Теперь в firebug вы можете навести курсор мыши на функции, которые он печатает, и увидеть их код.

1 голос
/ 16 ноября 2015

Ответ от @Josh Товар не работал для меня, мне пришлось немного изменить его.

var allElements = document.getElementsByTagName('*');
for (var i = 0; i < allElements.length; i++) {
    if ($._data(allElements[i])['events'] != undefined 
        && $._data(allElements[i])['events']['click'] != undefined) {
        console.log(allElements[i]);
        for (var ii = 0; ii < $._data(allElements[i])['events']['click'].length; ii++) {
            console.log($._data(allElements[i])['events']['click'][ii].handler);
        }
    }
}
1 голос
/ 21 мая 2010

мне нужно получить ... параметры, которые есть в каждом клике

Вы можете прочитать строковое значение атрибута onclick, используя:

var onclickstr= allElements[i].getAttributeNode('onclick').value;

внутри кода Джоша (это немного обходной метод, необходимый для IE).

Конечно, это будет работать только для обработчиков событий, подключенных из встроенных атрибутов обработчика событий, не назначенных свойству onclick из JavaScript или добавленных с помощью addEventListener или attachEvent.

Попытка выиграть значения из строки кода JavaScript - это уродливый и ненадежный взлом, к которому вы не должны прибегать, если на самом деле нет другого выбора. Если страница - это то, что вы сами генерируете, вы должны вместо этого использовать методы ненавязчивого написания сценариев. Полностью пропустите встроенные атрибуты обработчика событий, такие как onclick (сегодня это считается плохой практикой), и присоединяйте обработчики из самого JavaScript, используя параметры, хранящиеся в более простых для доступа местах, таких как имя класса и другие «лишние» атрибуты, где необходимо.

1 голос
/ 21 мая 2010

Если вы используете jQuery> = 1.4, вы можете получить массив всех элементов с атрибутом onclick, написав oneliner:

$('body *').toArray().filter(function(el) { return $(el).attr('onclick') });
0 голосов
/ 21 мая 2010

Для краткого селектора jquery, вы можете использовать $('[onclick]'), однако, он будет получать только элементы с атрибутом onclick set.

0 голосов
/ 21 мая 2010

Это довольно просто, если используется традиционный / старый школьный метод присоединения обработчика событий (следующий код не проверен).

var getEventHandlers = function(nodes, eventType) {
    var handlers = [], h;

    for ( var i=0, l=nodes.length; i<l; i++ ) {
        h = nodes[i].getAttribute(eventType);
        if ( typeof h === "function" ) {
            handlers.push(h);
        }
    }

    return handlers;
};

Использование:

console.log(getEventHandlers($("*"), "onclick"));
console.log(getEventHandlers($(".some-class"), "onclick"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...