2012-10-21 13 views
9

Mam nadzieję, że istnieje prosty sposób obejścia tego problemu. Chcę wybrać wszystkie elementy html z atrybutami zdarzeń. Na przykład: onclick, onkeypress itp. Czy jest to najłatwiejszy sposób, używając Jquery bez wybierania osobno każdego atrybutu?Jak wybrać elementy z atrybutami zdarzeń za pomocą Jquery?

Dzięki

+0

Co zaskakujące, brak udzielonych do tej pory odpowiedzi na Twoje interesujące pytanie. – gdoron

Odpowiedz

4

wierzę, że krótka odpowiedź na Twoje pytanie jest nie.

Różne znaczniki HTML obsługują różne zdarzenia, więc powinny zostać zakodowane gdzieś w kodzie jQuery. Czytając kod jQuery, nie znajduję na przykład odniesienia do zdarzenia onkeypress.

Tak, myślę, że można po prostu polegać na Has Attribute Selector[attribute]:

$('[onclick], [onkeypress], [etc]'); 
0

Można analizowania wszystkich elementów i sprawdzenia. Niezbyt wydajne, ale powinno działać.

Sprawdź get all elements with onclick in them?

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]); 
    } 
} 
1

Jeśli wartość nie jest specyficzny, można spróbować this approach.

Demo poniżej wydruków "hej ludzie", w oparciu o $([attr1],[attr2],...,[attrN]) selektora:

<div class="container"> 
    <div>no id</div> 
    <div id="a">hey</div> 
    <span name="b">you</span> 
    <p id="c">guys</p> 
</div>​ 

$('[id],[name]').each(function(){ 
    console.log($(this).text()); 
});​ 

podstawie tej konstrukcji, prosty wrapper może być napisane:

$.fn.hasAttrib = function() { 
    var attributes = []; 
    $.each(arguments, function(index, value){ 
     attributes.push('[' + value + ']'); 
    }); 
    return $(this).find(attributes.join()); 
}; 

Wykorzystanie takiego pluginu w poniższym zestawieniu również drukuje "hej, wy, ludzie":

$('.container').hasAttrib('id','name').each(function(){ 
    console.log($(this).text()); 
}); 
+0

Jak to odpowiada na pytanie? – gdoron

+0

gdoron ma rację. Chce wiedzieć, czy istnieje jakiś rodzaj selektora hasEvent, zamiast wyświetlać wszystkie zdarzenia. –

1

Można zrobić niestandardową funkcję filtra, aby znaleźć elementy z atrybutem, który zaczyna się na, jak tak:

$.fn.filterOn = function() { 
    this.each(function(ind,el) { 
     var attrs = el.attributes; 
     for (var i = 0; i < attrs.length; i++) { 
      if (attrs[i].nodeName.indexOf('on') === 0) return true;  
     } 
     return false; 
    }); 
}; 

i używać go jak:

//elems will contain all input fields with an attribute starting with 'on' 
elems = $(':input').filterOn(); 

A to da ty WSZYSTKIE elementy na stronie, które mają atrybut zaczynający się od na (uwaga na wydajność przy użyciu selektora *):

$("*").filterOn().each(function() { 
    console.log('Element '+this.tagName + ' has an on... attribute'); 
}); 
+0

Jest to bezpieczne tylko wtedy, gdy pracujesz tylko ze standardowymi atrybutami HTML. –

+0

@ LucaFagioli Tak, próbuję tylko dodać kolejną możliwość rozwiązania problemu OP, zrozumiałem dla jego przypadku zdarzenia są połączone za pomocą standardowych atrybutów html.OP zna jego szablon html lepiej i będzie wiedział, czy moje rozwiązanie może być użyteczne dla jego konkretnego przypadku, czy nie, po prostu dodam różne rozwiązania do tablicy :-) – Nelson

+0

I to jest słaby czek. Mimo że ma poprawną składnię (w kontekście tylko standardowych atrybutów HTML), różne znaczniki HTML obsługują tylko podzbiór takich zdarzeń. Powinieneś także dodać czek na mapie [tag :: [attributes]]. Ale uważam, że zaczyna to być zbyt pochłaniające cpu. –

Powiązane problemy