MozillaPL.org - polskie centrum Mozilli

Główne menu:

prefBranches w JS

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

Moderator: Pomocy?!

prefBranches w JS

Postautor: Gość » 05 stycznia 2007, 22:26

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Witam :)

Czy jest możliwość by wyciągnąć jakąś "opcje użytkownika" danej wtyczki?
Tzn załóżmy, że robię wtyczkę, i w konfiguracji jej (podręczne menu pod PPM) ustawie sobie wartość pola o ID=UnikalnaNazwa153 na 50000.
Czy jest możliwość z poziomu funkcji w JS na stronie wyciągnąć tę wartość?
Gość
 

Re: prefBranches w JS

Postautor: Ancestor » 06 stycznia 2007, 00:03

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Anonymous pisze:Witam :)

Czy jest możliwość by wyciągnąć jakąś "opcje użytkownika" danej wtyczki?

Masz na myśli wtyczkę, a nie rozszerzenie, tak?
Tzn załóżmy, że robię wtyczkę, i w konfiguracji jej (podręczne menu pod PPM) ustawie sobie wartość pola o ID=UnikalnaNazwa153 na 50000.
Czy jest możliwość z poziomu funkcji w JS na stronie wyciągnąć tę wartość?

Oczywiście, że nie. Kod działający z uprawnieniami strony nie do tego dostępu, przecież to by była wielka luka w ochronie prywatnych danych.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 06 stycznia 2007, 12:09

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

A czy zatem da się zrobić tak, by funkcja po stronie HTMLa dawała "sygnał" wtyczce, i by wtyczka wykonywała operacje ?
Gość
 

Postautor: Ancestor » 06 stycznia 2007, 14:24

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Anonymous pisze:A czy zatem da się zrobić tak, by funkcja po stronie HTMLa dawała "sygnał" wtyczce, i by wtyczka wykonywała operacje ?

Wtyczka i rozszerzenie to dwie różne rzeczy. Przykładami wtyczek są Flash, QuickTime, Java i odpowiadają za obsługę elementów osadzonych w znaczniku OBJECT. Wszystkie przeglądarki je obsługują.

Rozszerzenia, to właśnie rozszerzenia do Firefoksa, takie co instalujesz sobie np. z http://addons.mozilla.org

Chodzi tobie o wtyczkę czy o rozszerzenie?
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 06 stycznia 2007, 15:26

Przeglądarka: Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.7) Gecko/20060830 Firefox/1.5.0.7 (Debian-1.5.dfsg+1.5.0.7-2)

Oczywiście, rozszerzenia :P
Wybacz :)
Gość
 

Postautor: Ancestor » 06 stycznia 2007, 15:46

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Robisz to w następujący sposób.

Funkcja działająca w stronie tworzy i wysyła własne zdarzenie, na przykład:
Kod: Zaznacz cały
var evt = document.createEvent('Events');
evt.initEvent('MojeZdarzenie', false, false);
element.dispatchEvent(evt);


Zaś kod działający w chrome, czyli w twoje rozszerzenie przechwytuje to zdarzenie przez dodanie nasłuchiwacza zdarzeń do dokumentu strony, koniecznie ustawionego na fazę capture (ostatni parametr true):
Kod: Zaznacz cały
document.addEventListener('MojeZdarzenie', mojaFunkcja, true);


Zakładam, że orientujesz się w zdarzeniach i ogólnie w DOM. Jeśli nie... to się zapoznaj, bo bez tego w rozszerzeniach ani rusz:

http://developer.mozilla.org/pl/docs/DOM
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 06 stycznia 2007, 20:53

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Hmm w konsoli dostaje `element is not defined`.
Gość
 

Postautor: Ancestor » 06 stycznia 2007, 22:00

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Anonymous pisze:Hmm w konsoli dostaje `element is not defined`.

Heh, oczywiście. Powyższy kod pokazuje tylko metodę, nie należy go wklejać dosłownie. |element| to element, z którego wysyłasz zdarzenie - musisz go wcześniej wybrać i odnaleźć. Szczegóły zależą od konkretnej sytuacji.

Podobnie drugi fragment, który podałem. |document|, to dokument zawierający stronę, ale musisz go najpierw odszukać za pomocą metod i własności elementu <tabbrowser/>, który zarządza przeglądaniem w kartach.

Podaję tylko metodę, bo przecież szczegóły się różnią w zależności od konkretnej sytuacji. Dlatego też nie wklejaj tego żywcem, tylko zrozum i zastosuj samodzielnie. Tak, jak powiedziałem, zacznij od nauczenia się DOM.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 06 stycznia 2007, 23:25

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Nie nie, źle sformuowałem posta, chodziło mi bardziej o to co to jest element :P
Dzięki :)
Gość
 

Postautor: Gość » 07 stycznia 2007, 10:14

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Więc mam coś takiego:

Kod: Zaznacz cały
<head>
<script type="text/javascript">


function aa()
{
   var evt = document.createEvent('Events');
      evt.initEvent('MojeZdarzenie', false, false);
   
   var element = document.getElementById("box");
      element.dispatchEvent(evt);
}

</script>
</head>

<input type="checkbox" id="box" /><label for="box">Checkbox</label>
<input type="button" onclick="aa();" value="x"/>


i odpowiednio:

Kod: Zaznacz cały
window.addEventListener('MojeZdarzenie', mojaFunkcja, true);

function mojaFunkcja(event)
{
   alert("xxx");
}


Ale nie działa :\
Probowałem zamiast window dać document definując go tak:

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


Ale też żadnych rezulataów...
Gość
 

Postautor: Ancestor » 07 stycznia 2007, 15:07

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

A spróbuj:
Kod: Zaznacz cały
evt.initEvent('MojeZdarzenie', true, true);


Probowałem zamiast window dać document definując go tak:

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


Tak jest ok, tylko nie nadpisuj nazwy document, wybierz sobie jakąś inną.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 07 stycznia 2007, 15:49

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Kod: Zaznacz cały
var doc = getBrowser().selectedBrowser.contentDocument;
doc.addEventListener('MojeZdarzenie', mojaFunkcja, true);

function mojaFunkcja(event)
{
   alert("xxx");
}


Tak?
Nie działa...
Gość
 

Postautor: Ancestor » 07 stycznia 2007, 15:55

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Cóż, błąd musi tkwić gdzieś indziej, bo sposób, który ci podałem jest na pewno ok - sam go nieraz wykorzystywałem.

Jeśli nie ma tego przesadnie dużo (powiedzmy do 100 linii ;), to możesz wrzucić całość kodu na http://pastebin.mozilla.org/ i pokazać.
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 07 stycznia 2007, 16:06

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Gość
 

Postautor: Gość » 07 stycznia 2007, 16:11

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

btw. jak w rozszerzeniu zamiast 'MojaFunkcja' dam 'click' (przy addEventListener) to niby działa, z tymże reaguje na dowolny klik...
Gość
 

Postautor: Ancestor » 07 stycznia 2007, 16:23

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Aha, zapomniałem o podstawowej rzeczy: jakieś błędy w konsoli?

Anonymous pisze:btw. jak w rozszerzeniu zamiast 'MojaFunkcja' dam 'click' (przy addEventListener) to niby działa, z tymże reaguje na dowolny klik...

Chyba raczej zamiast "MojeZdarzenie"? Tak też można, wystarczy tylko sprawdzić dodatkowo, jaki jest event.target. Wyedytowałem twój kod, żeby pokazać.

Tworzenie i wysyłanie własnego zdarzenia nie jest konieczne, ale jest po prostu bardziej eleganckie. Skoro nie jest ono związane z tym checkboxem, to nie ma powodu, żeby wysyłać je właśnie z tego elementu. Może równie dobrze wysłać je z window
Kod: Zaznacz cały
window.dispatchEvent(evt);
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 07 stycznia 2007, 19:15

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Zatem mam
Kod: Zaznacz cały
var doc = getBrowser().selectedBrowser.contentDocument;
doc.addEventListener('click', mojaFunkcja, true);

function mojaFunkcja(event)
{
   if (event.target.id == 'box')
     alert("xxx");
}


I nie działa :F
Mówiłeś, że sam pracowałeś na takiej rzeczy często...
Masz może swoje gotowe rozszerzenie, gdzie to wykorzystałeś ?
To podrzuć, i najlepiej odrazu funkcję do tego, to zobacze jak powinno być, ale jest tak jak wsio pisałeś.

Konsola nic nie rzuca.
Gość
 

Postautor: Gość » 07 stycznia 2007, 19:21

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Sorry, że kolejna odp... :P
Dostaje alert'a tylko wtedy, gdy doc.addEventListener zmienie na window.add..., ale event.target.id jest zawsze content, nigdy box...
Gość
 

Postautor: Ancestor » 07 stycznia 2007, 20:14

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Anonymous pisze:Zatem mam
Kod: Zaznacz cały
var doc = getBrowser().selectedBrowser.contentDocument;
doc.addEventListener('click', mojaFunkcja, true);

function mojaFunkcja(event)
{
   if (event.target.id == 'box')
     alert("xxx");
}


I nie działa :F

BTW, celowo uprościłem na gBrowser.contentDocument, bo to to samo krócej. Niepotrzebnie przywróciłeś starą wersję.
Mówiłeś, że sam pracowałeś na takiej rzeczy często...
Masz może swoje gotowe rozszerzenie, gdzie to wykorzystałeś ?
To podrzuć, i najlepiej odrazu funkcję do tego, to zobacze jak powinno być, ale jest tak jak wsio pisałeś.

Nie używałem tego dokładnie w takiej samej sytuacji, więc i tak nie będziesz mógł tego skopiować słowo w słowo. A najlepsze możliwe przybliżenie już Tobie podałem.
Zresztą to rozszerzenie to kilka tysięcy linii kodu, więc zanim się w tym połapiesz...
Dostaje alert'a tylko wtedy, gdy doc.addEventListener zmienie na window.add..., ale event.target.id jest zawsze content, nigdy box...

W takim razie już wiem, o co chodzi. Dodajesz tego eventListenera w momencie startu aplikacji (a dokładniej, otwarcia danego okna), a więc dodajesz go do ówczesnego dokumentu. Tymczasem po załadowaniu twoje strony dokument się zmienia i stary listener już nie istnieje. Musisz dodać listenera dopiero po załadowaniu strony.

Myślałem, że o to sam już zadbasz, dlatego wcześniej o tym nie wspomniałem. :)
Ancestor
Moderator
 
Posty: 1799
Z nami od: 11 czerwca 2005, 20:25
Lokalizacja: Sopot

Postautor: Gość » 07 stycznia 2007, 21:17

Przeglądarka: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

Czyli tak:

Kod: Zaznacz cały
window.addEventListener('DOMContentLoaded', nowa, true);
function nowa(event)
{
var doc = gBrowser.contentDocument;
doc.addEventListener('click', mojaFunkcja, true);
}

function mojaFunkcja(evemt)
{
alert("test");
}


?
Gość
 

Następna

Wróć do Programowanie z użyciem technologii Mozilli

Kto jest online

Zarejestrowani użytkownicy: Bing [Bot]

Przejdź do powiązanej strony

Nawigacja:

Stopka: