jQuery topic - Szoftverfejlesztés fórum

üzenetek

hozzászólások


jeges
(senior tag)

nem az a baj, hanem az, hogy a .click a .help-re vonatkozik, az .each pedig a .dt-re. ezeknek soha nem lesz egyforma az id-jük, csak a sorszámuk (a kötőjel utáni rész). azaz az id-t kell kivenni mindkét elemből, és csak a sorszámukat hasonlítani:

var postid = $(this).attr(id).split("-")[1];

if (id != postid){
...


szmegma
(aktív tag)

<script type="text/javascript">
$(document).ready(function() {
var yOffset = 15;
var xOffset = -23;
$(".dt").hide();

$(".help").click(function(e){
var id = $(this).attr("id").split("-")[1];

$(".dt").each(function(){
var _id = $(this).attr("id").split("-")[1];

if(id != _id){
$(".dt").hide();
//alert(_id+"<>"+id);
}

else{
//alert(_id+"|"+id);

if ($(this).css("display") == "none"){
$("#f"+id).css("top", "12px").css("left", "-9px").css("position", "absolute").css("z-index", "9999");
$("#i-"+id).css("top", (e.pageY + xOffset)+"px").css("left", (e.pageX + yOffset)+"px").slideDown("slow").delay(2000).slideUp("slow");
}
return false;
}
});
});
});</script>

Igy nez ki jelenleg es csak azert sem mukodik. :W
Viszont vmit eszre vettem. MOndjuk kattintok a 3. kerdojelre, ekkor 3 alert ugrik fel:

0<>2
1<>2
2|2

Ha megnezed a koztuk levo separatort lathatod, hogy az elso 2 alert az if(){ alert(_id+"<>"+id); } reszbol ugrik elo, az utolso alert pedig az else{ alert(_id+"|"+id); } reszbol ugrik elo.

Ekkor ha ujbol kattintok a 3. kerdojlere (meg nyitva van a box) csak megismetli a 3 alert-et ugyanazzal a tartalommal, majd eltunteti a boxot (SIKERULT) am ujbol futtatja a slideDown("slow").delay(2000).slideUp("slow") reszt is igy megint lenyilik a box es a delay() pedig osszecsukja (NINCS SIKER). :O

Nem ertem miert fut le az IF es ELSE ag is...

[ Szerkesztve ]


jeges
(senior tag)

az újra-felugrást valszeg nem fogod tudni megakadályozni. részlet a jquery dokumentációból:
"The .delay() method is best for delaying between queued jQuery effects. Because it is limited—it doesn't, for example, offer a way to cancel the delay—.delay() is not a replacement for JavaScript's native setTimeout function, which may be more appropriate for certain use cases."
ha a korábban elindított késleltetett futást szeretnéd törölni, arra csak a setTimeout vagy setInterval alkalmas.

(mindenesetre írass ki egy $(this).css("display")-t is, hogy lásd, teljesül-e a feltétel.)


szmegma
(aktív tag)

Na kicsit belemelyedtem es az each es addclass reszt egybegyurtam:

MEGTEKINTES

Itt ha megnezed es kiprobalod, akkor mar eleg jol elkuloniti az IF ELSE, hogy melyik ID lett kattintva es annak milyen a statusza illetve a tobbi ID-nek milyen a stausza.

Ebben az elagazasban nem lehet vhogy megjeleniteni amit szeretnek? :)


jeges
(senior tag)

ez rendben, de mint fent írtam, ha jól értem nincs garancia arra, hogy javítható a nem várt működés, amit a delay okoz. ezt valószínűleg a delay mellőzésével lehetne csak orvosolni.
egyébként most már helyes eredményre vezethet a két érintett id vizsgálata, csak magát a vizsgálatot kivetted a kódból - pedig korábban ez már működött. valszeg a display feltétel is jó volt, bár ezt lehetne tesztelni.


szmegma
(aktív tag)

Vissza pakoltam a display es id == _id ellenorzest mert tenyleg az hianyzott.

Mostmar 99%-ban ugy mukodik, ahogy kell viszont van egy ici pici problema:

MEGTEKINTES

Amikor mondjuk kattintasz a 3. kerdojelre es megjelenik a 3. box tartalma:

1, nem kattintasz sehova szepen becsukodik magatol ahogy kell
2, kattintasz egy masik ID-ju kerdojelre szepen eltunteti az elozo nyitottat
3, ha a nyitott box kerdojelere kattintasz akkor mint a log is mutatja jobb szelen megvaltozik a display NONE-rol BLOCK-ra, am megsem az IF agban levo kod fut le.
direkt beallitottam fadeOut()-ra az IF agban levo eltuntetest, hogy lathato legyen az effekt.

Ezt a hibat nem hinnem, hogy a delay() okozza.
Ha igen, akkor aruld mar el legy szives, hogyan lehetne azzal a setTimeout cuccal eltuntetni a delay() helyett?


jeges
(senior tag)

az if ág fut le (különben nem azt írná ki), de valami miatt nem jut érvényre a fadeout. ennek több oka is lehet: vagy a már lefutott, de késleltetett kód, vagy valami visibility jellemző.

setTimeout ügyében
a lényeg:
indítás:
var t = setTimeout(function(){...},1000);

törlés:
clearTimeout(t);

ha nem törlöd, lefut a function(){} 1 másodperc múlva

Nálad az indítást és megállítást az else és if ágakra lehet tenni (persze a definiálatlan t értéket kezelni kell)


szmegma
(aktív tag)

Ez lesz az, mar csak tudni kene pontosan, hogy hova kell mit raknom.

Szoval a clear() es delay() cuccokat kellene ugy elhelyezni, hogy amikor en zarom vissza a nyitott boxot, akkor a display erteket is allitsa be NONE-ra, mivel az marad BLOCK erteken, ezert ha ujra egy altalam bezart kerdojelre kattintok akkor annak display BLOCK ertekenek koszonhetoen megint az IF ag fut le es nem az ELSE.

Celegyenesben vagyunk...otlet?


jeges
(senior tag)

ha jól érzékelem, azóta megoldódott.
már csak azt nem értem, miért kell két clear() az if ágba (valszeg egy is elég lenne)


szmegma
(aktív tag)

Nem, nem. Probald csak ki ebben a sorrendben:

1, kattints a 3. kerdojelre

2, mielott becsukodna a 3. box kattints az 5. kerdojelre
(A 3. boxot nem az IF vagy ELSE agban levo eltunteto kod tunteti el, hanem ez => $("dt").css("visibility", "hidden"); ami kozvetlen a click utan fut le)

3, mielott becsukodna az 5. box kattints megint a 3. kerdojelre

Ekkor lathatod, hogy az 3. box nem kinyitodik ahogy kellene, hanem eppen csak megjelenik es mar el is tunik vagyis az IF agban levo $("dt").slideUp("slow"); tunteti el ami helyes hiszen a display erteke BLOCK maradt, mivel a $("dt").css("visibility", "hidden"); resz tuntette el.

Magyarul vhogy NONE-ra kellene allitani az display erteket annak a boxnak amit $("dt").css("visibility", "hidden"); resz tuntet el.

Gondoltam, hogy hat ez pofon egyszeru: $("dt").css("display", "none"); reszre kell lecserelni, de NEM!


jeges
(senior tag)

nem lehet h azért nem működik, mert a $("dt") helyett $(".dt") kellene? gondolom, a dt class-ú elemeket akartad megfogni.


jeges
(senior tag)

ezt jól elnéztem, sztorno az előző.


Sk8erPeter
(nagyúr)

Bocs, hogy belekontárkodom, nagyon sok részletből kimaradtam, és nincs is időm elolvasni az egész korábbi társalgást erről a súgó-megjelenítős dologról, de tulajdonképpen minek játszol a visibility CSS-tulajdonsággal? Van ezzel valami különösebb célod? Csak kavarja az egészet, a slideUp/slideDown tulajdonság állítgatja a display property-t (és azzal együtt nyilván folyamatosan dinamikusan változtatgatja pl. a height tulajdonságot), annak elégnek kellene lennie.
Ezentúl tulajdonképpen nem látom be, miért is van szükség erre az id-t szétbontós dologra split() függvénnyel, nagyon rugalmatlan megoldás, könnyű elrontani. Ha már ilyen módon van felépítve, nyugodtan lehetne a siblings() VAGY prev() vagy next() függvényeket használni. Egyébként is érdemes lenne egy nagyobb div-be vagy hasonlóba bepakolni magát a kérdőjelet, plusz a hozzá tartozó súgót, hogy logikailag is összetartozzanak, és akkor máris el lehet kerülni azt, hogy az id-k nevéből kelljen kisajtolni egy számot, majd erre hivatkozni, stb... melós. Amúgy amikor azt az esetet veszem, amit a 3. pontban írtál, látszik, hogy a display block-ra állítva marad, csak a visibility változik. Mintha egyáltalán nem törlődne az időzítés a clearTimeout-nál.
(Megjegyzés, hogy szerintem az ilyen elnevezések, mint a var css; és ehhez hasonlók, nem túl szerencsések, mert könnyen megkavarhatják az embert hosszabb kódnál (lásd ugyanilyen nevű függvény is van jQuery-nél). Lehetne inkább var dt_display; vagy valami ilyesmi, csak ne hasonlítson foglalt nevekre.)
Egyébként elméletileg nem lenne szükség az each() függvényre, ahogy ugye itt a slideUp() függvénynél is sok div-et tüntet el egyszerű $("div").slideUp(); segítségével (ciklikusan végigmegy az összes egyező elemen).

Igazából nem is kéne if-ekkel vizsgálgatni, miután végighaladtál ciklussal az összes elemen, hogy meg van-e jelenítve, ahogy most csinálod ( if(css == "block") ), hanem kattintáskor
1.) törölni az összes beállított timeout-ot
2.) egyszerűen a kérdőjelre való kattintásra vonatkozó (click) tulajdonságra rákötni, hogy az összes súgót tartalmazó elemet (nálad dt-t) slideUp-olja - még akkor is, ha egyetlen egy elem sincs megjelenítve, ez úgyis annyira gyorsan történik, hogy itt rohadtul nem számít, hogy végigvizsgálgattad-e egyesével; sőt, ezt megteszi helyetted a jQuery! Nyilván ha meg van jelenítve, akkor animálva eltünteti, a display-t a végén none-ra állítva, ha nincs, megy tovább a következő talált elemre.
3.) az adott elem melletti súgót tartalmazó elemet (buborékszerűséget) megjeleníteni slideDown-nal (vagy ahogy épp meg akarod jeleníteni a súgót)
4.) beállítani a setTimeOut-ot a kívánt időmennyiségre, aminek a végén slideUp-olod a súgót, hogy eltűnjön.

Szóval szerintem bőven lehetne egyszerűsíteni a kódon.

[ Szerkesztve ]


szmegma
(aktív tag)

Nem veszem kontarkodasnak de ha ilyen okos lennek elhiszed nekem, hogy nem igy csinaltam volna meg? Foglamam sincs a jQuery ezen szintjerol. Nem latom at amit irtal, hogyan is kellene aszerint elkesziteni a kodot.

Termeszetesen a visibility, id szetbontogatos cucc kenyszer megoldas, mivel nem tudom, mashogy megcsinalni.

Olvastam tobb oranyit a jQueryrol de jelenleg itt tartok, annyi a tudasom. :O

Ha esetleg dobnal egy kis morzsat, hogyan is kellene akkor vennem a faradsagot es probalgatnam szabad idomben vegig jarni az utat, hatha megertem azt.

Koszonom.

[ Szerkesztve ]


sptkyle
(senior tag)

Sziasztok. A Jquery alapú Cufón megoldást használta már valaki? Help kellene, mert bár elvileg egyszerű, az istenért nem akar müködni. :(

[ Szerkesztve ]


Speeedfire
(nagyúr)
Blog

Kis jquery ajax php házasításon dolgozok. Ehhez szeretnék segítséget kérni.
Lényegében egy hírlevél küldésről lenne szó, ami 50-esével küldi el a leveleket. Egyelőre hót' koki vagyok az ajaxhoz.
Kis példán dolgoztam magamnak, hogy működik-e. De nekem nem akar. :)

index.php:

<html>
<head>
<script type="text/javascript" src="js/jquery.js" ></script>
</head>
<body>

<h1>Hírlevél</h1>

<script type="text/javascript" >

$(document).ready(function() {
$.ajax({
type: "POST",
url: "kuld.php",
cache: false,
data: "i=1",
async: true,
succes: function(html){
$(.szamol).append(html);
}
});
});

</script>

<div class="szamol">
számolás<br/>
</div>

</body>
</html>

kuld.php:
<?php

$i = $_POST['i'];
$max = 20;

for ($i; $i <= $max; $i++){
echo $i.'<br/>';
}

?>

Valami észrevétel javaslat? :D

A kiírás meg minden változna majd természetesen. Csak jó lenne ha legalább ez adna valamit vissza. :)

[ Szerkesztve ]


Speeedfire
(nagyúr)
Blog

Javítva ez a sor és már megy is. :)

$(".szamol").append(html);

Márcsak azt kellene megoldani, hogy ezután az ajax ismét lefusson csak már data értékkel. :))

[ Szerkesztve ]


martonx
(veterán)

success: function-be $(".szamol").append(html); után beleraksz egy újabb ajax-ot. Ennyi. Vagy félreértettelek?


Speeedfire
(nagyúr)
Blog

De ha többször is le kell futnia?
Mondjuk van 3000 adat az adatbázisban és 50-esével tölti be az adatokat. Az lenne a jó ha az i értékét egyszerre kezelné a js és a php is.

üzenetek