Help - Search - Members - Calendar
Full Version: JavaScript
photoshop és webszerkesztés - tutorial.hu > www.tutorial.hu > Programozás
Pages: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
BlackY
A probléma leegyszerűsítve a következő: a böngésző látja, hogy meg kell hívnia a checkForm-ot, azt el is indítja. A checkForm-ban ugye létrehozod az ajax objektumok, csakhogy: aszinkron! Vagyis külön szálon fut. Valahogy így:
CODE
checkForm
      |
      |-------
      v       |
    null      |
               v
            ajax oncomplete (true/false)


Tehát a checkForm-od visszatér, mivel az ajax oncomplete callback 1) akkor még nem hívodik meg és 2) semmi köze hozzá.
A lehetséges megoldások:
1)
CODE
{
        method: 'post',
        asynchronous: false
...

Így elveszted az aszinkronitást, vagyis a böngésző várni (és fagyni!!!) fog, amíg nem kapja vissza a választ a szervertől. Ne!

2) Kicsit átszervezed a ko'dod: a form-ra az eseményvezérlőt már javascriptből dobod rá (Event.observe($('myform'), checkForm) ), a checkForm-al innentől kezdve várod az event paramétert, így már leállíthatod az esemény kezelését az Event.stop()-al. Hogy a ko'dod szép is legyen, csinálsz még három függvényt, az egyik, amelyik szo'l a usernek, hogy gáz van, a másik, ami leszedi az eseményvezérlőt a formodro'l, és újra elpostolja, a harmadik, ami szo'l a usernek, hogy gáz van, a szerver mondjuk 60 mp-ig nem válaszolt.

Így akkor már:
CODE
checkForm : event
   Ajax indítása (siker esetén: újrasubmitolo' függvény, sikertelenség esetén: hibajelző )
   Időzítő indítása (lejáráskor az időkorlátos üzenet )
   Event megállítása


Ha mindent jo'l csináltál, akkor helyes input esetén a checkForm egyszer fog lefutni (második submit előtt leveszed ro'la az eseménykezelőt), és helyesen fog működni, bár bonyolultabban, mint ha csak egy függvény lenne. (bár egy függvénybe is meg lehet írni, de akkor is bonyolultabb smile.gif )

BlackY
lnorby
Köszönöm! Amint lesz rá időm, kipróbálom... de szerintem sikerülni fog.smile.gif
Gyuri
Sziasztok!

Egy egyszerű dolgot szeretnék megoldani, de mégsem sikerül! Az alábbi kis kódnak annyi lenne a dolga, hogy egy gombnyomással minden "mukodj" id-jű dolgot eltüntessen/megjelenítsen. Miért csak az egyiket tűnteti el?

A segítséget előre is köszönöm!

CODE
<head>
<script type="text/javascript" language="JavaScript"><!--

function ReverseContentDisplay(d) {
if(d.length < 1) { return; }
if(document.getElementById(d).style.display == "none") { document.getElementById(d).style.display = "block"; }
else { document.getElementById(d).style.display = "none"; }
}
//--></script>
</head>

<body>
<div id="mukodj">blabla1</div>
<div id="mukodj">blabla2</div>

<a href="java script:ReverseContentDisplay('mukodj')">[show/hide]</a>

</body>
tupacko
Az ID, ahogy az a neveben is van egy meghatarozo parameter. Minden meghatarozott elem csakis egyedi lehet (ezert "identifikacios mezo"). Ha megfigyeled a fuggveny nevet, akkor nem is tobbesszamu: getElementById es nem getElementsById.

Nezz szet itt: http://jacksleight.com/blog/2008/01/14/getelementsby/ smile.gif

Sok sikert!
BlackY
Na, ezt jól sikerült bonyolultan megfogalmaznod smile.gif

A lényeg: az id egyedi. (btw, a tagName is meghatározó, csak nem egyedileg)

Gyuri, használj vmi. JS keretrendszert, prototype-ban pl. ez ennyi lenne (ha a mukodj-ot class-nak adod meg): $('.mukodj').each(function(item) { item.toggle(); });

BlackY
tupacko
[off]
Megesik, gyakran szolok komplikaltan, aztan utolag magam sem ertem tongue.gif

BTW, ez vizsgaidoszaki artalom biggrin.gif

[/off]
BlackY
[off]
Ismerem az érzést smile.gif
[/off]

BlackY
Gyuri
Sziasztok!

Köszönöm a segítségeket!

Tupacko! Először megpróbáltam egy huszárvágással kicserélni az összes getElementById-t getElementsByClassName-re de nem jó. Néztem az oldalt, amit küldtél, de nem boldogulok vele.

BlackY! Letöltöttem ezt a Prototype scriptet, de nem tudom, hogy mi a teendő azzal a sorral, amit írtál: $('.mukodj').each(function(item) { item.toggle(); });

Hová kéne ezt beszúrni?

Bocsánat, hogy ennyire dedós módon kell elmagyarázni nekem :)

CODE

<head>
<script type="text/javascript" src="prototype-1.6.0.3.js"></script>
</head>

<body>
<div class="mukodj">blabla1</div>
<div class="mukodj">blabla2</div>
<a href="IDE MIT KELL ÍRNI?">[show/hide]</a>
</body>



BlackY
CODE
<html>
<head>
<script type="text/javascript" src="prototype..."></script>
<script type="text/javascript">
Event.observe(window, 'load', function() {
   Event.observe($$('a.toggler')[0], 'click', function() {
       $$('div.mukodj').each(function(item) { item.toggle(); });
   });
});
</script>
</head>
<body>
<div class="mukodj">blabla1</div>
<div class="mukodj">blabla2</div>
<a href="#" class="toggler">[show/hide]</a>
</body>
</html>


BlackY
asam9
ez tetszik, én is kipróbáltam. mi van akkor, ha a két div-et(pl .mukodj1, .mukodj2) külön-külön szeretném eltüntetni?
BlackY
Az már egy kicsit trükkösebb...
CODE
<html>
<head>
<script type="text/javascript" src="prototype..."></script>
<script type="text/javascript">
Event.observe(window, 'load', function() {
   Event.observe($$('a.toggler')[0], 'click', function(event) {
       $(Event.element(event).getAttribute('rel')).toogle()
   });
});
</script>
</head>
<body>
<div class="mukodj" id="mukodj1">blabla1</div>
<div class="mukodj">blabla2</div>
<a href="#" class="toggler" rel="mukodj1">[show/hide]</a>
</body>
</html>

(rel és id, rel helyett talán inkább target-et illene használni, de az nincs xhtml-ben/html5-ben)


BlackY
asam9
nálam nem akar beindulni a gaz.

CODE
Event.observe(window, 'load', function() {
   Event.observe($$('a.toggler')[0], 'click', function(event) {
       $(Event.element(event).getAttribute('rel')).toggle()
   });
});

-----------

<a href="#" class="toggler" rel="mukodj1">[show/hide]</a>
<div class="mukodj1">szoveg1</div>
<a href="#" class="toggler" rel="mukodj2">[show/hide]</a>
<div class="mukodj2">szoveg2</div>
Gyuri
Köszönöm BlackY a megoldást!

Asam9:
Ha külön külön akarod eltűntetni, akkor ezt is használhatod: biggrin.gif

CODE
<head>
<script type="text/javascript" language="JavaScript"><!--
function ReverseContentDisplay(d) {
if(d.length < 1) { return; }
if(document.getElementById(d).style.display == "none") { document.getElementById(d).style.display = "block"; }
else { document.getElementById(d).style.display = "none"; }
}
//--></script>
</head>

<body>
<div id="mukodj1">blabla1</div>
<div id="mukodj2">blabla2</div>
<a href="java script:ReverseContentDisplay('mukodj1')">1-es [show/hide]</a>
<a href="java script:ReverseContentDisplay('mukodj2')">2-es [show/hide]</a>
</body>
asam9
biztos velem van a gubanc, de nálam meg se mozdul smile.gif

szerk.: közben sikerült alkotni vmit, de nem elég dinamikus(mindig át kell írogatni a számokat, ha módosítjuk az elemek számát).

CODE
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Reverse Content Dsiplay</title>
<script type="text/javascript">
function reverseContent1() {
        if(document.getElementById('reverse1').style.display == "none") {
        document.getElementById('reverse1').style.display = "block";
    }
    else {
        document.getElementById('reverse1').style.display = "none";
    }
}
function reverseContent2() {
        if(document.getElementById('reverse2').style.display == "none") {
        document.getElementById('reverse2').style.display = "block";
    }
    else {
        document.getElementById('reverse2').style.display = "none";
    }
}
</script>
</head>
<body>
<div><a href="#" onclick="reverseContent1()">1-es [show/hide]</a></div>
<div id="reverse1">szoveg1</div>
<div><a href="#" onclick="reverseContent2()">2-es [show/hide]</a></div>
<div id="reverse2">szoveg2</div>
</body>
</html>
asam9
így a "tuti":
CODE
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Reverse Content Dsiplay</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
.no-display {
display: none;
}
</style>
<script type="text/javascript">
function reverseContent(id) {
    if(document.getElementById('reverse'+id).style.display == "block") {
        document.getElementById('reverse'+id).style.display = "none";
    }
    else {
        document.getElementById('reverse'+id).style.display = "block";
    }
}
</script>
</head>
<body>
<div><a href="#" onclick="reverseContent(1)">1 [show/hide]</a></div>
<div id="reverse1" class="no-display">szoveg1</div>
<div><a href="#" onclick="reverseContent(2)">2 [show/hide]</a></div>
<div id="reverse2" class="no-display">szoveg2</div>
<div><a href="#" onclick="reverseContent(3)">3 [show/hide]</a></div>
<div id="reverse3" class="no-display">szoveg3</div>
<div><a href="#" onclick="reverseContent(4)">4 [show/hide]</a></div>
<div id="reverse4" class="no-display">szoveg4</div>
</body>
</html>

BlackY
Azt az onclick dolgot felejtsük már el!
CODE
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Reverse Content Dsiplay</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <style type="text/css">
        a {
            cursor: pointer;
        }
        </style>
        <script type="text/javascript" src="js/prototype.js"></script>
        <script type="text/javascript">
        Event.observe(window, 'load', function() {
            $$('div a').each(function(item) { /* Minden div-ben levő a-ra végrehajtjuk */
               if(item.getAttribute('href') == null && item == item.parentNode.firstChild) { /* Ha az a a div első gyereke */
                   Event.observe(item, 'click', function(event) { /* Beállítjuk az eseménykezelőt */
                       Event.element(event).parentNode.nextSibling.toggle();
                  });
               }
           });
        });
        </script>
    </head>
    <body>
        <div><a>1 [show/hide]</a></div><div>szoveg1</div>
        <div><a>2 [show/hide]</a></div><div>szoveg2</div>
        <div><a>3 [show/hide]</a></div><div>szoveg3</div>
        <div><a>4 [show/hide]</a></div><div>szoveg4</div>
    </body>
</html>

Így viszont figyelni kell arra, hogy ne legyen olyan anchor, ami egy div-nek az első eleme és nincs href tulajsonsága, mert akkor kattintáskor a szülőjének az első tesóját eltüntetjük...
Plusz, hogy a <div><a>..</a></div> szöveg és az eltüntetendő "tesó" között ne legyen még whitespace se, mert az idióta browser gyártók beszúrnak a DOM fába egy textnode-ot, tehát ha nem PONT úgy van, mint a fenti példában, akkor a <div>-nek az első testvére egy textnode lesz.

BlackY
asam9
köszi BlackY, mükszik! mi a baj az onclick-kel, ez már ennyire elavult dolog? /persze én csak örülök, hogyha nem kell a tag-en belülre rakni smile.gif/.
közben lett egy ötletem, amivel egy napig küzdöttem, de nem siekrült megoldanom, csak részben.
azt szerettem volna, hogy az eddigin felül a kód még tudja azt is, hogy CSAK egy tartalmat jelenítsen meg(ha mondjuk a 3-as tartalom van nyitva és az 1-es gombra kattintok, akkor 3-as becsuk / 1-es kinyit) ... és maradjon meg az a funkció is, hogy akár az összeset el is tudjam rejteni.
Erre ötlet? smile.gif
BlackY
Pl. ilyesmi:
CODE
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Reverse Content Dsiplay</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <style type="text/css">
        a {
            cursor: pointer;
        }
        </style>
        <script type="text/javascript" src="js/prototype.js"></script>
        <script type="text/javascript">
        Event.observe(window, 'load', function() {
            $$('div a').each(function(item) { /* Minden div-ben levő a-ra végrehajtjuk */
               if(item.getAttribute('href') == null && item == item.parentNode.firstChild) { /* Ha az a a div első gyereke */
                   Event.observe(item, 'click', function(event) { /* Beállítjuk az eseménykezelőt */
                       $$('div.toggled').each(function(item) { item.hide(); });
                       Event.element(event).parentNode.nextSibling.toggle();
                  });
               }
           });
        });
        </script>
    </head>
    <body>
        <div><a>1 [show/hide]</a></div><div class="toggled">szoveg1</div>
        <div><a>2 [show/hide]</a></div><div class="toggled">szoveg2</div>
        <div><a>3 [show/hide]</a></div><div class="toggled">szoveg3</div>
        <div><a>4 [show/hide]</a></div><div class="toggled">szoveg4</div>
    </body>
</html>


Az onclickkel meg az a gáz, hogy elavult smile.gif Igazából afelé tartunk, hogy elkülönítjük a tartalmat (html, xml), a megjelenítést (css, xsl) és a működést (js).

BlackY
asam9
igen-igen, értelek smile.gif köszi a sok fáradozást!! erre gondoltam csak azzal a kis plusszal, hogy az aktuálisan kinyitottat vissza is lehessen csukni ... meg az alapállapot is az lenne, hogy csukva lenne az összes doboz.
lnorby
Sziasztok!

Éppen egy olyan BB kódos textarea szerkesztőn dolgozok, amilyen itt a Tutorial.hu-n is működik. Tehát a textarea felett van egy pár gomb (B, I, U, stb.) amikre ha rákattintok, a BB kódot a szövegmező azon pozíciójába illeszti, ahol a kurzor éppen villog. Ez működik is szépen, az egyedüli gondom az (ami itt is sincs megcsinálva rendesen), hogy ha a szöveg hosszabb, mint a textarea magassága, akkor ugye megjelenik a görgetősáv. Ilyenkor ha be akarok szúrni valamilyen kódot a szövegmezőbe, automatikusan felpozícionál a textarea az első sorához és mindig vissza kell görgetni oda, ahova beszúrtam a kódot. Ezt ki lehet valahogy küszöbölni? Mert elég idegesítő.

Gondolom azért csinálja, mert mivel új tartalmat kap, először kitörli az addigit (tehát eltűnik a görgetősáv is egy pillanatra), és csak azután írja ki az újat.
BlackY
A scrollTop tulajdonság állítgatásával tudod pozícionálni a textarea scrollját, de figyelj arra, hogy csak a trágya Firefox nem tud mit kezdeni vele (IE, Chrome, Opera alatt működik), és ha JavaScripttel belepiszkálsz a működésbe, az zavaró lehet.

BlackY
lnorby
Működik IE és Firefox alatt is... (vagyis IE 7 és FF 3.0.7 alatt próbáltam). Ennyi egyenlőre elég. Köszönöm a segítséget!
penzkeresoforum
Sziasztok,
Valaki megtudná mondani hogy ilyet hogy kell csinálni vagy legalább is mi a neve ennek, mert még a googlebe se tudom beírni ha nem tudom minek hívják. smile.gif
Úgy néz ki mint egy input csak van mellette egy le fel nyilacska és ha számot írunk a mezőbe akkor ezzel lehet növelni csökkenteni.
Kilehet jelölni ami benne van át lehet írni stb...
Példát csak Windows-os proginál pl. a dátum beállításánál találtam.


köszönöm a válaszokat.
BlackY
Swingben (java-ban levő GUI rendszer) JSpinner az osztály neve, ami ilyet csinál, úgyhogy a legjobb tippem: Spinner Field.

BlackY
penzkeresoforum
Köszi így már találtam rá példákat, tutorialokat.
Lényegében ahogy gondoltam is egy input mező után két kis kép amire kattintunk és ahoz van a javascript ami az input mezőt értékét növeli csökkenti. Csak gondoltam van rá valami egyszerűbb megoldás is. smile.gif
Achrin
Törölve
Tamás
BlackY
Nem, az alapötlet rossz smile.gif

CODE
$string .= "<input type=\"button\" value=\"Töröl\" title=\"" . $id . "\"/>";

(Kiszeded az onclick-et, úgyse ér semmit smile.gif )

Amikor megkapod, akkor: (ez a kód most PrototypeJS, de a lényeg látható, ha meg nem, ott vannak a kommentek)
CODE
var div = $$('#responseDiv'); /* Lényegtelen hogy mi, de legyen egyértelmű CSS selectora a divnek/elemnek, amibe pakolsz */
div.innerHTML = response; /* A response változóban van a szervertől kapott HTML kód */
$$('#responseDiv input').each( /* Végigrohanunk a responseDiv-en belüli input elemeket */
    function( item ) {
        Event.observe(item, 'click', function() { /* És beállítunk click-re egy eseményfigyelőt */
             xajax_vizsg_torol(parseInt(this.getAttribute(title)); /* És az onclick eseménykezelőben meghívjuk a xajax függvény */
        }.bindAsEventListener(item));
    }
);

Tehát a lényeg: amikor bekerültek a DOM-ba az input mezők UTÁNA pakolod rájuk az eseménykezelőket.

Edit: Ezért írtam ennyit? smile.gif

BlackY
lnorby
Hello!

Van egy kis gondom. Dinamikus select-ek értékét szeretném JS-el kiolvastatni, de az istenért nem megy. Pedig PHP-vel olyan egyszerű ezeket kezelni. A lényeg:
CODE
<select name="language[]">
<option value="0">...</option>
...
</select>
<select name="language[]">
<option value="0">...</option>
...
</select>
<select name="language[]">
<option value="0">...</option>
...
</select>
...

A nevük tömbként van tárolva (mert akármennyi lehet belőlük). Hogy tudok rajtuk egyesével végigszaladni és kiolvasni mindegyiknek az értékét? Próbáltam a document.myForm.elements['language[]'].length -el megtudni hogy egyáltalán hány darab van, hogy egy ciklust rá tudjak indítani, de ha csak 1 select van, akkor annak az option-jeinek számával tér vissza. Ha több van akkor végülis működik. A kód:
CODE
langnum=document.myForm.elements['language[]'].length;
for (i=0; i<langnum; i++)
{
     alert(document.myForm.elements['language[]'][i].value);
}

Hogy lehet kiküszöbölni ezt a kis hibát?
BlackY
CODE
<html>
    <head>
        <title>AsdAsd</title>
        <script type="text/javascript">
        var valueOfSelect = function(SelectField) {
           return SelectField.options[SelectField.selectedIndex].getAttribute('value'); /* childNodes[SelectField.selectedIndex].getAttribute('value'); */
        }
        window.onload = function() {
            document.getElementById('button').onclick = function() {
                alert(valueOfSelect(document.getElementById('asdasd')));
            }
        }
        </script>
    </head>
    <body>
        <select name="asdasd" id="asdasd">
            <option value="Egy">1</option>
            <option value="Kettő">2</option>
            <option value="Három">3</option>
        </select>
        <button id="button">Próbáljuk ki!</button>
    </body>
</html>


BlackY
ui.: És használj id-eket és szabvány DOM cuccokat (getElementById, getElementsByTagName)
balazska2
Nekem egy egyszerű szavazást kellene betennem a honlapomba. De sajnos nem találtam semmit amibe belenyúlhatnék. Nem tudna nekem valaki egy linket küldeni ide, vagy a gybalazska2@gmail.com -ra ahol egy rendes szavazást lehet összeállítani?
BlackY
Javascriptben? Abban senki.

BlackY
lnorby
Hello!

BlackY köszönöm az előző segítségedet! Végül máshogy oldódott meg a dolog.

Ha valakinek van valami szkriptje az alábbi problémához, vagy gyorsan össze tud dobni egyet, azt nagyon megköszönném:
Olyanra lenne szükségem, ami egy a felhasználó által beírt dátumot (formátum: yyyy.mm.dd vagy yyyy.mm.dd hh:ii:ss) és a jelenlegi dátumot összehasonlítja. Úgy kellene hogy működjön, hogy ha csak a dátumot adja meg a felhasználó (és az időt nem), akkor csak azt nézni hogy a mai napnál később van-e az a dátum. Viszont ha a felhasználó megadja az időt is akkor azt is kellene figyelni, hogy a mai napon belül annál az időpontnál később van-e. Nagy segítség lenne. Nem igazán szeretem a JS-t. Lehet hogy csak azért, mert még nem volt időm igazán belemerülni.

Köszönöm!
BlackY
A Data.parse() lesz a barátod (na meg a Google wink.gif )

BlackY
LeGaS
Milyen könyvet / ebookot / weboldalt tudnátok javasolni gyors JavaScript talpalásként? Úgy alapvetően tudom használni, illetve leginkább jQuery-vel szórakozom, csak ettől függetlenül most szükségem lenne arra, hogy megismerjem jobban a nyelvet.

Előre is kösz!
lnorby
QUOTE(BlackY @ 2009. Apr 30., 08:11) *
A Data.parse() lesz a barátod (na meg a Google wink.gif )

BlackY

Köszi! Azt tudtam hogy azzel kell szórakoznom, csak nem jöttem rá hogy. De megoldódott. Valamilyen lehetőség van object elemre onclick eseményt rakni, úgy hogy ie is értse? Pontosabban egy flash animációra akarok html-lel hivatkozást rakni, de az <a href="..."><object>...</object></a> nem mükszik.
BlackY
Ráraksz egy átlátszó divet (pl. tfh, az objected 320*240-es: <object></object><div style="margin-top: -240px; width: 320px; height: 240px;"><a style="width: 320px; height: 240px;">..</a></div>)

Csakhogy:
1) Alapból nem értem, hogy flash objectet miért akarnál "kitakarni" és eltüntetni minden interakciót belőle
2) Ez nagyon csúnya hack
+1) Alapból miért használsz flash-t smile.gif

BlackY
lnorby
Azért mert bannerekről van szó, és a google analitika nem mutatja a kattintások számát olyan hivatkozásoknál, amik a weboldalon kívülre mutatnak. Ezért egy weboldalon belüli php-ra akarom ugratni a flash-eket, ami majd header-rel továbbküld a megadott linkre. Így a google mutatni fogja a kattintások számát... Köszi a tippet! Én is erre gondoltam, de csak végső elkeseredésemben akartam használni, mert tényleg elég ronda megoldás. smile.gif
Monique
Sziasztok, egy kérdésem lenne, ha Ajax tanfolyamra szeretnék menni, ahhoz szükséges a Javascript előképzettség?

Köszönöm, Monique
BlackY
Szvsz. nem árt, de tanfolyama válogatja

BlackY
Anybudi
LeGaS: Ha jól megy az angol, Douglas Crockford-nak van egy 4 részes előadássorozata a Javascriptről, amit szerintem érdemes lenne megnézned: http://video.yahoo.com/watch/111593/1710507
lnorby
Hello!

Saját fejlesztésű lightbox-on dolgozok és van egy kis gondom. A lightbox konténer div-én belül van egy <img> tag-em, aminek az 'src' attribútuma üres. Amikor rákattintok egy linkre, amin a rel="lightbox" attribútum be van állítva akkor az meghív egy olyan szkriptet, ami megjeleníti a lightbox-ot. A szkripttel figyelem hogy a sender-nek mi a 'href' attribútuma és a lightbox div-en belüli képnek átadom azt az url-t. Ekkor jönne a lightbox méretezése, de az a baj, hogy a kép méreteit nem tudom kinyerni. Próbálkoztam offsetWidth és offsetHeight-ekkel, myImage=new Image(), myImage.url=sender.url és myImage.width, myImage.height, stb. de nem akar összejönni. A myImage.onload után egy belső funkcióval már alert-el kiíratva megkapom a méreteket, de azt nem tudom hogy azokat hogy lehet globálissá tenni.

Remélem érthetően fogalmaztam.
BlackY
A rel=lightbox linkre kattintás hívjon meg eseményfigyelőt, ami elkezdi betöltetni a képet (new Image()), és ráköt egy újabb eseménykezelőt az új kép onload tulajdonságára. Aztán az onload függvénybe bepakolsz mindent, ami most a linkre kattintásos függvényben vagy, és máris jó vagy.

edit.: Így még a böngésző cache miatt az sincs, hogy már megjelent a lightbox és várni kell a képre...

BlackY
lnorby
És olyankor mi van, ha másik függvényt akarok meghívni az onload eseményre (lightboxImage.onload = function() { resizeLightBox() }; )? Ebben az esetben a másik függvényből hogy tudok hivatkozni a lightboxImage nevű képre és méreteire?

Azért tárolom külön függvényben a méretezőt, mert ha az ablakot méretezik, a lightbox méretének is változnia kell. Tehát egy Event.observe-t kell raknom a window resize-ra is, ami csak meghívja a méretező függvényt és tökéletesen müxik.
BlackY
Globálissá teszed egy saját "névtérben":

CODE
var LightBox = {
     image : null, /* változó */
     akarmi : 0,
     asdasd : "foobar",
     /* többi függvényed ha kellenek */
};

Ez ugye ekkor a window egy tulajdonsága lesz, és globálisan elérheted a (window.)LightBox.image hívással (függően attól, hogy az adott függvény éppen milyen környezetben fut) azt a tagváltozót.

pl.:
CODE
window.onload = function() {
    alert(LightBox.akarmi); /* Itt nem kell a window */
}


CODE
Event.observe(window, 'load', function() {
   alert(window.LightBox.akarmi)
}.bindAsEventListener(valamilyenObjektumAmiNemAWindow);


(Vagy ami még szebb megoldás: az összes eseményfigyelődet úgy csatolod fel, hogy előbb rádobsz egy bindAsEventListener(LightBox) hívást, és akkor kapásból írhatod az image, akarmi stb.-t smile.gif )

BlackY
lnorby
Köszönöm szépen! Összejött a dolog.
lnorby
Egy olyan kérdésem lenne még, hogy egy <a> elemnek ha be van állítva href tulajdonsága, akkor azt hogy lehet megcsinálni hogy ne ugorjon el arra linkre? Mert úgy akarom kivitelezni a lightbox-ot, hogy figyelje a képhez tartozó hivatkozás url-jét (onnan veszi ki hogy hol van az eredeti kép), de még a window.onload-nál az összes <a> onclick eseményéhez berakom a showLightBox() függvény meghívását. A probléma csak az, hogy ha rákattintok valamelyik linkre (vagyis képre), akkor automatikusan elugrik a nagyképhez, nem a lightbox-ot jeleníti meg. Onclick-nél return false-t próbáltam, de az se megy, csak abban az esetben ha egy sima linken próbálom, ami nem hív meg semmilyen függvényt.
BlackY
Az Event.observe-ből gondolom, hogy prototype-ot használsz, akkor:
CODE
Event.observe(item, 'event', function(eventObj) {
    /* ... */
    Event.stop(eventObj); /* <- ez megállítja az esemény feldolgozásást, tehát a többi rákötött esemény nem fog lefutni, így a "browser default" sem. */
});


Egyébként a return false is stimmel, [nem 100%-os biztonsággal állítom]csak a a prototype egy burkolót is pakol valahogy az eseménykezelők köré, amiből nem tudsz visszatérni.[/nem 100%-os biztonsággal állítom]

BlackY
ui.: Miért nincs ilyen BBCode tag? smile.gif
lnorby
Sikerült, elkészültem a lightbox-al! És nem is lett olyan béna... Köszönöm a segítséget BlackY!
Killroy
Sziasztok!

Egy olyan javascriptet szeretnék írni amely visszaszámol egy adott dátumig.
Tehát azt mondom hogy mondjuk a határidő az 2009 augusztus 31-ig akkor kiírja hogy hány másodperc, perc, óra, nap van hátra.
Ezt szövegesen sikeresen meg is oldottam, de én egy grafikus, ún "flipping timer" szeretnék.

az alábbiakban megadom a kódomat, melyet eddig összehegesztettem. Van ugye egy countdown függvényem amely visszaszámlál a fentieknek megfelelően, szövegesen és van egy
animation függvényem, amely megcsinálja a "flip" animációt.

Countdown:
CODE
<head>

<style type="text/css">

    #timer div {
        height: 53px;
        float: left;
        margin-right: 10px;
    }

    #timer div span {
        background-image: url(counter.png);
        display: block;
        width: 34px;
        height: 53px;
        float: left;
        margin-right: 5px;
    }
    
    #timer div span#s1 {
        background-position: left -1431px;
    }
    #timer div span#s2 {
        background-position: left 0px;
    }

    #timer div span#m1 {
        background-position: left -1431px;
    }
    #timer div span#m2 {
        background-position: left 0px;
    }

    #timer div span#h1 {
        background-position: left -1431px;
    }
    #timer div span#h2 {
        background-position: left 0px;
    }

</style>

<script type="text/javascript">
function Countdown() {
        
        today  = new Date();
        todayEpoch  = today.getTime();
        
        target = new Date("31 August, 2009");
        targetEpoch = target.getTime();
        
        var hatralevoIdoMasodpercben = Math.floor((targetEpoch - todayEpoch) / 1000);
        
        var hatralevoNapok = Math.floor((hatralevoIdoMasodpercben / (60*60*24)));
        hatralevoIdoMasodpercben = hatralevoIdoMasodpercben - (hatralevoNapok*60*60*24);
        
        var hatralevoOrak = Math.floor((hatralevoIdoMasodpercben / (60*60)));
        hatralevoIdoMasodpercben = hatralevoIdoMasodpercben - (hatralevoOrak*60*60);
        
        var hatralevoPercek = Math.floor((hatralevoIdoMasodpercben / 60));
        hatralevoIdoMasodpercben = hatralevoIdoMasodpercben - (hatralevoPercek*60);
        
        var hatralevoMasodpercek = hatralevoIdoMasodpercben;
        
        document.getElementById('timer').innerHTML = hatralevoNapok + ' nap, ' + hatralevoOrak + ' óra, ' + hatralevoPercek + ' perc, ' + hatralevoMasodpercek + ' másodperc, ';
        //setTimeout('Animation()', 1000);
        setTimeout('Countdown()', 500);

        
    }
</script>
</head>
<body onload="Countdown()">

    <div id="timer">
        
        <div id="days">
            <span id="d1"></span>
            <span id="d2"></span>
        </div>

        <div ="hours">
            <span id="h1"></span>
            <span id="h2"></span>
        </div>

        <div id="minutes">
            <span id="m1"></span>
            <span id="m2"></span>
        </div>

        <div id="seconds">
            <span id="s1"></span>
            <span id="s2"></span>
        </div>
      
    </div>

</body>



És az animációs függvény, amely setTimeout-tal meghívja saját magát bizonyos időközönként
CODE
function Animation() {
        if (framePos < frames) {
            framePos++;
            document.getElementById("s2").style.backgroundPosition = "left -" + Pos +"px";
            Pos = Pos + boxHeight;
            changeFramesTime = setTimeout('Animation()', 45);
        }
        else {
            framePos = 0;
            clearTimeout(changeFramesTime);
        }
    }



a kép amely a grafikus számokat tartalmazza illetve a "frame"-eket pedig itt található:



Ötleteket várok arra, hogy hogyan hözzam össze a grafikus számláló értékeit a képpel, hogy egy szép flipping timert kapjak.

Előre is köszönöm!
tupacko
En ugy csinalnam, hogy keszitenek GIFeket az animacioval, pl. 0 -> 1, 1 -> 2, majd ezt kovetoen minden masodpercben cserelnem a kepeket, 1.gif, 2.gif, stb.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2012 Invision Power Services, Inc.