Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: jQuery UI - Laatikko ei himmene sitä vetäessä

Sivun loppuun

Petja [03.03.2012 11:45:42]

#

Miksiköhän tämä jQuery UI:ta hyödyntävä koodi ei oikein toimi? Draggiminen ("vetäminen") toimii, mutta ei fadeta ("häviä himmennetysti").

$(function(){
$("#postiviesti").draggable({
  revert:       true,
  axis:         "x",
  distance:     128,
  containment:  "parent",
  drag:
    function(event,ui){
      if($("#postiviesti").offset.left>256){
        $("#postiviesti").fadeOut("slow");
      }
    }
});
});

#postiviesti pitäisi siis fadettaa, kun sitä on dragittu 256 pikseliin.

Syy on luultavasti tuossa offsetissa, jonka kanssa minulla on aiemminkin ollut ongelmia.

tsuriga [03.03.2012 12:13:22]

#

En nyt ehdi testaamaan, mutta toimisko $(this).offset().left tai ui.offset.left?

Grez [03.03.2012 12:18:18]

#

offset -> offset() ja toimii.

Petja [03.03.2012 12:21:11]

#

Grezin ohjeiden mukaisesti näyttää nyt toimivan. Hankala muistaa, kun ei tule missään muualla kirjoitettua funktion nimen perään heti pistettä.

Grez [03.03.2012 12:27:28]

#

Ilmeisesti et sitten koodaile Javalla, C#:lla tms.

Mielestäni se on hyvin helppo muistaa. Jos haluat kutsua funktiota, laitat (<mahdollisesti jotain>) funktion nimen perään.

Eihän tuossakaan mikään pakko ole laittaa pistettä heti funktiokutsun perään. Voit toki laittaa sen funktion palauttaman tuloksen ensin muuttujaan:

var offset = $("#postiviesti").offset()
if(offset.left>256){
  $("#postiviesti").fadeOut("slow");
}

Petja [03.03.2012 16:51:58]

#

Juu; Java ja C-kielet eivät ole minulle tuttuja. Javaan aion tutustua pian ja C-kieletkin harkinnassa.

Metabolix [03.03.2012 16:54:42]

#

Johan kohdassa $("#id").offset on piste heti $-funktion kutsumisen perässä.

Petja [03.03.2012 17:07:15]

#

Tuo piste tulee ihan automaattisesti ilman pähkäilyjä, kun se on tavallaan jQueryn "ydintä".

jlaire [03.03.2012 18:39:28]

#

Petja kirjoitti:

Hankala muistaa, kun ei tule missään muualla kirjoitettua funktion nimen perään heti pistettä.

Mitä. Virheesihän oli juuri se, että laitoit pisteen heti funktion nimen perään kun sen pitää olla funktiokutsun perässä.

Jos et aseta funktioille attribuutteja tai kikkaile prototyypeillä, sinun ei juuri koskaan tarvitse kirjoittaa pistettä heti funktion nimen perään joten tuonhan pitäisi olla helppo muistaa.

The Alchemist [03.03.2012 19:13:43]

#

Petja kirjoitti:

Grezin ohjeiden mukaisesti näyttää nyt toimivan. Hankala muistaa, kun ei tule missään muualla kirjoitettua funktion nimen perään heti pistettä.

Oppimista helpottaisi se, että alkaisit debugata koodiasi. Ainakin Firefoxissa on tätä varten erikseen Error Consoler.

jukkah [03.03.2012 22:14:34]

#

The Alchemist kirjoitti:

Oppimista helpottaisi se, että alkaisit debugata koodiasi. Ainakin Firefoxissa on tätä varten erikseen Error Consoler.

Petja: Tykkäät Firefoxista, joten käytä The Alchemistin mainitsemaa debuggeria. Käsittääkseni kaikilla selaimilla on (IE:stä ja Chromesta olen varma) debuggeri olemassa.

tsuriga [04.03.2012 04:11:52]

#

Myös molemmat ehdottamani näkyvät toimivan. Nyt kun otat tuon ui:n funktiossa kuitenkin vastaan niin olisi luultavasti parempi käyttää sitä kuin etsiä elementti uudestaan DOM-puusta. Kirjoittamalla $(this).fadeOut... säästyt refaktoroinnin vaivalta tuon osalta, mikäli päätät joskus nimetä elementin uudelleen. Nopeudesta en tuossa mene sanomaan mitään varmaa, mutta voisin taas veikata nopeammaksi. DOM-puusta hakeminen on yleisellä tasolla verrattain hidasta ja useasti käytetyt elementit kannattaisikin ottaa muistiin.

The Alchemist [04.03.2012 08:03:35]

#

Toisaalta ID:n perusteella hakeminen lienee helppo optimoida nopeaksi ja veikkaisin näin jo tehdynkin.

Petja [04.03.2012 09:01:20]

#

Virhekonsolia harvemmin käytän, mutta on sinnekin pari kertaa tullut eksyttyä. Voisi sitäkin opetella käyttämään.

Aloin muuten miettimään, että onko tämä kaunis/toimiva (IE:llä ei ainakaan toimi!) tapa tehdä postikuorea muistuttava palautelomake, joka raahataan postilaatikkoon, kun viesti halutaan lähettää? Vai pitäisikö sen sijaan käyttää vain ihan tutuksi tullutta Lähetä-nappia? Vaikka näytetäänkin ohjeet kuinka viesti lähetetään, osaavatko kaikki ihmiset varmasti lähettää viestin tällä raahaamissysteemillä? Selaintuen vuoksi IE:lle voisi tehdä normaalibuttonin; muille selaimille tämän raahaamissysteemin.

Kuva käytännössä:
https://twitter.com/#!/PetjaTouru/status/176195635903602688/photo/1/large

makumaku [04.03.2012 09:44:26]

#

Ainakin kannattaa tarkistaa selaimessa toimivat kehitystyökalut kuntoon. Monessa tilanteessa niistä saa huomattavasti etua verrattuna basic-tason print-debuggaukseen tai vastaavaan.

Lataa esim firebug tai dragonfly riippuen selaimesta. Myös muissa selaimissa taitaa olla kehitystyökalut (tarkoittaa js concolea, js debuggeria, DOM-inspectoria, jne..). Taitaapa jopa IE:n saada nykyisin toimivat työkalut.

Mutta tuosta postilaatikkoon raahauksesta omat kommentit on että aivan turhaa kikkailua. Käyttäjälle on paljon helpompi painaa kerran hiirtä kuin alkaa askartelemaan ja vetelemään. Voiko tuota käyttää edes ilman hiirtä? Mutta tämähän on maku/käytettävyys/mielipideasioita.

Petja [04.03.2012 09:58:40]

#

Firebug ollut käytössä jo vuoden ellei kohta piakkoin toisenkin.

Kosketusnäytöllä pitäisi kyllä wörkkiä, mutta jos ei ole hiirtä eikä kosketusnäyttöä, sitten on kyllä hieman hankalampi toimia. Sivuille pitäisi kuitenkin saada jotain toiminnallisuutta, siten että vastaisivat vaatimuksia. Jos tämän raahaamissysteemin ottaisi pois, mitä hienoa sen tilalle pystyisi oikein kehittelemään?

Grez [04.03.2012 10:15:00]

#

Petja kirjoitti:

Firebug ollut käytössä jo vuoden ellei kohta piakkoin toisenkin.

Miten sitten debuggasit tuota alkuperäistä ongelmaa käyttäen firebugia ennen kuin postasit tänne? Laitoit breaklinen if($("#postiviesti").offset.left>256){ -riville, ja kun katsoit että $("#postiviesti").offset.left arvo on "undefined", nostit kädet pystyyn?

Ei se auta jos se on "käytössä", jos sitä ei käytä.

Macro [04.03.2012 10:16:31]

#

Lisää osoitteen alle lähetysnappi, kyllä siinä voi kaksikin tapaa olla.

makumaku [04.03.2012 11:09:46]

#

Petja kirjoitti:

Sivuille pitäisi kuitenkin saada jotain toiminnallisuutta

Petja kirjoitti:

Jos tämän raahaamissysteemin ottaisi pois, mitä hienoa sen tilalle pystyisi oikein kehittelemään?

Siis tälläiset keinotekoiset asiat eivät ole tai lisää sivujen toiminnalisuutta. Toiminnallisuus tuossa on se että käyttäjä voi lähettää palautetta. Se, että miten käyttäjä sen joutuu tekemään, ei ole lisätoiminnallisuutta vaan käytettävyyttä.
Ainakin itse ymmärrä asian näin.

tsuriga [04.03.2012 13:58:14]

#

The Alchemist kirjoitti:

Toisaalta ID:n perusteella hakeminen lienee helppo optimoida nopeaksi ja veikkaisin näin jo tehdynkin.

ID:llä hakeminen on totta kyllä nopeaa (= getElementById), mutta en ainakaan nopealla haulla löytänyt viitteitä, että jQuery käyttäisi varsinaista cachea. Tässä Stack Overflow:n keskustelussa mainitaan, että selectoreiden cachetukseen olisi mahdollista käyttää DOM-eventtejä, mutta kirjastojen tapauksessa tämä vaatisi ko. eventtien toteutuksen vanhemmille selaimille. Vaikka ko. eventeista löytyisikin toteutuket, veikkaisin niiden käytön syövän cachen edut.

Jos tekee yhtään suurempia projekteja jQueryllä (pätenee osittain myös ihan XPath-hauille), kannattaa lukaista thegrubbsian - Optimizing jQuery Selector Performance ja jQuery: Performance analysis of selectors.

EDIT: Ja tosiaan kehityskonsoleita ja työkaluja löytyy nykyään lähes jokaiselle valtavirtaselaimelle. Firefoxille alunperin tehdystä Firebugista löytyy myös lite-versio, jota voi käyttää useissa selaimissa. Operassa, IE:ssä, Chromessa ja Safarissa kehitystyökalut tulevat selaimen mukana.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta