Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JS] Przydzielanie funkcji przez klasę
Endzio
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Witam.
Mam problem, który mnie przerósł.
Używam funkcji BBCode.
Kod
function BBCode(name, before, after)
{
    textarea = document.forms['form'].elements[name];
    if ((typeof textarea.selectionStart) != 'undefined')
    {
        ss = textarea.selectionStart;
        se = textarea.selectionEnd;
        st = textarea.scrollTop;
        v1 = (textarea.value).substring(0, ss);
        v2 = (textarea.value).substring(ss, se);
        v3 = (textarea.value).substring(se, textarea.textLength);
        textarea.value = v1 + before + v2 + after + v3;
        if (!!window.opera)
        {
            textarea.selectionStart = (v1 + before + v2).length;
        }
        else
        {
            textarea.selectionEnd = (v1 + before + v2).length;
        }
        textarea.scrollTop = st;
        textarea.focus();
    }
    else
    {
        if (document.selection)
        {
            str = document.selection.createRange().text;
            textarea.focus();
            sel = document.selection.createRange();
            sel.text = before + str + after;
        }
        else
        {
            textarea.value += before + after;
        }
    }
}


Funkcja ta jest dodana na początku dokumentu w tagu <head>, zajmuje się dodawaniem tagów BBCode do pola tekstowego.
Kod
<img class="bbcode" alt="message [b] [/b]" src="b.png" title="Pogrubienie" />
<img class="bbcode" alt="message [u] [/u]" src="u.png" title="Podkreślenie" />
<img class="bbcode" alt="message [i] [/i]" src="i.png" title="Kursywa" />
<textarea  name="message" rows="3" cols="28"></textarea>


Na samym końcu dokumentu dodaję funkcję sprawdzającą tagi "img" w celu znalezienia tych, które są odpowiedzialne za wstawienie BBCode'u.
Kod
<script type="text/javascript">
obrazek = document.getElementsByTagName('img');
for (i = 0; i < obrazek.length; i++)
{
    if (obrazek[i].className=='bbcode')
    {
        names = obrazek[i].getAttribute('alt').split(' ')
        obrazek[i].onclick = function() {return BBCode(names[0], names[1], names[2]);}
    }
}
</script>


Niby wszystko jest OK, ale gdy klikam by dodać pogrubienie wyskakuje mi kursywa, gdy klikam na podkreślenie, również wyskakuje mi kursywa, prawdopodobnie funkcja na końcu dokumentu przydzieliła parametry tylko raz, dla ostatniej klasy, czyli kursywy.
Jest sposób, aby przydzielało dla każdego z osobna? Tzn. gdy kliknę na pogrubienie, chciałbym mieć pogrubienie, a nie kursywę, to samo dotyczy reszty tagów.
Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
lord_t
post
Post #2





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Ciekawa sprawa. Też nie widzę błędu, ale jeśli używasz tego ostatniego kodu tylko dla: I,B,U. To to nieopłacalne, lepiej od razu dać to w onclick="BB....", a pozbyć się alta (tzn jego zawartości).

Zamieniłem kolejność <img> i wstawiany był zawsze ten który był ostatni. Jedyne wytłumaczenie jakie mi przychodzi na myśl jest takie:
Uwaga: rozpatruję tylko img w ifie.
Pierwszemu img zostaje przypisana funkcja (nazwijmy ją X() ) z odpowiednią zawartością.
Drugiemu img zostaje przypisana ta sama funkcja co powyżej (X () ), ale z inną zawartością. => Poprzednia zawartość X() zostaje nadpisana.
...
Na końcu każdy img ma przypisaną funkcję X(), która za każdym krokiem pętli została zmieniona i w efekcie zawiera alt z ostatniego imga.

Ale kij wie ile prawdy w tej teorii. Poniżej rozwiązanie działające (zmieniłem tylko ostatni kod):
  1. <script type="text/javascript">
  2. var obrazek = document.getElementsByTagName('img');
  3. for (i = 0; i < obrazek.length; i++)
  4. {
  5. if (obrazek[i].className=='bbcode')
  6. {
  7. var names = obrazek[i].getAttribute('alt').split(' ');
  8. obrazek[i].setAttribute("onclick","BBCode('"+names[0]+"','"+names[1]+"','"+names[2]+"');");
  9. }
  10. }
Go to the top of the page
+Quote Post
Endzio
post
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Cytat(lord_t @ 4.04.2008, 19:31:10 ) *
Ciekawa sprawa. Też nie widzę błędu, ale jeśli używasz tego ostatniego kodu tylko dla: I,B,U. To to nieopłacalne, lepiej od razu dać to w onclick="BB....", a pozbyć się alta (tzn jego zawartości).

Używałem tej funkcji w ten sposób, ale jak wiadomo onclick nie jest zgodny z xhtml, więc próbowałem czegoś innego.
Słabo znam JS, możesz wyjaśnić dlaczego jest nieopłacalne?

Brawo, działa, ale nie w IE (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)
Go to the top of the page
+Quote Post
lord_t
post
Post #4





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Ja osobiście bym zrobił tak:

  1. <img class="bbcode" alt="" src="http://forum.php.pl/style_images/1/folder_editor_images/rte-bold.png" title="Pogrubienie" onclick="BBCode('message','','')" />
  2. <img class="bbcode" alt="" src="http://forum.php.pl/style_images/1/folder_editor_images/rte-underlined.png" title="Podkreślenie" onclick="BBCode('message','','')" />
  3. <img class="bbcode" alt="" src="http://forum.php.pl/style_images/1/folder_editor_images/rte-italic.png" title="Kursywa" onclick="BBCode('message','','')" />


Po co robić jedną funkcję która niepotrzebnie zwiększy rozmiar pliku, jeśli można onclick zrealizować w ten^ sposób? Wykorzystanie funkcji na pewno byłoby opłacalne np. dla 1000 albo więcej <img-ów>. Ale dla trzech? Po co.
No jednym z powodów mogłoby tu być oddzielenie działania od prezentacji, ale czy zawsze warto? A aż tak potrzebujesz tego XMLA? To co oferuje nam W3C to wytyczne/propozycje/sugestie nie zasady jedyne i niepodważalne.

Co do tego IE to nie potrafie pomóc. Można by też spróbować napisać ów kod od poczatku/na nowo, wtedy może wyszedłby błąd.
Go to the top of the page
+Quote Post
Endzio
post
Post #5





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Cytat(lord_t @ 4.04.2008, 20:38:13 ) *
Wykorzystanie funkcji na pewno byłoby opłacalne np. dla 1000 albo więcej <img-ów>. Ale dla trzech? Po co.
Tutaj tylko podałem trzy, funkcja korzysta z 22.
Właściwie to XMLa wcale nie potrzebuję, chciałem jedynie zmniejszyć rozmiar pliku. Do czasu znalezienia hacka na IE pozostanę na onClick, jeszcze raz dzięki za pomoc i zainteresowanie. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

//Edyta
Działa w IE
Kod
for (i = 0; i < obrazek.length; i++)
{
    if (obrazek[i].className=='bbcode')
    {
          obrazek[i].onclick = function()
          {
              names = this.getAttribute('alt').split(' ');
              return BBCode(names[0], names[1], names[2]);
          }
    }
}


Ten post edytował Endzio 14.06.2008, 16:50:57
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 18.09.2025 - 14:33