Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Onclick na tr - w FF działa, w Operze nie
Forum PHP.pl > Forum > Po stronie przeglądarki
Apocalyptiq
Mam taki problem: poprzez jQuery nadaje wszystkim wierszom w tabeli click: $("#tabela tbody tr"). Oczywiście thead i tbody jest. No i po kliknięciu na odpowiedni wiersz pojawia się pewny div. W FF mi to działa, ale w Operze nie - wie ktoś może dlaczego takie coś może nie działać? Opera nie w pełni współpracuje z jQuery?
erix
Cytat
Opera nie w pełni współpracuje z jQuery?

Niestety, twórcy jQuery nie optymalizowali chyba biblioteki pod kątem europejskiej przeglądarki. Byk jest na pewno przy przeliczaniu offsetów.

Cytat
W FF mi to działa, ale w Operze nie

Za mało kodu podałeś.
Apocalyptiq
Przerobiłem nawet tą funkcję tak, aby nie używała jQuery (onClick nadaje normalnie, w elemencie: <tr onclick="funkcja()">), wygląda tak:

Kod
function showTeam(teamId){
 for each(var selected in document.getElementsByClassName("selected"))
     selected.className="hidden";
 document.getElementById(teamId+"Settings").className="selected";
}



W klasie selected nie mam nic, a w hidden (na którą ustawione są domyślnie wszystkie divy) - display:none. Klikany wiersz (tr) ma ID teamIdx (gdzie x to index wiersza w tabeli), a div do pokazania po kliknięciu (pozatabelą) - teamIdxSettings. I wszelkie inne funkcje JS mi również nie działają pod operą. Może dlatego, że skrypty wrzucam pomiędzy to /*<![CDATA[*/? Używam systemu szablonów, który opiera się na xml, a tam zawartość skryptów należy w takie coś wrzucać (inaczej parser wywali błąd, jak napotka np. znak < (mniejszości, ale zinterpetuje jako znak otwarcia taga). Ale nawet jak to cdata wywaliłem, skrypty nadal nie działały.
erix
Cytat
I wszelkie inne funkcje JS mi również nie działają pod operą. Może dlatego, że skrypty wrzucam pomiędzy to /*<![CDATA[*/? Używam systemu szablonów, który opiera się na xml, a tam zawartość skryptów należy w takie coś wrzucać (inaczej parser wywali błąd, jak napotka np. znak < (mniejszości, ale zinterpetuje jako znak otwarcia taga). Ale nawet jak to cdata wywaliłem, skrypty nadal nie działały.

Zobacz najpierw to: Temat: xmlxsl_Nie_interpretuje_tagow_html_tylko_je_drukuje_na_strone

Poza tym:
Kod
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $('#tt tbody tr').bind('click', function(){
        $('td', $(this)).css('background', '#000');
    });
});
</script>

<table id="tt">
    <thead><tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr></thead>
    <tbody><tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr>
    <tr><td>dfsdfdsf</td></tr></tbody>
</table>

Mi to działa pod Operą bez problemów; Opera 9.62.
Apocalyptiq
Już działa, coś popoprawiałem, chyba to jakiś mój głupi błąd był smile.gif



I jeszcze takie pytanie ogólnie co do JS/jQuery - nadając jakąś funkcję pewnym elementom, w której nie używamy jQuery i można się tam spokojnie bez niego obyć, lepiej jest nadawać przez jQuery czy normalnie onClick?



Już chyba doszedłem, dlaczego w Operze nie działał ten skrypt. Walidując input text, iteruje przez wszystkie litery zawartości tego inputa za pomocą for each:

Kod
     for each(var chr in this.value){
         if(accept.indexOf(chr)!=-1){newValue+=chr;}
         else if(lowLetters.indexOf(chr)!=-1){newValue+=chr.toUpperCase();}
     }



W FF to działa, ale jak sprawdziłem - w Operze iteracja przez ciąg znaków nie działa. Jak inaczej można przejechać przez wszystkie litery ciągu znaków w JS, żeby było to kompatybilne i z FF, i z Operą?
erix
Cytat
lepiej jest nadawać przez jQuery czy normalnie onClick?

Oczywiście, że lepiej bindować elementy prze JS, a nie onclick. Takie są reguły semantyki, do tego wymierne korzyści, jakimi są np. oddzielenie warstwy prezentacji od treści - oszczędzasz przede wszystkim transfer. winksmiley.jpg

Poza tym, dodawanie zdarzeń jest możliwe również bez jQuery, nie pamiętam do końca, ale mógłbyś zrobić chyba coś takiego:
Kod
document.getElementById('identyfikator').onclick = function(){ alert('Wesołych Świąt'); return false; }
Apocalyptiq
Dzięki za rady erix winksmiley.jpg Chyba zostane przy nadawaniu zdarzeń przez jQuery biggrin.gif A jeszcze drobne pytanie - click(function() czy bind("click",function()?



Co do tej walidacji już sobie poradziłem - opera nie obsługuje automatycznej iteracji po ciągu znaków, ale obsługuje wyciąganie poszczególnego znaku z ciągu znaków (traktuje ciąg znaków jak tablicę), więc:

Kod
     for(var nr=0;nr<name.length;nr++){
         var chr=name[nr];
         if(accept.indexOf(chr)!=-1){newValue+=chr;}
         else if(lowLetters.indexOf(chr)!=-1){newValue+=chr.toUpperCase();}
     }
erix
Cytat
A jeszcze drobne pytanie - click(function() czy bind("click",function()?

A o tym sobie już poczytaj w dokumentacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.