2015-05-27 15 views

Odpowiedz

1

To powinno rozwiązać problem zarówno dla Chrome i Firefox:

$('tr.parent') 
    .css("cursor", "pointer") 
    .click(function (e) {     
     if ($(e.target).is('select') || $(e.target).is('option')) { 
      // 
     } else { 
      $(this).css('background-color', 'red'); 
     } 
    }); 

$('tr[class^=child-]').find('td > div, td').hide(); 

JSFiddle test

Edit: Uproszczona wersja, jeśli nie trzeba zrobić każdy akcja po kliknięciu przycisku wyboru.

$('tr.parent') 
    .css("cursor", "pointer") 
    .click(function (e) {    
     if (!($(e.target).is('select') || $(e.target).is('option'))) { 
      $(this).css('background-color', 'red'); 
     } 
    }); 

$('tr[class^=child-]').find('td > div, td').hide(); 

JSFiddle test

3

Spróbuj tego:

$('tr.parent') 
    .css("cursor", "pointer") 
    .click(function (e) { 
     if($(e.target).is("select")) 
     { 
      //... it was a select 
     } 
     else 
     { 
     //... it was not a select 
     } 
    } 
+0

szybkie JSfiddle wydaje się pokazać ją jako pracę, ale jestem ciekawy. Czy wiesz, dlaczego "jest" działa, a "nie" nie? Ponadto, ponieważ nie robimy nic dla 'select', może możesz dostosować test do' $ (e.target) .is (': not (select)') 'i upuścić' else', co robisz myśleć? (to też powinno działać zgodnie z moim JSFiddle) – Chop

+0

Zrozumiałem odpowiedź na moje pierwsze pytanie: 'jest' jest testem,' not' jest filtrem ... – Chop

+1

@Chop Right :-) ...... Również - oba wyniki są wartościami PRAWDZIWYMI - więc nawet jeśli zrobiłeś: '$ (" body: input ")' otrzymasz '[]', który jest pustą tablicą, ale TO JEST PRAWDĄ, więc 'if ($ (" body: input "))) 'nadal będzie działał jak prawdziwy –

0

Według jQuery website, można użyć not z nimi potomkowie elementów do mocowania to wydarzenie! Spróbuj

$('tr.parent *').not('select') 
.css("cursor", "pointer") 
.click(function (e) { 
     // do something 
    } 
} 

PS: może dołączyć zdarzenie więcej niż raz do elementu zawartego w innym potomek

+0

próbował, ale bez powodzenia. Dołączony również jsfiddle – felix001

+0

Myślę, że to nie działa, ponieważ nawet jeśli zdarzenie nie jest dołączone do selekcji, jest ono powiązane z komórką (''), w której znajduje się zaznaczenie. To wstyd, ponieważ byłoby to dość eleganckie (chociaż dołączanie nośnika do wielu innych obiektów). – Chop

1

jQuery not to metoda filtr. W związku z tym tworzy obiekt jQuery. Gdy nic się nie zgadza, nadal zwraca pustą tablicę, która nie jest fikcją . W związku z tym twój test jest zawsze sprawdzany.

Możesz dostosować test za pomocą operatora testu jQuery nr is, który sprawdza, czy twój obiekt pasuje do selektora. Poniżej jest optymalizacja Royi Namir's answer:

$('tr.parent') 
    .css("cursor", "pointer") 
    .click(function (e) { 
     if($(e.target).is(":not(select)")) { 
      //... it was not a select 
     } 
    }); 
+0

próbował, ale bez powodzenia. Dołączono także jsfiddle – felix001

+0

@ felix001 OK, to się nie udało, ale rozwiązanie Royi Namir działa.Pamiętaj, że musisz dostosować kod, który masz w swoim programie obsługi: w zależności od selektora podstawowego i filtrów, '$ (this)' nie jest takie samo. Zobacz [JSFiddle] (http://jsfiddle.net/0Lh5ozyb/66/). – Chop

+0

@ felix001 Myliłem się, to działa. Nie testowałem poprawnego kodu. [New JSFiddle] (http://jsfiddle.net/0Lh5ozyb/67/). – Chop