MozillaPL.org - polskie centrum Mozilli

Główne menu:

Ingerencja w kod HTML strony

Projektowanie aplikacji i rozszerzeń opartych na technologiach Mozilla Foundation: XUL, JavaScript, XPCOM, XBL i innych

Moderator: Pomocy?!

Ingerencja w kod HTML strony

Postautor: Grapp » 29 października 2006, 20:37

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Siemka :)

Zastanawia mnie jedno, czy za pomocą wtyczek można ignerować w wyświetlany kod HTML strony?
Tzn zmieniać jakiś string (za pomocą replace?), bądź dodawać nowy...

I czy w JS używać content.document, document czy window.document ?
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Re: Ingerencja w kod HTML strony

Postautor: Ancestor » 29 października 2006, 20:58

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Grapp pisze:Siemka :)

Zastanawia mnie jedno, czy za pomocą wtyczek można ignerować w wyświetlany kod HTML strony?
Tzn zmieniać jakiś string (za pomocą replace?), bądź dodawać nowy...

Oczywiście. Ale nie należy w tym celu edytować źródła (jeśli to masz na myśli mówiąc o edycji stringów), ale używać DOM-u.
I czy w JS używać content.document, document czy window.document ?

Jeśli chcesz uzyskać dostęp do wyświetlane strony www, to oczywiście contentDocument (a nie content.document). contentDocument to własność elementu browser będąca aktualnie załadowanym dokumentem.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 29 października 2006, 21:01

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Oczywiście. Ale nie należy w tym celu edytować źródła (jeśli to masz na myśli mówiąc o edycji stringów), ale używać DOM-u.


Chodzi mi głównie o to, by po zainstalowaniu wtyczki i jej uruchomieniu (powiedzmy z pod PPM) wszystko co powinno zdefiniowane do zamienienia się zamienia.
Możesz podać jakieś przydatne linki? :)
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 29 października 2006, 21:08

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 29 października 2006, 21:16

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

No i mam przykładową funkcje:

Kod: Zaznacz cały
   var anchorTags = contentDocument.getElementsByTagName("a");
   for (var i = 0; i < anchorTags.length ; i++)
   {
      alert("Href of " + i + "-th element is : " + anchorTags[i].href + "\n");
   }


Ale nie wyrzuca mi żadnego alerta :\
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 29 października 2006, 21:27

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Bo nie może. Powiedziałem:
contentDocument to własność elementu browser będąca aktualnie załadowanym dokumentem.

Tak więc musisz więc odnaleźć element XUL browser i wziąć browser.contentDocument.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 29 października 2006, 21:42

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Czyli do pliku .xul w chromie mam wkleić taki kod:

Kod: Zaznacz cały
<!-- shows Mozilla homepage inside a groupbox -->
<groupbox flex="1">
  <caption label="Mozilla homepage"/>
  <browser type="content" src="http://portal.x-wars.pl/index.php?topic=login" flex="1"/>
</groupbox>


i w funkcji JS dopisać broswer. do contentDocument ?

Alerty się nie wyświetlają, i mam dodatkowe okienko, które defakto nie chce mieć :\
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 29 października 2006, 22:30

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Ale kto Tobie każe tworzyć nowe elementy? Przecież interesują Ciebie, jak sądzę, już istniejące, zawierające załadowane strony.

Ok, po prostu powiem od początku do końca, bo inaczej do niczego nie dojdziemy.

Element browser zawiera załadowany dokument strony, do którego referencja jest przechowywana we własności contentDocument. Musimy więc odnaleźć odpowiedni browser i skorzystać z owej własności.

Jednak browserów może być wiele, bo, jak wiadomo, Firefox oferuje przeglądanie w kartach i może zawierać wiele stron. Za zarządzanie kartami odpowiada element tabbrowser.

Tak więc:
Kod: Zaznacz cały
var doc = getBrowser().selectedBrowser.contentDocument;

getBrowser() jest funkcją specyficzną dla głównego okna Firefoksa, zwracającą tabbrowser.

selectedBrowser to własność tabbrowsera, która zwraca browser aktualnie zaznaczonej karty
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 29 października 2006, 22:44

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Wielkie dzięki :)
Jednak napotkałem jeden problem, przy użyciu funkcji replace:

Kod: Zaznacz cały
doc.write(doc.replace(/test/, "xyz"));


Tak wygląda kod (oczywiście uwzględniając to co podałeś powyżej), jednak nie podmienia test na xyz :\
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 29 października 2006, 23:18

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Nie używaj document.write, bo to najgorszy sposób, jaki można sobie wyobrazić. Zainteresuj się innymi metodami DOM.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 30 października 2006, 08:34

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Które konkretnie ?

Acha, no i czy dobrej funkcji użyłem, jeżeli chodzi o podmiane tekstu?
I czy znasz jakąś funkcje, do przeszukania dokumentu, by zwróciło mi taki wynik, bym mógł po przeszukanym tekście coś wstawić.
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 30 października 2006, 13:08

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061025 BonEcho/2.0

Grapp pisze:Które konkretnie ?

Na stronę HTML musisz widzieć jako drzewo DOM. Jeśli jeśli tego podejścia "nie czujesz", to najpierw przydałoby się poczytać o DOM-ie, pobawić się rozszerzeniem DOM Inspector - to podstawa.

Jeśli chcesz więc modyfikować, dodawać bądź usuwać tagi, to używaj metod takich jak appendChild(), replaceChild() itp. Poprzeglądaj sobie http://developer.mozilla.org/en/docs/DOM:element.

Acha, no i czy dobrej funkcji użyłem, jeżeli chodzi o podmiane tekstu?

Funkcji dobre, z tym że użyłeś jej na złym obiekcie. replace() jest standardową metodą JavaScript dostępną stringów, a ty użyłeś jej na dokumencie. edit: tzn to działa, ale to zamiast tego lepiej jest operować na poszczególnych stringach a nie na całym "zestringowanym" dokumencie.
Ostatnio zmieniony 30 października 2006, 13:23 przez Ancestor, łącznie zmieniany 1 raz
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 30 października 2006, 13:18

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7

Jeśli chcesz więc modyfikować, dodawać bądź usuwać tagi, to używaj metod takich jak appendChild(), replaceChild() itp. Poprzeglądaj sobie http://developer.mozilla.org/en/docs/DOM:element.


Wlasnie przedchwila to znalazlem:)
Ale pojawil sie kolejny problem...

Otoz wszystkie operaje chce wykonywac na ramce, ktorej zawartosc to jest jakis inny plik.
Nawet proste odszukanie elementu poprzez:
Kod: Zaznacz cały
doc.getElementById("id");
nei daje rezultatu :\ (wyrzuca mi null, przy alercie)
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 30 października 2006, 13:31

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Bo ramka ma swój własny dokument, który ponownie musisz uzyskać za pomocą własności contentDocument. Dopiero na wewnętrznym dokumencie ramki użyj getElementById().
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 30 października 2006, 13:34

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7

Czyli mam uzyc:

Kod: Zaznacz cały
var frame = getBrowser().selectedBrowser.contentDocument.nazwaRamki;

?

i potem odpowiednio frame.getElementById()
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 30 października 2006, 13:40

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Grapp pisze:Czyli mam uzyc:

Kod: Zaznacz cały
var frame = getBrowser().selectedBrowser.contentDocument.nazwaRamki;

?

i potem odpowiednio frame.getElementById()

Blisko. ;)

Nie ma czegoś takiego, jak contentDocument.nazwaRamki. Ramka to element, jak każdy inny, który też musisz znaleźć przy pomocy getElementById() lub podobnych.

Kod: Zaznacz cały
var browserDoc = getBrowser().selectedBrowser.contentDocument;
var frameDoc = browserDoc.getElementById('id-ramki').contentDocument;
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 30 października 2006, 13:51

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7

Hehe wielkie dzieki :)

Jeszcze jedno:
Funkcji dobre, z tym że użyłeś jej na złym obiekcie. replace() jest standardową metodą JavaScript dostępną stringów, a ty użyłeś jej na dokumencie. edit: tzn to działa, ale to zamiast tego lepiej jest operować na poszczególnych stringach a nie na całym "zestringowanym" dokumencie.


Tzn. jak ?
Bo nie moge sobie w moim przypadku wziac np getElementById(), bo to co chce przeszukac to kod HTML, i tak sie sklada, ze to tabelki i inne pierdolki, w ktorych nie ma ID, czytez NAME.
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 31 października 2006, 14:41

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

Grapp pisze:Hehe wielkie dzieki :)
Tzn. jak ?
Bo nie moge sobie w moim przypadku wziac np getElementById(), bo to co chce przeszukac to kod HTML, i tak sie sklada, ze to tabelki i inne pierdolki, w ktorych nie ma ID, czytez NAME.

Są inne metody, np. getElementsByTagName(). Jeśli wiesz, że to, czego szukasz znajduje się w jakimś konkretnym tagu, to użyj właśnie tego.

Btw, wygląda na to, że mylnie zgadywałem i czegoś takiego, jak document.replace() w Gecko w ogóle nie ma.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Grapp » 31 października 2006, 16:00

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0

OKi to to już zrobiłem :)
Wielkie dzięki.

Tylko teraz mam problem.
Wtyczka mi elegancko działa, z tymże jest jeden problem.
Działa tylko przy pierwszym odświeżeniu, a gdy chodzę po niej, klikając w linki, to żadna funkcja nie jest realizowana, nawet zwykłe alert("a");
Grapp
 
Posty: 22
Z nami od: 29 października 2006, 15:55

Postautor: Ancestor » 31 października 2006, 16:59

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0

Grapp pisze:OKi to to już zrobiłem :)
Wtyczka mi elegancko działa, z tymże jest jeden problem.
Działa tylko przy pierwszym odświeżeniu, a gdy chodzę po niej, klikając w linki, to żadna funkcja nie jest realizowana, nawet zwykłe alert("a");

A jak wywołujesz te funkcje?
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Następna

Wróć do Programowanie z użyciem technologii Mozilli

Kto jest online

Zarejestrowani użytkownicy: Bing [Bot], Google [Bot]

Przejdź do powiązanej strony

Nawigacja:

Stopka: