Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Usunięcie <td> (skrypt Greasemonkey)
Forum PHP.pl > Forum > Przedszkole
bohdan
Witam robie skrypt Greasemonkey'ia pod pewną stronę, niestety wymaga on usunięcia <td> z kodu.

Skrypt tego typu:
  1. <?php
  2. // ==UserScript==
  3. // @name           <td> Hider
  4. // @description    <td> Hider
  5. // @include        <a href=\"http://adres-strony.pl/*\" target=\"_blank\">http://adres-strony.pl/*</a>
  6.  
  7. // ==/UserScript==
  8.  
  9. GM_addStyle(".gnsall { display:none!important;}");
  10. ?>

Nie wchodzi w grę ponieważ to samo 'class' ma pare rzeczy i usuwa niepotrzebne.

Dlatego trzeba napisać kod gdzie Greasemonkey zrozumie o jakiego <td> chodzi. Poprzez ten 'title' który nigdy sie nie powtarza smile.gif

a tutaj kod źródła strony
  1. <?php
  2. <tr>
  3. <td class="row1" title="kuchnia przyprawy" align="left" valign="top"><span class="gnsall">
  4. </span></td>
  5.  </tr>
  6. ?>


Z góry dzięki za pomoc
mls
Zapewne poprzez selektor:
Kod
td.gnsall[title="kuchnia przyprawy"] { display:none!important;}
bohdan
Próbowałem tego kodu na 20 różnych wersji - nic :F
kamil4u
A Twoja przeglądarka interpretuje CSS3? Jak nie wiesz o co chodzi czy korzystasz z FF>=3?

Można jeszcze wyciągnąć element przez JS. Szukasz w Google funkcji getElementsByClassName, zakładasz pętlę na wszystkie wyniki i spr czy tittle = 'coś tam' i jeśli tak to element.style.display = 'none';

PS. Słoabo znam GM smile.gif
bohdan
Tak, FF3, poszukam trochę o tym getElementsByClassName, ale nie ukrywam ze i tak i tak pomocby się przydała
kamil4u
Pokaż co tam naskrobałeś jak wychodzić nie będzie to pomożemy - pamiętaj, że DOM musi być załadowane:
Kod
onload = function(){
//tu już normalny kod :)
}
bohdan
Poddaje sie :F
erix
Cytat
pamiętaj, że DOM musi być załadowane:

A w kodzie mówisz o czym innym. [;
kamil4u
Cytat
Poddaje sie :F

Pokaż chociaż swoje próby. Nie będziemy za Ciebie pisać gotowców, gdy Ty nawet nie raczysz spróbować(a jak raczysz to to pokaż!)

Cytat
A w kodzie mówisz o czym innym. [;

A czepiasz się smile.gif - a poza tym mówię o tym samym bo DOM po tym zdarzeniu i tak jest załadowany. Poza tym dla początkującego, a takim zapewne jest autor, to bez większej różnicy smile.gif
bohdan
Wyłączyłem wszystkie notatniki, w których robilem, ale za chwile zedytuje posta i napisze mniej wiecej to samo co wcześniej (troche pamiętam).

////

  1. var adSidebar = td.getElementsByTitle (kuchnia przyprawy);
  2. if (adSidebar) {
  3.    adSidebar.parentNode.removeChild(adSidebar);
  4.  
  5. }}


  1. var adSidebar = document.getElementsByTitle (kuchnia przyprawy);
  2. if (adSidebar) {
  3.    adSidebar.parentNode.removeChild(adSidebar);
  4.  
  5. }}


  1. var adSidebar = document.getElementsByClassName (kuchnia przyprawy);
  2. if (adSidebar) {
  3.    adSidebar.parentNode.removeChild(adSidebar);
  4.  
  5. }}


Robiłem to na bazie tego http://diveintogreasemonkey.org/patterns/remove-element.html
kamil4u
Yyy no to tak jednym słowem to "źle":
  1. <? //Jeśli załadowany DOM <-- patrz wyżej]
  2. //pamiętaj, że zmienne lokalne
  3. e = pobór wszystkich_elementów_o_klasie_gnsall; //<-- getElementsByClassName
  4. petla_po_wszystkich_elementach_ze_zmiennej_e{ //<-- pęta for
  5. // do pętli wyżej - załóżmy, że w zmiennej x mamy dany element :)
  6. jezeli(x.tytul == 'dany tytul' i x.nodeName == 'td') //tittle
  7. to usun x <-- jak wyzej - u Ciebie
  8. }
  9. ?>
zegarek84
Cytat(kamil4u @ 25.06.2009, 12:17:04 ) *
A Twoja przeglądarka interpretuje CSS3? Jak nie wiesz o co chodzi czy korzystasz z FF>=3?

Można jeszcze wyciągnąć element przez JS. Szukasz w Google funkcji getElementsByClassName, zakładasz pętlę na wszystkie wyniki i spr czy tittle = 'coś tam' i jeśli tak to element.style.display = 'none';

PS. Słoabo znam GM smile.gif

w FF3 jest już obsługiwana funkcja getElementsByClassName - nie trzeba jej tworzyć na nowo ;p - nowa opera - nie wiem od której dokładnie wersji ale też obsługuje getElementsByClassName ;p

ps. nie trzeba znać wcale GM by pisać skrypty dosyć rozbudowane pod GM - wystarczy znać js a z dodatkowych funkcji GM w zasadzie nie trzeba kożystać - a i nie lubię sam kożystać z unsafewindow ;p - da się to inaczej zrobić ;p

ps. skrypty GM odpalają się zawsze po załadowaniu DOM - jeśli chodzi o operę jeśli jest rozszerzenie podwójne tzn. .user.js to w operze jest podobnie i nie trzeba deklarować po załadowaniu dokumentu - a nawet wtedy by nie zadziałąło - ale jeśli w operze skrypt będzie miał rozszerzenie tylko .js to wtedy trzeba deklarować uruchomienie funkcji po załadowaniu DOM... w greasmonkey ogólnie jeszcze warstwa skryptu jest domyślnie oddzielona od window jednak niektóre przypadki botów jeśli ktoś takie pisze pod grę jakąś da się wykryć jeśli ktoś nie umiejętnie stosuje niektóre funkcje ;p

opera swoje skrypty łąduje do obiektu window odrazu więc wydawało by się że niedozwolone skrypty na niektórych grach łątwo wykryć - ale wystarczy trochu pomyśleć a w obiekcie window nie będzie śladu zdeklarowanej funkcji ani zmiennych winksmiley.jpg

zawsze można sprawdzić co siedzi w window za pomocą for(i in window){....} a w kropki odpowiednie zczytywanie winksmiley.jpg
bohdan
  1. e = getElementsByClassName.gnsall;
  2. for                                          
  3. {                                                                    
  4. if (td.kuchnia przyprawy == 'kuchnia przyprawy' and e.nodeName == 'td')                
  5.  
  6. var adSidebar = document.getElementsByTitle (kuchnia przyprawy);
  7. if (adSidebar) {
  8.   adSidebar.parentNode.removeChild(adSidebar);  
  9. }  
  10. }

?

Nie działa - to oczywiste
erix
Kod
getElementsByClassName

A wskazałeś obiekt, wg którego szukać?

Poza tym: http://www.codingforums.com/showthread.php?t=121776
bohdan
Teraz mnie tak zawirowałeś ze nie rozumiem nic z tego ;(
erix
No tę pierwszą funkcję musisz wywołać z kontekstu:
Kod
obiekt.getElement...

A u Ciebie tak nie jest.
kamil4u
Po 1. - nie masz zielonego pojęcia o JS
Po 2. - po to są manule (MDC), żeby z nich korzystać
Po 3. - dałem Ci wskazówki, a nie gotowy kod w komentarzach
Po 4. - dam Ci jeszcze klika podpowiedzi(bo widzę ciężko to idzie )..

Kod
<?
e = document.getElementsByClassName('gnsall');
for(zmienna=0; x=e[zmienna++];) <-- tego nie będę tłumaczył, bo to trochę udziwnione :)
{                                                                    
if (td.kuchnia przyprawy == 'kuchnia przyprawy' and e.nodeName == 'td')  // popraw w pierwszym warunku na x.title == ..., a w drugim e na x (i zamień and na && - bo tak ładniej :) )      

var adSidebar = document.getElementsByTitle (kuchnia przyprawy); // co to za linia ?
if (adSidebar) { //ten waunek tez nie potrzebny
  adSidebar.parentNode.removeChild(adSidebar); // zamiast adSidebar daj x
}  
}
Przyjdź z poprawionym kodem smile.gif
bohdan
  1. e = document.getElementsByClassName('gnsall');
  2. for(zmienna=0; x=e[zmienna++];)
  3. {                                                                    
  4. if (x.title == 'kuchnia przyprawy' && x.nodeName == 'td')    
  5.  adSidebar.parentNode.removeChild(x);
  6. }  
  7. }

? Coś nadal źle, bo nie chodzi
kamil4u
Powinno zadziałać smile.gif :
Kod
e = document.getElementsByClassName('gnsall');
for(var i=0; x=e[i++];){                                                                    
if (x.title == 'kuchnia przyprawy' && x.nodeName == 'td')    
x.parentNode.removeChild(x); // lub x.style.display = none;
}


--EDIT--
Dopiero teraz zauważyłem... :
Kod
<tr>
<td class="row1" title="kuchnia przyprawy" align="left" valign="top"><span class="gnsall">
</span></td>
</tr>
.., że to span ma class=gnsall, a nie td..., czyli kod IMO powinien być coś w ten deseń:
Kod
e = document.getElementsByClassName('gnsall');
for(var i=0; x=e[i++];){                                                                    
if (x.parentNode.title == 'kuchnia przyprawy' && x.nodeName == 'span')    
x.parentNode.removeChild(x); // lub x.style.display = none;
}
bohdan
Dziwna sprawa - zaden z powyzszych nie działa sciana.gif
kamil4u
Cytat
e = document.getElementsByClassName('gnsall');
alert(e);
y='';
for(var i=0; x=e[i++]winksmiley.jpg{
y+=x+'<-->'+x.parentNode+'<-->'+x.nodeName+'<-->'+x.parentNode.title+'\n';
if (x.parentNode.title == 'kuchnia przyprawy' && x.nodeName == 'span')
x.style.display = 'none';
}
alert(y);


I pokaż nam co dostałeś smile.gif
bohdan
http://paste2.org/p/286605
kamil4u
IMO powinno działać... :
Kod
x.nodeName == 'SPAN'
bohdan
Cytat(kamil4u @ 26.06.2009, 20:45:27 ) *
IMO powinno działać... :
Kod
x.nodeName == 'SPAN'


Działa problem w tym że czyści prawie całą stronę ;f
kamil4u
Nie znam struktury tej strony - czyści to co podałeś mu w kodzie: Czyli element span, który znajduję się w elemencie, którego title = 'kuchnia przyprawy' smile.gif
bohdan
  1. <td class="row1" title="kuchnia przyprawy" align="left" valign="top"><span class="gnsall">

Takie coś powtarza się tylko 2 razy (i te 2 rzeczy chce usunąć)...

Natomiast
  1. <span class="gnsall">

Powtarza się wielokrotnie...
Wydaje mi się, ze lepiej bedzie jak ten span = gnsall będzie pominiety w kodzie, a kod zajmie się tym td i po problemie ( o ile to mozliwe )
kamil4u
Kod
e = document.getElementsByClassName('gnsall');
for(var i=0; x=e[i++];){
if (x.parentNode.title == 'kuchnia przyprawy' && x.nodeName == 'SPAN' && x.parentNode.nodeName == 'TD')
x.style.display = 'none';
}

lub
Kod
e = document.getElementsByClassName('row1');
for(var i=0; x=e[i++];){
if (x.title == 'kuchnia przyprawy' && x.nodeName == 'TD')
x.style.display = 'none';
}
bohdan
Pierwszy skrypt usuwa to co trzeba, drugi nie bardzo. Dzięki party.gif

Swoją drogą można dodać do tego !important jakoś żeby td znikało od razu, a nie dopiero po całkowitym wczytaniu?
kamil4u
Cytat
Swoją drogą można dodać do tego !important jakoś żeby td znikało od razu, a nie dopiero po całkowitym wczytaniu?
Nie znam GM więc mogę się mylić, ale podejrzewam,że GM wczytuje kod, który mu podasz po wczytaniu całej strony, a nie po wczytaniu tylko DOM. Jeżeli dałoby się to zamienić to będziesz miał tak jak chcesz, ale pewnie podejrzewam jest to awykonalne smile.gif

Poszukaj na różnych forach itd. może znaleźli na to jakąś metodę smile.gif
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.