Hirdetés

Keresés

Új hozzászólás Aktív témák

  • martonx
    veterán

    Sziasztok!

    Próbálnék egy olyan megoldást csinálni, hogyha eredeti forrásból (CDN) nem sikerül behúzni a kívánt .js fájlt, akkor használja saját szerverről.

    Többféle megoldással is próbálkoztam, de egyedül csak a document.write működik, a többi sajnos nem.

    JSFiddle: https://jsfiddle.net/942fgodv/
    (Elsőnek egy Bootstrap JS-t töltenék a példa kedvéért, azt direkt elrontom, aztán jön a fallback, ami a példában egy custom alert JS, szintén CDN-ről.)

    Tehát az elején szimulálom a CDN elérhetetlenségét, elrontom a linket (1-est írok elé).

    Aztán próbáltam egy olyan megoldást, hogy a <script> tagbe írtam egy onerror-lépést, de sajnos nem működik. (Fura, CSS-nél működik.)

    Aztán jön a document.write, ami szépen működik, fel is jön az custom alert, tehát betöltött a 2. JS, és így a custom funkciót is tudta használni.
    Eredetileg ezzel a megoldással készítettem el az oldalam ezen részét, viszont a Lightroom lepontozza, azt írja, ne használjam, mert lassíthatja a lassú kapcsolattal rendelkezőknél a betöltést. Ezért keresek más megoldást.

    Harmadik megoldási kísérletem pedig az, hogy document.head.appendChild()-dal hozzáadom a feltöltött script taget.
    Ez szépen hozzá is adja, betöltés után látom, hogy jó helyen van (a custom funkció hívása előtt), viszont gondolom, a HTML feldolgozása nem várja meg, így hamarabb jut a funkcióhíváshoz, minthogy betöltené a hozzá szükséges JS-t, ezért le sem fut.

    Miért megy document.write-tal, és miért nem appendChild-dal? (Bár gondolom, azért nem, mert aszinkronban tölti le, míg a document.write blokkolja a további feldolgozást addig. És talán pont ezért nem javasolt a használata.)

    Tudtok erre a problémára jó megoldást?
    (Nem csak a CDN elérhető / nem elérhető helyzetre kell, másra is szeretném használni.)

    Köszönöm.

    szerintem az appendchild-os megoldás is működhet, csak épp rosszul használod. A scritpnek kellene egy onload event vagy valami ilyesmi, és azon belül már működne a swal hívás.

  • Mr. Y
    őstag

    Ilyesmire gondolsz?
    [link]
    Az alján van egy jó kis példa is hozzá.

    Valami ilyesmire, köszönöm szépen. De hogy én ezt miért nem találtam :F

  • Bzozoo
    tag

    Most pontosan így működik, és a Google semmit sem lát a JS által kliens oldalon generált tartalomból. :( (A search console-ban látom, hogy néha betölti a szükséges JS-t, olyankor van indexelt tartalom is, de aztán "vált", és mondjuk másnaptól már kihagyja a fájlt, így csak egy üres statikus váz van.)
    Vannak saját cikkeik is, hogy az indexelő botok már látják a JS által generált tartalmat is, hogy a dinamikusan épülő weblapokat is indexelni tudják - sajnos azonban ez nem tökéletes / vagy nálam van valami baja (amit amúgy látok is - úgy gondolja, hogy az az 1 szál JS fájl neki nem kell és kész, és így bukta az egész oldalépítés).
    Ezért akartam szerver oldali összerakásra váltani, viszont mivel az oldal ettől még görgetés után dinamikusan épül fel (infinite scroll), eléggé zsákutcába kerültem. Már a projekt kukázásán és újrakezdésén gondolkodom.

    De én nem erről beszéltem. Nem arról beszéltem, ahogy nálad van. Arról, hogy nem kell előre generált HTML-eket gyártani. A HTML-t akkor kell előállítaani, amikor a felhasználó lekéri a tartalmat. A felhasználó már csak a generált HTML-t kapja, ami akkor generáloódik szerver oldalon, amikor a felhasználó megnyitja az oldalt.
    Node.js, Next.js, Nuxt.js mind tudja ezeket.

  • martonx
    veterán

    Igen, ezért csináltam úgy (kényszer-öszvérmegoldásként), hogy a HTML tartalommal feltöltve és frissen tartva van szerver oldalon, így a Google is látja és indexeli - aztán a kliensen betölt, és a JS lecseréli a legfrissebbre.
    Na de ez se nem szép, se nem hatékony. Rossz irány volt.
    Úgyhogy ezt el is engedem, és hagyom a dinamikus tartalomgenerálást. Lesznek szerver oldalon pár percenként PHP-val frissített, statikus, tartalommal szépen feltöltött oldalak, a Google-nek lesz mit indexelnie. Nem lesz olyan szép és kreatív mint most (amit amúgy nagyon szeretek), ellenben nem csak a családom és én fogom ismerni és látni... :DDD Remélhetőleg.

    Így igazából használom azt a szerver oldalon generálós módszert, amit a mostani megoldáshoz csináltam (PHP):
    1) HTML template jól elkülöníthető kulcsszó-sztringekkel (pl. ahova az első cikkhez tartozó kép linkje megy, az websiteData_imageSource_1, ahova az adott title, az mondjuk websiteData_Title_1 stb.)
    2) PHP, lekéri a friss adatokat SQL-ből, aztán az eredményeket egy egyszerű sztringcserével a kulcsszó-sztringek helyére pakolja, majd elmenti (a megfelelő mappába index.html-ként).

    Oké, nagyon alap-alap-alap megoldás, de működik. Vagy tanuljak valami normális keretrendszert inkább? Semmit nem ismerek, sose használtam, csak pár nevet láttam még: React, Vue.js, Next.js, ilyesmik.
    Szívesen tanulok, ha azt mondjátok, hasznos lehet, és hogy a mostani faék-egyszerűségű módszerem nem jó. Ehhez szívesen vennék egy ajánlást, mit tanuljak meg. (Bár azt se tudom, a jelenlegi cPaneles szolgáltatónál telepíthetek-e egyáltalán bármit, ami ezekhez lenne szükséges.)

    A cél: híraggregátor oldal. A jelenlegi formájában olyan, mint a Fb, görgetsz, töltődik. Szeretem, tetszik, de sajnos rossz ötlet volt. Nem Google-barát, ebből nem lesz haszon őszire. :DDD Inkább váltok valami 1.000.001. standard híroldal-kinézetre. Ehhez mondjuk szerintem nem kell semmi extra, elég a PHP --> SQL --> PHP --> HTML irány, de hátha ti mást mondotok.

    Köszönöm.

    Tanulni mindig jó és hasznos. Kiábrándítani nem akarlak, de ez nem olyan ötlet, amiből valaha is haszon lesz, mindegy, hogy a google látja-e vagy sem.
    Tanuláshoz irányok, amiket javaslok:
    1. Szerver oldali frameworkök. Ha eddig PHP-ztél, és elégedett vagy vele, akkor valami értelmesebb PHP frameworköt javaslok, mint pl. Laravel, Yii, vagy azt se tudom mik a trendi PHP frameworkök mostanában.
    2. Kliens oldali frameworkök. Ezek valóban nem barátai a SEO-nak, de manapság egyre kevésbé megkerülhetőek. Vuejs, React, Angular, Svelte (még talán ez utóbbi a legmegfelelőbb a SEO barát weboldalak kicsit erősebb interaktív irányba felokosítására).
    3. Ezt csak nagyon óvatosan mondom, mert ez nagyon szubjektív, de én a helyedben elgondolkodnék az aranyos, játszós nyelv PHP helyett (öhm, tudom hogy most szereztem egy rakás ellenséget, és sokan a szívükhöz kapnak), valami komolyabb, teljesítmény orientált nyelvre váltani backenden pl. Java (Spring), C# (Asp.Net Core), Go (nem tudom milyen frameworkök léteznek hozzá) mennek mostanában. Én személy szerint az Asp.Net Core-ra esküszök, de mondom ez nagyon szubjektív

  • martonx
    veterán

    Most pontosan így működik, és a Google semmit sem lát a JS által kliens oldalon generált tartalomból. :( (A search console-ban látom, hogy néha betölti a szükséges JS-t, olyankor van indexelt tartalom is, de aztán "vált", és mondjuk másnaptól már kihagyja a fájlt, így csak egy üres statikus váz van.)
    Vannak saját cikkeik is, hogy az indexelő botok már látják a JS által generált tartalmat is, hogy a dinamikusan épülő weblapokat is indexelni tudják - sajnos azonban ez nem tökéletes / vagy nálam van valami baja (amit amúgy látok is - úgy gondolja, hogy az az 1 szál JS fájl neki nem kell és kész, és így bukta az egész oldalépítés).
    Ezért akartam szerver oldali összerakásra váltani, viszont mivel az oldal ettől még görgetés után dinamikusan épül fel (infinite scroll), eléggé zsákutcába kerültem. Már a projekt kukázásán és újrakezdésén gondolkodom.

    "viszont mivel az oldal ettől még görgetés után dinamikusan épül fel" - oké, akkor elárulom azt is, hogy a Google majdnem tökéletesen ignorálja azt a tartalmat, amihez görgetni kell.

  • Taci
    addikt

    Igen, teljesen igazad van. Azóta már rájöttem, hogy ugyanaz lenne a probléma, és hogy pont ugyanúgy kliens oldalon generálódna a tartalom, ahogy most - szóval csak mentem volna egy nagy kört a semmiért.
    Úgyhogy marad a B terv, a generált tartalomhoz való hozzáfűzés. Így ez teljesen szerver oldali generálás lesz, JS csak akkor fog futni, ha a felhasználó a görgetésben az utolsó elemek közelébe ér (infinite scroll). Így a JS állomány nagy részét (amik eddig a tartalomgenerálásért voltak felelősek) elég ha a csak FCP (First Contentful Paint) után húzom be (async? Ennek még utána kell néznem amúgy is: [link]), de ez még arrébb van kicsit.

    Köszönöm.

    Sajnos nem jó a B terv, nagyon sok a probléma vele. Így mennék még egy kört:

    Adott egy tartalommal feltöltött div:
    <div id="content">Tartalom</div>

    Meg lehet szakítani / kihagyni az adott div renderelését?
    <div id="content">
    <script>if (jsBetoltve == 0){ //content div betöltésének átugrása }</script>
    Tartalom</div>

    És az elrejtés (display:none, z-index stb.) sajnos nem ajánlott a SEO szempontjából, sok cikket átolvastam a témában.

    Ott kell hogy legyen a tartalom a szerveren, az sem nagy baj, hogy azt a plusz pár kB-ot le kell tölteni, viszont eléggé zavaró, ahogy látszódik egy pillanatra, mielőtt a JS lenullázná a div-et. (Hiszen rendereli, ha már benne van.)

    Köszönöm.

  • sztanozs
    veterán

    Köszönöm (sztanozs, neked is), a példakódot is (jó a fejcsere :D ) .
    Viszont a tartalom elrejtését már az elején kizártam, mert a Google nem mindig egyértelműen áll hozzá (rendben van, látja, indexeli - vagy épp SEO-manipulálásnak tartja, és ejnyebejnye). És az egész átalakításom lényege pont az, hogy a G felé rendben legyen az oldal.

    Talán megpróbálom úgy, hogy üres lesz a div, és ha a (tartalomgeneráláshoz) szükséges JS-ek közül nem töltődött be bármelyik is, akkor behúzza oda az előre generált tartalmi részt. Máskülönben pedig üresen hagyja, és engedi, hogy a JS végezze a dolgát.

    Nagy vonalakban:
    https://jsfiddle.net/1dgyfs2v/
    (disy68, a példakódodban van pár rész, amit így is fel tudok használni, köszönöm.)

    Bár jobban szeretném, ha nem csak utólag, szkripttel rakna bele tartalmat - hisz' az egész kálváriám abból indult eleve. Na de ezt már kisakkozom valahogy, most már elég lehetőségem van. Köszönöm a segítséget.

    Talán megpróbálom úgy, hogy üres lesz a div, és ha a (tartalomgeneráláshoz) szükséges JS-ek közül nem töltődött be bármelyik is, akkor behúzza oda az előre generált tartalmi részt.
    De ha a robot épp nem futtat JS-t, akkor ezt hogy oldod meg?

  • disy68
    aktív tag

    Sziasztok!

    Szeretném azt elérni, hogy ha egy adott szkript (külső JS fájl) nem tölt be, akkor az adott div tartalma kiürítésre kerüljön még feldolgozás előtt, sőt, ha lehet, be se töltődjön:
    https://jsfiddle.net/byvfcex0/

    Most egyelőre kb. csak így tudtam megoldani, ahogy a példában van, viszont a Network tabon látszódik, hogy ettől a div tartalmát még feldolgozza nyilván, a képet is betölti, és csak utána üríti - és ez így nem a legjobb.

    A háttér:
    Kliens oldalon JS által generálódik a div tartalma, viszont a Google nem (mindig) tölti be a hozzá szükséges JS-t, így indexeléskor nem lát tartalmat.
    Ezért most már szerver oldalon generálom le a tartalmi részt - viszont ez nem a legfrissebb, nem ugyanaz, mintha amikor a felhasználó betölti az oldalt, és a pár mp-es frissen (kliens oldalon) generált adatok ott vannak.

    Ezért betöltéskor szeretném azt elérni, hogy:
    - ha a szükséges JS nem lett betöltve (Google indexel), akkor ott van a szerver oldalon generált tartalom, 1 óránként frissítve,
    - viszont ha betöltött a JS (normál felhasználó), akkor a div tartalma eleve fel se legyen dolgozva, mert a JS úgyis kiüríti és friss tartalommal tölti fel. (Az a plusz pár kB-nyi HTML-rész pedig nem akkora vérveszteség.)

    Most is működik, viszont az első pár képet feleslegesen tölti be, mert azonnal kukázva lesz (a többi lazyload-os, szóval nem számít), illetve egy pillanatra látszódik is a tartalom, amit aztán a JS leszed, és ez nem tetszik.

    Meg lehet oldani, hogy a szkript betöltésének sikerességétől függően dolgozza fel a div tartalmát / vagy skippelje?

    Van B tervem is (és C is), dobom a div törlését, és a szerver oldalon generált tartalomra építek, csak sűrűbbre veszem a generálását, 5 percre, és ahhoz fűzöm hozzá a többi tartalmat. Csak ez sok módosítás, így ha megoldható az első változat, azt csinálnám.

    Köszönöm.

    Nekem is hasonló megoldás jutott eszembe, mint sztanozsnak. Alapból elrejted a generált tartalmat, a betöltendő js-ben jön a függvény, ami betölti az új content-et, amit ellenőrzöl, hogy létezik-e, ha nem akkor megjeleníted a generált tartalmat, ha igen, akkor meghívod a betöltött js-ből az új content letöltést, ami a végén meg is jeleníti a betöltött tartalamat.

    Ha a generált html-ben a képeket se akarod betölteni, amíg nem muszáj, akkor generáld úgy őket, hogy az src-t berakod data attribútumba amit akkor állítasz be, amikor nem töltött be js fájl.

    https://jsfiddle.net/8Lxcbmrn/

  • sztanozs
    veterán

    Sziasztok!

    Szeretném azt elérni, hogy ha egy adott szkript (külső JS fájl) nem tölt be, akkor az adott div tartalma kiürítésre kerüljön még feldolgozás előtt, sőt, ha lehet, be se töltődjön:
    https://jsfiddle.net/byvfcex0/

    Most egyelőre kb. csak így tudtam megoldani, ahogy a példában van, viszont a Network tabon látszódik, hogy ettől a div tartalmát még feldolgozza nyilván, a képet is betölti, és csak utána üríti - és ez így nem a legjobb.

    A háttér:
    Kliens oldalon JS által generálódik a div tartalma, viszont a Google nem (mindig) tölti be a hozzá szükséges JS-t, így indexeléskor nem lát tartalmat.
    Ezért most már szerver oldalon generálom le a tartalmi részt - viszont ez nem a legfrissebb, nem ugyanaz, mintha amikor a felhasználó betölti az oldalt, és a pár mp-es frissen (kliens oldalon) generált adatok ott vannak.

    Ezért betöltéskor szeretném azt elérni, hogy:
    - ha a szükséges JS nem lett betöltve (Google indexel), akkor ott van a szerver oldalon generált tartalom, 1 óránként frissítve,
    - viszont ha betöltött a JS (normál felhasználó), akkor a div tartalma eleve fel se legyen dolgozva, mert a JS úgyis kiüríti és friss tartalommal tölti fel. (Az a plusz pár kB-nyi HTML-rész pedig nem akkora vérveszteség.)

    Most is működik, viszont az első pár képet feleslegesen tölti be, mert azonnal kukázva lesz (a többi lazyload-os, szóval nem számít), illetve egy pillanatra látszódik is a tartalom, amit aztán a JS leszed, és ez nem tetszik.

    Meg lehet oldani, hogy a szkript betöltésének sikerességétől függően dolgozza fel a div tartalmát / vagy skippelje?

    Van B tervem is (és C is), dobom a div törlését, és a szerver oldalon generált tartalomra építek, csak sűrűbbre veszem a generálását, 5 percre, és ahhoz fűzöm hozzá a többi tartalmat. Csak ez sok módosítás, így ha megoldható az első változat, azt csinálnám.

    Köszönöm.

    Azt tudod csinálni, hogy alapból eltakarod / eltünteted a DIV-et és csak akkor jeleníted meg, ha a JS felülírta. Esetleg beleraksz egy 1x1-es IMG-t és az ALT szövegbe betöltöd azt, amit a DIV-be tennél és azt berántja a google.

  • martonx
    veterán

    Azt hogyan lehetne szépen kezelni, ha a többi elem csak később generálódik?
    Esetemben görgetés után, de a példában úgy csináltam, hogy 1mp után tölti be a 3. és 4. elemet:
    https://jsfiddle.net/vsecyd1t/

    Ha így oldom meg:
    https://jsfiddle.net/vsecyd1t/2/
    akkor az összes elemre újra megcsinálja. 4 elemnél még oké, de ha esetemben már a 200. elemnél jár a görgetésben, akkor az már pazarlás.

    Plusz a 3. és 4. elem betöltése után ha az 1. vagy a 2. elemre kattintok, duplán hívja meg a funkciót. (A másik alertet direkt kiszedtem, hogy egyértelmű legyen, hogy mikor hív duplán.)

    Hogyan lehetne ezt jól megoldani?
    Köszönöm.

    van ám olyan is, hogy removeeventlistener. Hm vagy még jobb megoldás, hogy megjelölöd azokat, amihez már adtál eventlistenert. És akkor elég csak azokhoz adni, amik még nem kaptak.

    Csak minimális változtatás kellett :D
    [link]

  • nevemfel
    senior tag

    Sziasztok!

    Adott az alábbi típusú HTML elem:
    <a id="category1"
    href="https://pelda.hu/category1"
    onclick="funkcio('categories', 'category1'); return false;">
    Category1
    </a>

    Ezeket szeretném megcsinálni úgy, hogy ne legyen a HTML kódban az onclick esemény:
    <a id="category1" 
    href="https://pelda.hu/category1">
    Category1
    </a>

    Ezt a kódot készítettem hozzá:
    for (var i = 0; i < categoriesArray.length; i++){
    var element = document.getElementById(categoriesArray[i]);
    element.addEventListener("click", function(e){
      funkcio(0, categoriesArray[i]);
      //alert('element: ' + element);
        e.preventDefault();
      });
    }

    Azt szeretném, hogy menjen végig a tömb összes elemén (amik az elemek ID-jai), majd mindegyikhez állítsa be, hogy kattintás esetén fusson le a funkcio() függvény (csak a példa kedvéért a név) paraméterként a tömbelemet megkapva. A preventDefault azért kell, hogy ilyenkor ne kövesse a href linkjét.

    Az alertet azért raktam bele, hogy lássam, mit csinál - és azt látom, hogy az összes elemnél a tömb utolsó elemét mutatja.

    Elég sok találat van rá neten (például ez), de eddig egyikkel sem sikerült megoldanom.
    Tudnátok segíteni benne? Köszönöm.

    for (var i=0; -t cseréld, for (let i=0; -re.

    Lehet, hogy a másik var-t is cserélni kell.

  • martonx
    veterán

    Sziasztok!

    Adott az alábbi típusú HTML elem:
    <a id="category1"
    href="https://pelda.hu/category1"
    onclick="funkcio('categories', 'category1'); return false;">
    Category1
    </a>

    Ezeket szeretném megcsinálni úgy, hogy ne legyen a HTML kódban az onclick esemény:
    <a id="category1" 
    href="https://pelda.hu/category1">
    Category1
    </a>

    Ezt a kódot készítettem hozzá:
    for (var i = 0; i < categoriesArray.length; i++){
    var element = document.getElementById(categoriesArray[i]);
    element.addEventListener("click", function(e){
      funkcio(0, categoriesArray[i]);
      //alert('element: ' + element);
        e.preventDefault();
      });
    }

    Azt szeretném, hogy menjen végig a tömb összes elemén (amik az elemek ID-jai), majd mindegyikhez állítsa be, hogy kattintás esetén fusson le a funkcio() függvény (csak a példa kedvéért a név) paraméterként a tömbelemet megkapva. A preventDefault azért kell, hogy ilyenkor ne kövesse a href linkjét.

    Az alertet azért raktam bele, hogy lássam, mit csinál - és azt látom, hogy az összes elemnél a tömb utolsó elemét mutatja.

    Elég sok találat van rá neten (például ez), de eddig egyikkel sem sikerült megoldanom.
    Tudnátok segíteni benne? Köszönöm.

    Hú, de ronda. Egy jsfiddle-t csinálj hozzá légyszi, hogy megírhassuk szépre.

  • martonx
    veterán

    Meg tudnátok mondani, kérlek, hogy JS-ben mi a helyes hivatkozási "forma" a szerveren lévő fájlokra?

    Jelenleg így használom (példának most még csak az Axios-t tudom felhozni, de ettől még jó példa):
    axios.get("../html/feed_item.html")

    HTML-ben pedig így:
     <script src="../js/script.js?v=1.0.0"></script>

    Tehát nem a teljes elérési út van megadva, csak a jelenlegi mappára viszonyítva, és ahhoz képest itt pl. ugye egy mappával visszább : ../

    Nem hiszem, hogy saját kútfőből csináltam volna így, és most randomra megnéztem pár weboldalt, és ott sem egységes. Ezeket láttam még:
    - teljes elérési útvonal (https://pelda.hu/js/script.js)
    - egy db /-jellel kezdve (/media/product/.....)
    - két db /-jellel kezdve (//stat.pelda.hu/script.js)

    Melyik a "helyes" (vagyis inkább ajánlott) módszer?
    Azzal amit jelenleg használok, most egy kis probléma adódott, ahogy új aloldalakat hoznék létre, mert mivel új almappákba kerültek, a szükséges fájlok már más útvonalon vannak az előzőhöz képest. Ezért szeretném kikérni a véleményeteket, melyik irányba változtassak.
    Nem tudom, van-e előnye/hátránya bármelyiknek is, de ti hátha tudjátok.
    Nekem a teljes elérési út lenne a leglogikusabb, mégis, találtam jó pár nevesebb weboldalt, ahol nem így van - és nem tudom az okát.

    Köszönöm.

    Ha egy url /-el kezdődik, akkor az jelenti azt, hogy a root url-hez képest.
    Azaz a helyes megoldás a "/js/script.j?v=1.0.0"
    A teljes elérési útvonalas megoldás is jó még, de ennek csak akkor van értelme ha pl. CDN-t használsz.
    A // kezdetű ugyanez, csak az megengedi mind a http, mind a https-t, egy időben divat volt, de http-t már senki nem használ, szóval értelmetlen.

  • martonx
    veterán

    Hú, akkor máris oda a sikerélmény. Ez gyors volt. :DDD
    Viszont ahogy nézem, lassú nettel (Lassú 4G emulálása) csinálja azokat a teszteket, és attól azért nem lehet csodát várni egy képeket (is) tartalmazó oldal esetében.
    De végig megyek mindenen, hátha valamit tudok még faragni.
    Köszönöm.

    No igen, ezért is írtam, hogy itt nézd. A böngészőben localhoston minden villámgyors :D
    Azért képeket is tartalmazó oldalnál lassú 4G emulálással is simán lehet 90 pont felett szerezni az igazi pagespeeden.

  • martonx
    veterán

    Meg is érte rendbe rakni:

    Bár még van mit csinálnom rajta, de legalább egy kis sikerélmény.
    Köszönöm a tanácsokat. :)

    Ne lighthouse-ban (böngésző F12) nézd, hanem a pagespeed weboldalán a google-nek: PageSpeed Insights (web.dev)
    És itt is igaziból mostanra egyedül a mobilos szám számít, a google már csak ezt veszi bele a rangsorolásba.

  • martonx
    veterán

    Köszönöm a tanácsot. :)
    A 800kB-nyi JS-t sikerült 250kB-ra összehúznom, és a felesleges CSS-eket is kigyomláltam, (eddig észre sem vettem, hogy ilyen rengeteg felesleges volt benne...) így a kezdeti 1MB-ból lett 650kB. Ami még így is sok, de majd innen folytatom.

    Viszont most már egyértelműen szóba áll velem a Google - legalábbis a fájlok mennyisége már nem zavarja. :)

    A server side renderingen sokáig agyaltam, hogyan lehet megoldani, de trükkös, mert dinamikus a tartalom (görgetés után tölt az újabb és újabb tartalom), és ezt így nem lehet szerver oldalon generálni.
    Arra gondoltam, hogy segítsem a SEO-t, pár percenként belegenrálom az index.html megfelelő részébe az aktuálisan legfrissebb 4 elemet (4-esével tölt görgetésnél), így az szerver oldalon lesz, és a Google is egyből látja. Aztán betöltésnél törlöm azt a div-et, és jön helyére egyből a friss.
    Ez a terv egyelőre - jobb több nap alatt sem jutott eszembe.

    Köszönöm a segítséget. :)

    Látod - látod :D
    Itt kezdődik a webfejlesztés. Cms fölé template-et minden hülye be tud húzni, az fölé minden hülye össze tud kókányolni valamit. Aztán meg megy a csodálkozás, hogy miért lett szar a végeredmény.
    Örülök, hogy te normálisan állsz hozzá.

  • martonx
    veterán

    Sziasztok!

    A Google Search Console-ban látom, hogy a Googlebot rendre kihagy random JS-fájlokat, amikor az oldalamat indexeli. (És .css és .jpg fájlokat is, de az nem érdekel most annyira.)

    A probléma az, hogy az oldal tartalmi részét a JS fájlok töltik fel, így amikor kihagyja őket, nem, vagy nem teljesen tölt be az oldal, így indexelés közben csak egy üres vázat lát.

    Keresem, mi lehet a jó megoldás rá.
    - Pár helyen azt írják, ha a fájlnevek sorrendjében tölti be a fájlokat, aztán amint elérte a limitet, hagyja a többit. Ezért ott azt javasolják, hogy a fontos JS fájlok mondjuk számokkal kezdődjenek. Pl. 01-fontos.js, 02-kevesbe-fontos.js, 09-abszolut-nem-fontos.js.
    Ennek viszont ellent mond, hogy legutóbb pl. a bootstrap.min.js fájlt hagyta ki, holott az szinte a legelső az ABC-sorrendben.
    - Máshol azt ajánlják, hogy össze kell vonni a JS fájlokat. Most 25 db JS fájlt használ az oldal, ezt amúgy a SEO checkerek rendszeresen szóvá is teszik. Ebből 9 db az enyém (a többi a HTML template-hez volt, és már abból is kiszedtem mindet, aminek a hiánya nem okozott hibát), ezeket össze tudom vonni, ha muszáj. Összesen amúgy 800kB ez a 25 JS fájl, az enyém ebből 100kB.
    Viszont máshol meg azt írják, ez (az összevonás) csak régen volt hatásos, most már néha lassíthatja is a betöltést. Mondjuk az a pár század mp pont nem érdekel, ha a másik oldalon meg az van, hogy a be nem töltött JS-ek miatt az oldal tartalmi része üresen marad az indexelésnél.

    Még a CSS fájlokat is összevonhatom, hogy minél kevesebb fájl legyen a végén. De nem tudom, hogy a Googlebot csak darabszám alapján hagy ki fájlokat, vagy a fájlméretet is nézi.

    Tudnátok ebben a témában tanácsot adni?
    PageSpeed, hátha mond valami hasznosat, amit én nem értek

    Köszönöm.

    Css és Js file-okat valóban érdemes összevonni (ezt hívják bundle-nek).
    Viszont ettől függetlenül a SEO legnagyobb barátja a server side rendering. Minden más, ami nem server side renderelődik, kétesélyes hogy megjelenik a google bot számára.
    800kbyte js, óriási. Ha a google bot valami css, js-t nem tud X másodperc (de ez inkább kisebb, mint 1) alatt betölteni, akkor inkább hagyja a fenébe, nincs ideje szarakodni a lassú weboldalakkal.
    Nem véletlenül írtam le, hogy nem kellene mindeféle szart behúzkodni kliens oldalra, mint pl. axios, amik csak totál feleslegesen növelik a bundle size-ot, és lassítják le az oldalt, rontják a pagespeedet. Cserébe legalább semmit sem adnak :D

  • disy68
    aktív tag

    Köszönöm a tanácsot.

    Átállítottam 1.1.1.1-re, és egy bő 10 percig próbáltam előhozni a lassulást, de nem sikerült.

    Viszont azt nem értem, hogy miért kellett az újabb DNS lookup?
    Mármint böngészek az oldalon egy ideje, így a DNS lookup a szerveremre nyilván már az eleje óta megvolt, másképp be se töltött volna.
    Aztán böngészek-böngészek, és egyszer csak belassul (előző screenshot), és írja, hogy megint volt egy lookup.
    Nagyon felületesek az ismereteim a témában, de nem úgy van, hogy X időre cacheli, hogy ez a domain ez az ip cím? És amíg él a cache, addig nem kérdezi újra.
    Most vagy ilyen rövidre van állítva a cache (kinél? szolgáltatónál?), vagy valami máshol mással van a baj?

    (Kérlek, javíts ki bármiben, amit rosszul tudok. Persze csak amennyire időd engedi. :) )

    Köszi.

    @martonx: De az akkor nem DNS Lookup-ként jelentkezne, hanem a kliens és szerver közötti kommunikácóban, a php által visszaadot értékekben. Erre látom is a számokat (F12 - Network alatt) a megfelelő axios-os hívásnál, de mind jó érték. (Persze ettől még belassulhat a szerver, de ez amit elkaptam és ennyiszer sikerült megismételni pont nem ez volt - legalábbis így látom, de simán tévedhetek, nagyon új ez még nekem.)

    Nem ismerem mélyen én se a témát, lehet, hogy a szolgáltatónál van valami hiba/rossz konfig, de az is lehet, hogy csak nálad lokál akadt össze valami és okozta a problémát és az új dns szerver miatt jött helyre a dolog

    Amíg ez nem jön elő tömegesen a felhasználóknál, addig nem ölnék bele túl sok energiát, hogy kiderítsem mi és hol csúszott meg.

  • martonx
    veterán

    Bocs a sok szövegért és a már 3. bejegyzésért egymás után, de közben a Network fül alatt ezt találtam:

    Ez már nyilván nem JS-téma, és máris nézek ennek is utána, de igazából még most látok ilyet először (közben ezt kezdem el olvasni hozzá: [link] ) , nem tudom, merre kezdjek neki a "javításnak". Esetleg szerver oldalon kell valamit átállítanom? Vagy ilyen a szolgáltató sebessége?
    Tudok ezzel valamit kezdeni?

    Szerintem csak hiszed, hogy a szerver gyors. Pontosabban időnként belassul, és ezt tapasztalod.

  • disy68
    aktív tag

    Kiszedtem belőle az első axios-t, de most is ugyanúgy előjön (már amikor), és most az eddigi második (most már első) axios-nál "üldögél" 2 mp-et.
    Szóval nem a fájllal van baja. De akkor mivel?

    edit: állítsd át a dns kiszolgálód címét pl. 1.1.1.1-re vagy 8.8.8.8-ra esetleg (gépen/routeren) ha így jobb, akkor net szolgáltatód dns feloldása lassú (lassúságot nem, de olyat tapasztaltam szolgáltatói dns szervernél, hogy nem tudott feloldani valamit)

    Nézd meg dev-tools (F12) network fülön, hogy pontosan meddig tartanak az egyes kérések vagy logold ki az összesnél, mikor indul és mikor jön válasz. Szerintem nem az "első" hívás tart sokáig, hanem az összes. Ellövöd a kéréseket egymás után és azok visszatérnek lassan, amiből azt látod, hogy az első lassú volt és ahhoz képest a többi meg gyors, mert async mennek a kérések. Persze így nulla kód mellett csak találgatni lehet.

  • Taci
    addikt

    Kiszedtem belőle az első axios-t, de most is ugyanúgy előjön (már amikor), és most az eddigi második (most már első) axios-nál "üldögél" 2 mp-et.
    Szóval nem a fájllal van baja. De akkor mivel?

    Bocs a sok szövegért és a már 3. bejegyzésért egymás után, de közben a Network fül alatt ezt találtam:

    Ez már nyilván nem JS-téma, és máris nézek ennek is utána, de igazából még most látok ilyet először (közben ezt kezdem el olvasni hozzá: [link] ) , nem tudom, merre kezdjek neki a "javításnak". Esetleg szerver oldalon kell valamit átállítanom? Vagy ilyen a szolgáltató sebessége?
    Tudok ezzel valamit kezdeni?

  • Taci
    addikt

    Sziasztok!

    Nem igazán tudom, miért, de néha kb. 2 mp-el megnő az egyes aloldalak/menüpontok (JS-sel generált tartalom) betöltése.

    Nem tudom megfogni, hogy pontosan mikor, mert sosem ugyanott, sosem ugyanakkor - de nagyon szeretném kideríteni az okát.
    Először arra gondoltam, az SQL query-m lassú, és amiatt tölt be lassabban néha az egy-egy eredmény.
    De megcsináltam egy dev aloldalt hozzá, ahol máshogy (optimalizáltabban) rakom össze a lekérdezést ugyanabból az adatabázisból, egymás mellé raktam a két oldalt (sima és dev), és ugyanazokat ugyanúgy töltöttem be, és ahol lassú volt az első, lassú volt a második is. Szóval nem a query a baja.

    Mivel produktív oldal, a logolást leszedtem, de most a deven a megfelelő helyeken visszakapcsoltam, és meglepő eredményt találtam (a logok így jönnek a konzolban sorrendben):

    (1) 16:06:49.994 showJS.js?v=1.0.4:176 Script (showJS) started.
    (2) 16:06:49.995 showJS.js?v=1.0.4:424 Calling first axios
    (7) 16:06:49.997 showJS.js?v=1.0.4:733 Script (showJS) finished.
    (3) 16:06:51.465 showJS.js?v=1.0.4:429 titleHTML (axios.get)
    (4) 16:06:51.494 showJS.js?v=1.0.4:551 itemHTML (axios.get)
    (5) 16:06:51.604 showJS.js?v=1.0.4:557 frontend.php (axios.get)
    (6) 16:06:51.606 showJS.js?v=1.0.4:640 Displaying results.

    Az elején a számok (pl. (1)) azt jelzik, milyen sorrendben következnek a console.log-ok a szkirptben.
    Aztán az időbélyegző. Itt akadt meg a szemem azon, hogy két közvetlen egymás alatt lévő lépés között 2 mp időkülönbség van:
    (2) 16:06:49.995 showJS.js?v=1.0.4:424 Calling first axios
    (3) 16:06:51.465 showJS.js?v=1.0.4:429 titleHTML (axios.get)

    Tehát a 424. sorban logoltatom, hogy most jön az első axios.get,
    a 426. sorban ez lefut,
    a 429.-ben pedig kiíratom a visszakapott választ: console.log("titleHTML (axios.get): " + response);

    Na ennek a műveletnek néha 2 mp-re van szüksége, holott egy 1kB-os fájlról van szó...
    Néha gondolkodás nélkül behúzza, máskor meg ott pörög a kis loader 2 mp-ig, mire végre hajlandó csinálni. Nem kell csinálnia a fájllal semmit, csak a benne lévő kemény 4-5 sornyi HTML-kódot visszaadni.
    Az a fura még, hogy utána hív ugyanígy egy másik html fájlt pont mellőle (4. lépés), aztán meg szerver oldalon végez több bonyolult műveletet is (köztük az SQL-lekérdezést és annak kiértékelését is), és annak az eredményét adja vissza (szintén axios a közvetítő közeg) az 5. lépésben, és ennek a kettőnek együtt is bőven elég pár század mp.

    A szerver gyors, ez látszik az SQL-es részből is, SSD-n is van, szóval azt kizárnám.
    Esetleg az axios-szal lenne a baj? De ha igen, mi?

    Az első axios:
    axios.get("../location/title.html")

    A második:
    axios.get("../location/item.html")

    A harmadik:
    axios.get("../location/frontend.php?a=...&b=...)

    Van tippetek, mi lehet itt a bibi?
    Persze átrakhatnám JS-be a HTML tartalmát, de azért az nem oké, hogy egy 1kB-os fájl akassza meg a rendszert. Plusz lehet, az axios-szal van a baj (vagy bármi mással), és akkor a következő fájlnál lassulna be.

    Hátha ti láttok ebben valami javítható dolgot, mert nekem nem áll össze, mi ez a 2mp-es delay.

    Köszi!

    Kiszedtem belőle az első axios-t, de most is ugyanúgy előjön (már amikor), és most az eddigi második (most már első) axios-nál "üldögél" 2 mp-et.
    Szóval nem a fájllal van baja. De akkor mivel?

  • Mr. Y
    őstag

    A rendszeridőt használja, szóval ha rosszul van beállítva az idő a kliensen (manapság azért ezt már nem kézzel állítjuk be), akkor rossz értékkel fog dolgozni.

    Köszi az infót. És be lehet állítani valahogy, hogy ne a kliens adataival dolgozzon?
    Ugyanis roppant fontos volna nekem, hogy ténylegesen másodpercre pontosan a helyes időt nézze a műveletekhez

  • Taci
    addikt

    Sziasztok!

    Van egy Windows és Android alatti böngőszőkben jól működő keresőm, ami viszont Safarin nem 100%-os.

    Első körben kezdeném mondjuk azzal, hogy nem ismeri fel a keyup eventet:

    elementMainSearch.addEventListener("keyup", function(event) {
      console.log('Typing to searchbox.');
    }

    Ez például csak akkor ír a konzolba Safari alatt, ha Shift vagy Ctrl gombokat nyomok. Semmi másra nem reagál. A keresőmezőbe persze beírja amit írok, csak a lenyomáshoz (felemeléshez) kötött funkciókat nem hívja meg.

    Hogyan lehet ezt megoldani? Hátha ti már tapasztaltátok (és megoldottátok ezt).

    Aztán később van egy feltétel, ahol az Enter leütését vizsgálom:
    if (event.keyCode === 13) {}
    Nem tudom, abba is belerondít-e, odáig még "nem jutott el", de inkább már nem írok külön bejegyzést erről.

    Köszi!

    Annyira haladtam a témában, hogy valamiért a keyup-ot nem szereti, viszont a keydown-nal és a keypress-szel nincs baja. (Fórumbejegyzésekben találtam ezt az infót, kipróbáltam, és valóban.)

    Viszont azért használtam keyup-ot, mert az esemény után figyeltem, hogy változik-e a keresőmező tartalma (nem-e marad üres), és ha karatert ír be a user (tehát nem csak belekattint, és nyom egy shift-et), akkor megjelenik a mező törlése gomb.

    var elementMainSearch = document.getElementById("mainSearch");
    elementMainSearch.addEventListener("keyup", function(event) {
      var elementMainSearchValue = elementMainSearch.elements[0].value;
      console.log('elementMainSearchValue: ' + elementMainSearchValue);
      if (elementMainSearchValue != ""){
        //törlés gomb megjelenítése
      }
    }

    Így ha beírtam, hogy q, akkor a konzolba kiírta, hogy elementMainSearchValue: q, és megjelent a törlés gomb.

    Viszont így, hogy Safarival ez valamiért nem működik, muszáj vagyok keydown-ra vagy keypress-re cserélni a keyup-ot.
    Ezekkel viszont az a baj, hogy az eventjük után még nem változik a keresőmező tartalma.
    Tehát a fenti kód keydown-nal vagy keypress-szel ezeket az eredményeket adja:
    q --> elementMainSearchValue:  
    qw --> elementMainSearchValue: q
    qwe --> elementMainSearchValue: qw
    stb.

    Így ha csak 1 karaktert ír be a user a keresőmezőbe, nem lesz aktív a gomb, mert kell mellé még egy leütés.

    Hogyan tudom szerintetek ezt megoldani?
    Akár más struktúrával is. (Elindultam a beírt keycode-ok vizsgálatával (Ctrl - 17, Shift - 16, Tab - 9, Enter/Return - 13, Option - 18, Command - 91 stb.), de ott túl sokat kell lekezelni (minden gombot, ami szám vagy betű), az a megoldás nem tetszik.)

    UPD.:
    Az input event lesz a jó, úgy látom.

  • Taci
    addikt

    Sziasztok!

    Van egy Windows és Android alatti böngőszőkben jól működő keresőm, ami viszont Safarin nem 100%-os.

    Első körben kezdeném mondjuk azzal, hogy nem ismeri fel a keyup eventet:

    elementMainSearch.addEventListener("keyup", function(event) {
      console.log('Typing to searchbox.');
    }

    Ez például csak akkor ír a konzolba Safari alatt, ha Shift vagy Ctrl gombokat nyomok. Semmi másra nem reagál. A keresőmezőbe persze beírja amit írok, csak a lenyomáshoz (felemeléshez) kötött funkciókat nem hívja meg.

    Hogyan lehet ezt megoldani? Hátha ti már tapasztaltátok (és megoldottátok ezt).

    Aztán később van egy feltétel, ahol az Enter leütését vizsgálom:
    if (event.keyCode === 13) {}
    Nem tudom, abba is belerondít-e, odáig még "nem jutott el", de inkább már nem írok külön bejegyzést erről.

    Köszi!

    Can I Use szerint pedig mennie kellene... [link]

  • nevemfel
    senior tag

    Na ez teljesen jogos. :D Akkor módosítok én is. :)

    @nevemfel: De itt nem csak arról szól a dolog, hogy ha a "?v=1.0.0" lett cache-elve, akkor ha az a verzió át van írva bármi másra (tehát nem egyezik), akkor tölti le újra? Mármint a fájlokba ez nem néz bele, hogy abban milyen verzió van benne, hanem ez itt a html fájlban a változtatás csak kvázi egy flag, hogy halló, kliens, töltsd el újra.
    Vagy rosszul használom? :B

    A módszer ismert ( [link] ), a probléma meg az, hogy neked kell kézzel verzióznod az összes belinkelt forrásfájlt (css, js, img). Ha csak egy-két fájlról van szó, nem probléma, ha 15-ről, akkor, jó, ha sok szabadidőd van.

    A másik lehetőség, hogy valami build toolt (pl. babel) használsz a css, js generáláshoz, ami megoldja, hogy ha a fájlok változnak, akkor a html-be beszúrt verziót automatikusan frissíti. De ez már haladó szint.

  • martonx
    veterán

    Na ez teljesen jogos. :D Akkor módosítok én is. :)

    @nevemfel: De itt nem csak arról szól a dolog, hogy ha a "?v=1.0.0" lett cache-elve, akkor ha az a verzió át van írva bármi másra (tehát nem egyezik), akkor tölti le újra? Mármint a fájlokba ez nem néz bele, hogy abban milyen verzió van benne, hanem ez itt a html fájlban a változtatás csak kvázi egy flag, hogy halló, kliens, töltsd el újra.
    Vagy rosszul használom? :B

    Jól használod. @nevemfel csak azt jegyezte meg, hogy ez ugyan egy tök jó módszer, csak nagyon törékeny, mert nagyon könnyű elfelejteni a huszonyolcadik file-ban is átírni a verziószámot. Vagy pedig külön automatizmust érdemes rá készíteni.

    A böngésző teljes url alapján cache-el. És ezt használja ki ez a módszer. Az már csak, nekünk embereknek fontos, hogy olvasmányos ?v=1.0.0 legyen az url vége. Ez itt lehetne ?myversion=kiskutya is a böngészőnek édesmindegy. Ezt becacheli, és amíg pontosan ugyanez az url kell, addig cacheből szedi elő, amit kell. Ennyi.

  • nevemfel
    senior tag

    Javítsatok ki, ha tévedek,

    de ezzel a megoldással ezeket a fájlokat újra és újra letölti a kliens. Tehát hiába nem változtattál semmit rajtuk 1 éve, a kliensek minden alkalommal újra és újra letöltik.
    Persze ez a korlátlan adatforgalom világában már nem akkora probléma, de jó figyelni erre is.

    Itt a fórumon valamelyik topikban ajánlottá(to)k ezt a megoldást:

    <link rel="stylesheet" href="/fajlmappa/style.css?v=1.0.0">
    <script src="/fajlmappa/javascript.js?v=1.0.0"></script>
    stb.

    Ez a html kódban van, és amíg nem változtatsz a verziószámokon, nem tölti le újra, cache-ből használja, ha tudja. Ha változtatsz a fájlok tartalmán, akkor pedig itt is verziót emelsz, így a kliens az új verziót tölti le és használja.

    Hátha ez (is) hasznos lehet.

    Ez a módszer akkor jó, ha létezik valamiféle automatizmus a verziószám kezelésre. Kézzel elég macerás minden fájlt megfelelően verziózni, rádaásul könnyű elfelejteni.

  • martonx
    veterán

    Javítsatok ki, ha tévedek,

    de ezzel a megoldással ezeket a fájlokat újra és újra letölti a kliens. Tehát hiába nem változtattál semmit rajtuk 1 éve, a kliensek minden alkalommal újra és újra letöltik.
    Persze ez a korlátlan adatforgalom világában már nem akkora probléma, de jó figyelni erre is.

    Itt a fórumon valamelyik topikban ajánlottá(to)k ezt a megoldást:

    <link rel="stylesheet" href="/fajlmappa/style.css?v=1.0.0">
    <script src="/fajlmappa/javascript.js?v=1.0.0"></script>
    stb.

    Ez a html kódban van, és amíg nem változtatsz a verziószámokon, nem tölti le újra, cache-ből használja, ha tudja. Ha változtatsz a fájlok tartalmán, akkor pedig itt is verziót emelsz, így a kliens az új verziót tölti le és használja.

    Hátha ez (is) hasznos lehet.

    A kettőt összekombinálni is lehet ám :)
    Pl. csak a html file-ra beállítani, hogy mindig töltse le a böngésző. A többi file-t pedig hagyni a böngésző a megadott verzió szám alapján eldöntse, hogy le kell-e töltenie.

    Mert a nálad lévő módszer tök jó, de mi van akkor, ha maga a html file cachelődött be a böngészőben? Akkor hiába raksz ki egy új html file-t, amiben megemelted a css, js verziókat, ha erről a böngésző mit sem fog tudni, és vígan használja az előző html-edet, benne a régi verziójú css, js hivatkozásokkal? :D

  • Taci
    addikt

    Van erre megoldásom a saját kódomból, amint saját gép közelében leszek, bemásolom.
    Ahogy martonx is írta, key(-press, -up stb.) eseményekre működik.

    Valami ilyesmivel kellene kezdeni:

    var elementTest = document.getElementById("test");
    elementTest.addEventListener("keyup", function(event) {
      if (event.keyCode === 188) {
        //vessző lett nyomva
      }
    }

    Innen szedtem ki, hogy a vessző keycode-ja a 188.

    A keyup akkor "ugrik", ha felengeded a billentyűt. Ha neked már az is kell, amikor lenyomja, akkor az a keydown lesz.

  • Mr. Y
    őstag

    Szia!

    Direktben a JS szerintem nem fog tudni hozzáférni a szerveren lévő tartalomhoz. Ehhez kell a PHP és a JS közötti kapcsolódás (második része a kérdésednek).
    Én erre az Axios-t használom: [link]
    (Használhatsz Ajaxot is, de sokmindenre kell figyelni később, ha "élesben" akarnád használni, úgyhogy jobban jársz, ha már eleve az Axios-szal kezdesz. Ajax: [link] )

    Írnod kell egy .php szkriptet, ami listázza a mappa tartalmát, és ezt az adatot visszaadja Axios-on keresztül a JS-nek.

    (Ha a -megfelelő- gép mellett leszek, segítek majd az Axios-ban, ha kell, addig nézd átt a linkelt oldalt, beszédesek a példák benne.)

    Köszönöm a linkeket és a segítő szándékot, de ha ezen kívül nincs más opció, akkor hanyagolom. Alapelvem, hogy nem használok más által kidolgozott kódot. :R

  • laracroft
    senior tag

    Én nem bonyolítanám, két for ciklussal oldanám meg. Összedobtam neked egy jsFiddle-t hozzá: [link] (konzolba ír - F12)

    Köszi ;)

  • laracroft
    senior tag

    Én nem bonyolítanám, két for ciklussal oldanám meg. Összedobtam neked egy jsFiddle-t hozzá: [link] (konzolba ír - F12)

    Köszi ;)

  • Taci
    addikt

    Nem lehet, hogy az a szöveg még a W3-as oldalról került oda? :D Mert nekem sem megy a jsfiddle-ről. Először nekem is ott volt a szöveg, aztán arra gondoltam, lehet, csak a W3-as vágólapos másolásról, szóval másoltam valami más szöveget rá, aztán vissza a jsfiddle-be, és az előzőleg másolt tartalmat illeszti be vágólapról.

    @Mr. Y: Nekem pont van ilyen fícsör a weblapon, működik is szépen, bemásolom majd, amint gépközelben leszek.

    Parancsolj: [link] (anno én is valahol stackoverflow-n találtam)

  • Mr. Y
    őstag

    Nem lehet, hogy az a szöveg még a W3-as oldalról került oda? :D Mert nekem sem megy a jsfiddle-ről. Először nekem is ott volt a szöveg, aztán arra gondoltam, lehet, csak a W3-as vágólapos másolásról, szóval másoltam valami más szöveget rá, aztán vissza a jsfiddle-be, és az előzőleg másolt tartalmat illeszti be vágólapról.

    @Mr. Y: Nekem pont van ilyen fícsör a weblapon, működik is szépen, bemásolom majd, amint gépközelben leszek.

    Köszönöm

  • Mr. Y
    őstag

    Hmm. Én a tabokat kiszedem, így arra a trim()-et használom, és nem direktben azt keresem. Az input mezőt pedig csak egy sorosra állítottam (kereséshez), így nincs új sor (bemásolva sem).

    De az előzőben leírtakat találok máshol is: [link]

    enteredText = textareaVariableName.val();
    numberOfLineBreaks = (enteredText.match(/\n/g)||[]).length;
    characterCount = enteredText.length + numberOfLineBreaks;

    De ezt tényleg ki kell próbálni. Remélhetőleg ezek közül valamelyikkel működni fog.

    Annyi a pontosítás kedvéért, hogy nem input hanem textarea. A másik pedig, hogy számomra fontos, hogy a bemásolt szöveg tartalmazza az új sorokat és a tabokat, mert azok határolják nekem a szöveget, így azzal szeretnék dolgozni. Egyelőre az eddig linkelt dolgokkal nem értem el eredményt, de próbálkozom.

  • Mr. Y
    őstag

    Az első részhez próbáld ki a charAt() függvényt. [link]

    A másodiknál a forrástól is függ, mit kellene használnod, mert nem mindegy, hogyan szerepel benne az új sor.

    Esetleg RegExp?
    Tab: [link]
    New line: [link]

    De új sor lehet még a \n, \r, vagy a \n\r is, nem is beszélve a <br>-ről.

    Vagy ezek olyan dolgok, amiket te is kipróbáltál már? Csak mert az első pár Google-találat.

    Nem volt még alkalmam próbálni, így megnézem ezeket, hátha. A lényeg, hogy pl nyitsz egy jegyzettömböt, írsz bele pár dolgot, nyomsz pár tabot és pár entert, majd ezt a szöveget kimásolod és beilleszted az input mezőbe.

  • atyca
    senior tag

    Ezt a kódodból másoltad direktben?

    Mert AsStringvalue van ide írva, de a valueAsString a helyes.

    A szerkesztőből másoltam.
    Abban nem volt benne az AsString, véletlenül rossz helyre írtam itt.

  • atyca
    senior tag

    Erre sajnos nem látok rá, ehhez használnom kellene a programot.

    De az első linkben lévő megoldás ugye ez:
    if (event.target.value!="Off") {
         this.getField("address_secondary").value = this.getField("address_main").valueAsString;
    }

    Gondolom, a változóneveket átírtad a megfelelőekre.

    Illetve az sem mindegy, hogy .value-t vagy .valueAsString-et használsz.
    With valueAsString you know what you're getting back, ie a string. With value you don't know. It can be a string, or a number or even a boolean or an array. JavaScript is very flexible and does automatic type casting for you, but it's better to know what you're working with.

    Bár igazából egy mező tartalmát másolod, ott ez a példa is jó kellene hogy legyen.

    Nézd meg, hogy jó mezőneveket adtál-e meg (az "address_secondary" (ide másol) és az "address_main" (innen) helyett. Hova <-- Honnan.).

    if (event.target.value!="Off") {
    this.getField("HONNAN").value = this.getField("LAKCÍM").AsStringvalue;
    }
    Jól gondolom, hogy hiányzott egy kapcsos zárójel a végéről?
    Így legalább nem dobott hibaüzit, de sajnos nem működik.
    Próbáltam AsString nélkül is.
    Próbáltam a másik megoldás szerint gombra, egérkattintásra rakni, az sem jó.

  • atyca
    senior tag

    Örülök, hogy működik, nagyon szívesen. :)

    @Mr. Y: Betölteni betölt, viszont ahogy sztanozs is írja, egy bizonyos időn túl nem engedi futni a szkripteket. (Amúgy ha JS-tel szeretnél számoltatni, úgy érdemes, hogy a rendszeridőhöz mérten számolsz, mert ha a háttérben le is áll a szkript, amikor aktív lesz, és folytatódik, "jó helyen lesz", hiszen a rendszeridőhöz képest számol, ami mindig adott.)

    Most visszarakva egy gombra a három funkciót (ellenőrzés-küldés-törlés) is működik, fene se érti....
    Más:
    Egy gombra raknám X mező szövegének másolását Y mezőbe.
    Találtam? két megoldást is, de nálam nem működik, v.sz. én bénázhatok.
    [link]
    [link]

  • Mr. Y
    őstag

    Nekem az oldal tartalmát 99%-ban JS generálja (JS --> PHP --> SQL --> PHP --> JS --> HTML), és ha háttérben is nyitom (pl. linkjére középső egérgomb), akkor is betölt mindent.

    Ezt a részt már elég rég csináltam, nem emlékeztem elsőre, hogy hogyan tölt be, de most megnéztem, az index.html-ben van egy <script>elsoBetoltes();</script> rész (más néven persze), az indít el minden mást. Animációt is hoz magával (betöltő), felteszem, az is gond nélkül lefut, legalábbis se logban se konzolban nem látok hibát.

    Viszont a külső plugineket (pl. CookieBot banner-e) tényleg csak akkor, ha aktív lesz a böngésző tabja.

    Nem tudom, csak egy tipp, de nem lehet, hogy "rossz helyen" (időben) van hívva az animáció, az oldal betöltése után?
    Logold, hol tölt be az oldal, és azt is, hol indul el az animáció, és nézd meg, nincs-e ez utóbbi a teljes betöltés után indítva.
    window.onload = function() { 
        console.log('The page has fully loaded');
    }

    Jobb ötletem nincs erre sajnos most, nálam ilyen még nem fordult elő (ezek szerint talán csak szerencsém volt).

    Röviden, hogyan működik:

    Adott egy HTML felület, mely így indít:
    <body onload="engine()">
    Az engine() JS csinál mindent. Az adatokat JSON fájlokból szedi, Cooke-kat nem használok. Az animáció, melyet egy interval() vezérel, előbb fut le, mint a betöltés.

    A JS kinézete:

    function engine() {
    animation();
    uploaddata();
    }

    Szerk: a JS is külső fájl, de még a Body előtt, a Head-ben kerül behívásra

  • Mr. Y
    őstag

    Örülök, hogy működik, nagyon szívesen. :)

    @Mr. Y: Betölteni betölt, viszont ahogy sztanozs is írja, egy bizonyos időn túl nem engedi futni a szkripteket. (Amúgy ha JS-tel szeretnél számoltatni, úgy érdemes, hogy a rendszeridőhöz mérten számolsz, mert ha a háttérben le is áll a szkript, amikor aktív lesz, és folytatódik, "jó helyen lesz", hiszen a rendszeridőhöz képest számol, ami mindig adott.)

    Van egy betöltő animáció. Amit ha elindít és ellépek, képes megállítani. Ha pedig _blank elven nyitom meg, el sem indul, csak ha rámegyek. Illetve, a tartalom feltöltése is egy JS segítségével megy véghez, külső forrásból
    Végülis számomra nem probléma, ha a felhasználókat nem zavarja.

  • atyca
    senior tag

    Google-ben van egy ilyen találat a saját topikjában: [link]

    var emptyFields = [];
    for (var i=0; i<this.numFields; i++) {
    var f= this.getField(this.getNthFieldName(i));
    if (f.type!="button" && f.required ) {
      if ((f.type=="text" && f.value=="") ||
        (f.type=="checkbox" && f.value=="Off"))
          emptyFields.push(f.name);
        }
    }
    if (emptyFields.length>0) {
      app.alert("Error! You must fill in the following fields:\n" +
        emptyFields.join("\n"));
    }

    For anyone else who is trying to implement this heres how:
    Create a button
    Right click the button and go to properties -> Actions tab
    Trigger:Mouse Up
    Action: Run JavaScript
    -> Add...
    Copy and paste Giliad D's code
    ->ok -> close
    Select the fields you want required by right clicking the fields and selecting the "Set as Required Field" option
    Save and done!

    De találtam egy videókat is: [link] [link]

    Ilyesmi keresésekkel (Google-ön és YouTube-on is) még sok más találatot is kapsz:
    adobe reader dc pdf check if field is empty javascript
    adobe reader dc pdf form validation

    Remélem, így már meglesz.

    :R
    Napok óta túrom a netet, persze nem az Adobera kihegyezve.
    Nem gondoltam, hogy ez külön világ....
    Még pallérozom az elmémet, aztán ha nem megy - így 56 év környékén már nem vagyok olyan befogadó képes :W - megpróbálom valamelyik informatikusunkat becserkészni ezügyben.

  • atyca
    senior tag

    Hú, hát ez meg mi? o.O

    Akkor ez a gombletiltós dolog nem jó ide, ha műveletet csak a gomb lenyomásához tudsz társítani (mert inaktivált gombot nehéz lenyomni :D).

    Itt talán így lehet akkor megoldani:

    A mezőknek és a gombnak is külön változónevek kellenek, pl.:
    mezoNev, mezoEmail, mezoTelefonszam, kuldesGomb

    Illetve betöltéskor egyből tiltani a küldés gombot:
    document.getElementById("kuldesGomb").disabled = true;

    A mezőkbe történő begépeléskor futtatni kell egy szkriptet, ami azt nézi, hogy ha az összes (többi) mezőben már van érték, akkor aktívvá teszi a küldés gombot
    (...("kuldesGomb").disabled = false; ).
    Így addig, amíg nincs minden mező kitöltve (nincs benne legalább 1 karakter), inaktív marad a gomb.

    Biztos van olyan vezérlő esemény is, amit ki tudsz választani, ami akkor futtat kódot, ha egy mezőbe gépelni kezdesz. Oda valami ilyesmi szkript kell:

    Ha a mezoNev-nél állítod be, akkor a többit kell figyelni, hisz' ennél a szkript eleve csak akkor aktiválódik, ha beleírsz valamit, kvázi a szkript futtatásakor nem lesz üres. És ugyanezen elven a többinél is.
    //mezoNev
    if ((document.getElementById("mezoEmail").value.length > 0) &&
        (document.getElementById("mezoTelefonszam").value.length > 0)){
      //gomb deaktiválásának megszüntetése
        document.getElementById("kuldesGomb").disabled = false;
    }

    Így ha írsz a mezoNev-be, és van tartalom a mezoTelefonszamban, de nincs a mezoEmail-ben, akkor a gomb inaktív marad.
    Aztán amint írsz a mezoEmail-be is, már a másik kettőben is lesz adat, tehát aktiválja a gombot.

    De amúgy ez a screenshotolt tool eléggé megbonyolítja (számomra), sokkal egyszerűbb és gyorsabb lenne simán csak kódban. Sokkal több lehetőséggel. Pl.: [link] Itt ha úgy kattintasz a Küldés gombra, hogy nem írtál be semmilyen adatot, akkor szól, hogy kötelezően kitöltendő mező (ami neked itt is jól jönne).
    Bár ezt most is beleépítheted (ha van hova):
    document.getElementById("mezoNev").required;
    document.getElementById("mezoEmail").required;
    document.getElementById("mezoTelefonszam").required;

    De hátha be tudod állítani amiket írtam, lesz mindre lehetőség, és akkor jó lehet.

    Nem csak ez az egy lehetőség van a gombnál.
    Van pl. ez is, és több is hozzáadható

    Esetleg így valahogy?

  • atyca
    senior tag

    Tedd alap esetben inkatívvá a gombot addig, amíg nem teljesült minden feltétel a küldéshez.

    document.getElementById("kuldesGomb").disabled = true;

    És ezt hova?
    Én ide gondoltam, de így nem működik....
    Gomb/Tulajdonságok/Műveletek

    Ehhez a vezérlő eseményhez adjam a küldés-törlést is, vagy azokat a felengedéshez párosítsam?
    Vagy eleve rosszul csinálom.......
    /Esetleg ezt a kötelezően kitöltendő mezőkhöz kellene adni?/
    (Ha átdobnám privátba a fájlt, ránéznél?)

  • atyca
    senior tag

    Tedd alap esetben inkatívvá a gombot addig, amíg nem teljesült minden feltétel a küldéshez.

    document.getElementById("kuldesGomb").disabled = true;

    :R

  • atyca
    senior tag

    Engem az Adobe-dologgal zavartál be teljesen. De ha attól elvonatkoztatok, akkor kb. erre van szükséged: [link] (az oldal közepe környékén betölt egy kipróbálható példát is rá)

    Bocsi, és :R .
    (de tényleg azzal készítettem az űrlapot :) )
    Ez irányú tudásom a nulla felé konvergál....
    A problémát az okozza, hogy van egy küldés gomb, ami az egérgomb lenyomásakor küld és, és felengedéskor törli a mezők adatait.
    Sajnos csak ezután érkezik figyelmeztetés a nem kitöltött kötelező mező(k)ről, lehet kitölteni újra.
    Valahogy azt szeretném megoldani, hogy a küldés - törlés ne valósulhasson meg, ha nem teljes az ürlap.
    Az elképzelés, hogy a kurzor gomb fölé vitelekor lefutna egy ellenőrző script.

  • Mr. Y
    őstag

    Egy egyszerű példával:

    var a = 1;
    var b = 2;
    var c;

    function osszead(szam1, szam2){
      var osszeg = szam1 + szam2;
      return osszeg;
    }

    c = osszead(a, b);

    Ekkor c érték az osszead függvény által visszaadott (return) érték lesz, azaz 3.

    Egy függvény vagy ad vissza értéket, vagy nem. Ha ad, akkor azt a return-nel teszi.

    Köszönöm szépen, tiszta, egyszerű, érthető :R

  • Mr. Y
    őstag

    Egy sima if-else ág?

    Ahova azonnalit akarsz, oda nem kell a
    event.preventDefault();

    és nem kell az animate sem:

    $('html, body').animate({
            scrollTop: $(hash).offset().top
          }, 800, function(){
       
            // Add hash (#) to URL when done scrolling (default click behavior)
            window.location.hash = hash;
          })

    Próbáld ki abban a példában a linken, kommenteld ki ezeket a részeket, és máris egyből ugrik. Tehát meg lehet csinálni (akár saját függvényben paraméterezve is), hogy ahol akarod, ott finoman gördüljön (legyen benne a fenti 2 rész), ahol pedig nem, azonnal ugorjon (ott a fenti 2 rész ne legyen benne).

    Köszönöm, megpróbálom akkor így.

    Egyébként: iOS alatt futó Google Chrome böngészőben miért nem működik az animált görgetés? Itt bármit csinálok, csak azonnal ugrik.

  • Mr. Y
    őstag

    Itt pont egy ilyen példa van: [link] (Cross-browser Solution alatt)

    Ezt néztem én is, de ez nem az, amit keresek, Itt mindkét esetben "Smooth" a mozgás. De nekem olyan kellene, ahol az egyik azonnali, mint amikor nincsen paraméterezve.

  • Mr. Y
    őstag

    <button onclick='az'>Katt ide</button>
    ehelyett használd a következőt:
    <button onclick='az();'>Katt ide</button>

    Oké, én ezt nem értem. Megcsináltam így, JSFiddle-ben tökéletesen működik. De Ctrl+C Ctrl+V -vel beraktam a szükséges fájlba és nem működik..., továbbra is azt írja a Console.log
    Minden esetre, köszönöm a megoldásod

  • sztanozs
    veterán

    XSS elleni védelemben kérnék segítséget/tanácsot.

    Egyelőre csak 1 user inputos rész van az oldalon, a keresőmező. Ezt jelenleg így kezelem:

    - Kliens oldalon:
    strSearch = strSearch.replace(/&|!|\?|%|\*|\+|-|=|<|>|\(|\)|\[|\]|{|}|"|'|\||\/|\\|\^/g,"");
    Tehát kiszedek belőle minden speciális karaktert. (Aztán még pár feldolgozó művelet, mielőtt szerver oldalra át lenne küldve.)

    - Szerver oldalon:
    $strSearch=htmlspecialchars($_GET["searchString"], ENT_QUOTES, 'UTF-8');
    Aztán SQL-nek paraméterként vannak átadva a keresőszavak.

    Tehetek még ennél többet? Kell egyáltalán? Én úgy látom, ezekkel a lépésekkel a keresőmezőre vonatkozólag le van védve XSS (és SQL Injection) ellen is.

    Viszont ha rosszul látom, kérlek, javítsatok ki.

    ----------

    Illetve később majd lesz:
    - felhasználókezelés (tehát mezők felhasználónévnek, jelszónak, email címnek stb.)
    - kommentelés

    Oda ez a megoldás viszont már egészen biztosan kevés lesz.
    Nem akarok előre szaladni, előbb az legyen kész, amivel indulni akarok, de mivel egy téma (XSS, Cross Site Scripting), így azért ez is szem elé került.

    És hogy ezek a funkcióim is le legyenek majd védve, úgy láttam, kelleni fog egy "user input sanitizer". Utána olvasva nem egy egyszerű téma - vagy csak rossz/régi/bonyolult találatokat néztem.

    Furcsáltam, hogy nincs rá beépített megoldás, amikor is ezt találtam:
    Sanitizer.sanitize()
    Viszont ez még valami nagyon új feature lesz, egyelőre csak teszt változatban.

    Talán majd az encodeURI() / decodeURI() (Component) lehet majd hasznos.
    Na de majd ha odaértem.

    Az első részre ha tudnátok tanácsot/véleményt adni, azt megköszönném.

  • martonx
    veterán

    Nem akartam kókányolósra, csak az alap lekérdezésen túli második lekérdezés, ami visszaadja ezt az adatot, amivel aztán haladnom kell tovább, annyira belassította az első betöltődést, hogy ki kellett vennem belőle, mert tökre elrontotta az élményt (sokáig nem volt tartalom). És a második lekérdezés adatára csak sok-sok scrollozás után volt szükség, így gondoltam, ráér később is. És onnan tolta magával a többi dolgot.
    (Lehet, csak túlgondolom amúgy, és olyan esetet próbálok megoldani, amit amúgy nem is kellene...)
    De már annyira nyakatekert az egész, hogy visszamegyek az alaphoz, és hagyom ezt az időeltolósdit, mert annyi esetet kell lekezelni, hogy ennyit nem ér az egész.
    Nekikezdtem amúgy a setInterval-os clear-es megoldásnak is, de aztán valamiért a timeout-ossal folytattam.
    De inkább vissza az elejére, mert ez így már nem szép (és közel sem hatékony).
    Köszi.

    async - await, kódszervezés, átgondolás és probléma megldva. SetTimeout, SetInterval nem ehhez kellenek.

  • martonx
    veterán

    Köszönöm a tippet.

    A UI már eleve így készült, felkészítve arra, hogy mi történjen, amíg eredményre vár az adatbázisból.

    Ez most csak egy extrém ritka lehetőség, amit kezelni akartam, de úgy vagyok vele, legyen minden rendesen lekezelve, még akkor is, ha csak nagyon kis eséllyel fordulhat elő.

    Szóval végül úgy oldottam meg, hogy az egész JS-kódrészt, ami a várt változóval dolgozna, beletettem egy setTimeout-ba, aminek a végén a várakozási időt egy változó állítja be. Ezt a változót a setTimeout előtt egy if-else állítja be: ha undefined a változó típusa, akkor még nem érkezett meg a válasz, ilyenkor váratom 500 ms-t (még tesztelem, hogy ez elég-e, vagy nem-e túl sok stb.). Ha viszont már megvan az érték, akkor 0-ra állítja, és azonnal lefut.

    Ha már ilyen kókányolás kell neked, akkor legalább csináld meg setInterval-osra timeout helyett. 100 ms-enként lefut az interval, és ha minden oké, akkor clear, ha nem akkor hagy fusson újra.

  • dqdb
    nagyúr

    Szükségem lenne egy függvényre, ami egészen addig nem engedi tovább futni a szkript többi részét, amíg a szükséges változó értéket nem kap (mert utána azzal az értékkel dolgoznék tovább).
    (Nem lehet összedrótozni/egybeágyazni őket sehogy, hogy csak akkor fusson a szkript maradék része, ha az érték visszajött az adatbázisból. Sajnos ez nem megoldható.)

    Ilyesmit kezdtem el összerakni, de nem úgy működik, ahogy szeretném:
    function waitForResult(resultToWaitFor, acceptValue){
        console.log("In waitForResult. resultToWaitFor = " + resultToWaitFor);
        if (typeof resultToWaitFor !== 'undefined'){
            setTimeout(function(){
                waitForResult();
                console.log("Waiting for result.")
                if (resultToWaitFor >= acceptValue){
                    return 0;
                }
            }, 100);
        } else {
            console.log("Megvan az eredmény.");
            return 0;
        }
    }

    ***** Az elképzelés lényege az lenne, hogy 100ms-onként ellenőrzi, hogy kapott-e már értéket a vizsgált változó. Ha nem, ellenőrzi újra (rekurzívan). Ha kapott, kilép, és engedi futni az utána következő részeket. Nem ad vissza értéket. Semmit nem csinál, csak "feltartja" a szkriptet addig, amíg a változó értéket nem kap. (És mindig kap. Jellemzően pár tized mp-en belül, viszont van, hogyha "túlbuzgó" a user, eljuthat ahhoz a részhez a kódhoz, ahol használni kell ezt az értéket, mielőtt még materializálódna a változó. Ezt szeretném orvosolni.)

    Ha a jelen formájában használom, hiába érkezik meg az érték, folyamatosan pörög tovább (logban látszódik, hogy Waiting for result-ot dobálja eszement módon utána is).

    Pont ennek utánajárva találtam, hogy az első if-ágban is kell egy return - a belső ellenőrzést (és vele az acceptValue-t) ezért hoztam be. De nem segített.

    A return 0 azért lett, mert a sima return-nal nem (sem működött), próbáltam hát így is.

    ----------
    Vagy csináljak egy setTimeout-os, while-os ellenőrzést, a végén emelgetve egy számlálót, és megadok egy értéket neki, amit soha nem érhet el? Max ez a backup plan, de jó lenne a későbbiekben is egy ilyen "waitForResult" függvény, jó lenne azt rendbe rakni.

    Irányt tudnátok mutatni a témában, kérlek?

    Alapvetően hibás, amit csinálni szeretnél. Persze mindenki valami hasonlót szeretne elérni, amikor először kell aszinkron hívást beépíteni az addig szinkron homokozójába, de ettől még nem így kell :DDD

    1. az adatbázis-lekérdezés előtt letiltasz minden beviteli mezőt
    2. a lekérdezés befejezésekor lefutó callbackben engedélyezed a mezőket
    A módszer hátránya, hogy a letiltás látható változást hoz, ami gyors lefutás esetében zavaró villogást eredményezhet.

    1. az adatbázis-lekérdezés előtt az előtérbe hozol egy teljes oldalt lefedő 100%-os átlátszóságú DIV-et, ami az egéreseményeket blokkolja az oldalon található elemek elől, a billentyűzetről neked kell gondoskodnod a fókusz valahová áthelyezésével
    2. a lekérdezés befejezésekor lefutó callbackben a háttérbe küldöd a DIV-et
    A módszer hátránya, hogy lassú lefutás esetében a felhasználó azt érzékeli, hogy "lefagyott" az oldal, mert akárhová klikkel, nem reagál

    1. az adatbázis-lekérdezés előtt ugyanazt csinálod, mint az előző megoldásban és setTimeout segítségével ~300 ms késleltetéssel (a pontos értéket neked kell kikísérletezni, hogy a felhasználónak ne villogjon feleslegesen a képernyő, de ne érezze azt sem, hogy "lefagyott" az oldal)
    2. ha a setTimeout callback fut le először, akkor előtérbe hozol egy másik teljes képernyős DIV-et, ami részlegesen átlátszó és rajta szöveggel, hogy várjon a user
    2. a lekérdezés befejezésekor lefutó callbackben tolsz egy cancelTimeout-ot, és a háttérbe küldöd mindkét DIV-et

  • Zedz
    addikt

    Igen, de azt írtad, hogy desktopon tökéletesen működik. Nálam viszont se Chrome-ban, se Firefoxban, se Operában. (Azért rápróbáltam IE-ben, de szóba se állt velem. :D )
    Szóval én működni még nem láttam se gépen, se telefonon (a jobb oldali dobozokat).

    Az viszont nagyon érdekes, mert nálam tökéletesen működnek, és Androidon kívül más issuet nem említettek. :DDD

  • Zedz
    addikt

    Az elsőben a bal oldali mezők szépen fókuszba kerülnek gépen és Androidon is Chrome alatt nálam.
    De se a jobb oldali mezők (Outputs), se a második link mezői nem, se gépen, se telefonon.

    Viszont különböző típusúak is. Amik fókuszba kerülnek, azok mat-form-field típusúak, és fókuszba álláskor kapnak egy mat-focused osztályt.

    A nem működőek pedig input mezők.

    Nem tudom, hogy ezzel most segítettem-e egyáltalán bármit is.

    A jelenség ismert, azért jöttem ide, hogy esetleg volt-e már másnak is hasonló tapasztalata Androidos böngészővel. :D
    Érdekesség, hogy emulált Pixel 3-ban is működnek a dobozok.

  • Zedz
    addikt

    Én még nem jutottam oda, hogy a saját tesztgépemen kívül máson is kipróbáljam, de nekem is van benne, és PC-n gond nélkül fut.

    Esetleg rakd fel JSFiddle-be ezt a részt (egy példa kódban, hogy működjön), és akkor megnézzük.

  • lanszelot
    addikt

    Az a kikötés, hogy kisebb legyen 2-nél, csak az if-en belül él. Attól még amikor az arrNr = 1, belép az if-be, és végrehajtja a növelést, így utána az arrNr értéke 2 lesz. Szóval ha utána használod az értékét (nem if-en belül, mert oda már valóban nem lép be), akkor 2-vel fog dolgozni. (Abból a kódrészletből tudok "dolgozni", amit ide írtál. Ha if-en belül használod az arrNr értékét, akkor valóban nem kellene már 2-t kapnia.)

    Értem, igaz.
    Nagyon szépen köszönöm :R

  • lanszelot
    addikt

    ez miért tud 2-re futni?
    Az arrNr-t 0-ról indítod, és ahány elemet talál, annyiszor emeli az értékét 1-el.
    Ha 2 elemű a tömböd ([0] és [1]), akkor 2 lesz az értéke, mert a [0] elemnél lesz 1, a [1] elemnél pedig 2.

    Nem lehet 2, mivel kissebb mint 2
    2<2 nem futhat le
    2<=2 ekkor lenne 2

    DOM elérés sikerült :) már csak az IF okoz fejtörést

  • nevemfel
    senior tag

    Bénázok...

    Szeretnék egy tömböt, amibe feltöltöm (mondjuk) a userek vezetéknevét, keresztnevét, korát.

    Így gondoltam megcsinálni:

    var userData = new Array();
    for (var i = 0; i < numberOfUsers; i++){
    userData[i] = new Array();
      userData[i]["vezetknev"] = lekerdezesEredmenye[i].vezeteknev;
      userData[i]["keresztnev"] = lekerdezesEredmenye[i].keresztnev;
      userData[i]["kor"] = lekerdezesEredmenye[i].kor;
    //stb.
    }

    Lekérdezni meg úgy szeretném, hogy userData[0]["kor"], akkor visszaadja, hogy pl. 28.

    Működik, de azt kérdezném, hogy van-e ennek jobb módja.
    Mert valamiért olyan "furán néz ki"... (aztán persze ez legyen a legnagyobb gond.)

    Köszi.

    Én így oldanám meg:

    var userData = [];
    lekerdezesEredmenye.forEach(function(element) {
    userData.push({
    "vezeteknev": element.vezeteknev,
    "keresztnev": element.keresztnev,
    "kor": element.kor
    });
    });

  • Taci
    addikt

    Más adatokat is tartalmaz a lekerdezesEredmenye, ezért egy az egyben nem tudom/akarom átadni.

    Az lenne az ultimate cél, hogy az új lekérdezések (amik új értékekkel töltik fel a lekerdezesEredmenye változót) adatai a userData végére kerüljenek pluszban.
    Tehát ha az első lekérdezésből feltöltött 10 elemet (0-9), akkor a következő lekérdezés ehhez fűzze hozzá, a 11. elemtől indulva.

    Pluszban szeretném, hogy ebből az új tömbből ami adattal (userrel) már dolgoztam, azt kiszedjen belőle (hogy ne pazaroljam a felhasznált helyet feleslegesen), de úgy, hogy az előző hozzáfűzős módszer miatt az "id-k" ne változzanak.
    Tehát ha 10 elemem volt az első lekérdezésből, és a második lekérdezésig feldolgoztam 5-öt belőle, akkor magában a tömbben csak a hátra lévő 5 elem legyen (hogy ne foglalja a memóriát, mert kb. végtelenig nyúlhat a bővítés), viszont amint jönnek az adatok az új lekérdezésből, azok a 11. elemként kezdve kerüljenek be. (hogy az "id-jukra" megfelelő módon tudjak hivatkozni)

    Néztem a slice()-t de az csak új tömbbe rakja, 0-tól kezdőden, így az nem jó.
    Esetleg még arra gondoltam, hogy simán csak "lenullázom" az értékét a már felhasznált tömb elemeknek. Pl. userData[0] = ""; (vagy hasonló, ahogy működik majd)

    Megoldottam közben. Bocs az elpazarolt karakterekért, hamarabb írtam, mint kipihentem volna magam.

  • dqdb
    nagyúr

    Bénázok...

    Szeretnék egy tömböt, amibe feltöltöm (mondjuk) a userek vezetéknevét, keresztnevét, korát.

    Így gondoltam megcsinálni:

    var userData = new Array();
    for (var i = 0; i < numberOfUsers; i++){
    userData[i] = new Array();
      userData[i]["vezetknev"] = lekerdezesEredmenye[i].vezeteknev;
      userData[i]["keresztnev"] = lekerdezesEredmenye[i].keresztnev;
      userData[i]["kor"] = lekerdezesEredmenye[i].kor;
    //stb.
    }

    Lekérdezni meg úgy szeretném, hogy userData[0]["kor"], akkor visszaadja, hogy pl. 28.

    Működik, de azt kérdezném, hogy van-e ennek jobb módja.
    Mert valamiért olyan "furán néz ki"... (aztán persze ez legyen a legnagyobb gond.)

    Köszi.

    var userData = lekerdezesEredmenye;

    Így egyszerűbb a kód.
    [link]

  • Mr. Y
    őstag

    Köszi a figyelmeztetést, akkor keresnem kell rá új megoldást (navigator.clipboard.writeText-alapon, gondolom).
    @Mr. Y: Ha találtam és működik, belinkelem majd.

    Rendben, köszönöm

  • martonx
    veterán

    Én ez alapján csináltam meg: [link]

    És itt az str nevű változót úgy formázod, ahogy szeretnéd (beállítod kedvedre a függvény elején, és aztán ennek a tartalmát másolja vágólapra).

    Azért ez elég rizikós, és nem túl jövőálló megoldás, noha per pillanat még működik: Document.execCommand() - Web APIs | MDN (mozilla.org)

  • Mr. Y
    őstag

    Én ez alapján csináltam meg: [link]

    És itt az str nevű változót úgy formázod, ahogy szeretnéd (beállítod kedvedre a függvény elején, és aztán ennek a tartalmát másolja vágólapra).

    :R

  • Pala
    veterán

    Sziasztok!

    Van bármi hátránya annak, ha a honlapomra a JS-szkripteket "tömörítve" (minify, pl. https://jscompress.com/) rakom fel és használom?

    Inkabb csak elonye van: kisebb fajlmeret -> gyorsabb betoltodes + gyorsabb parse-olas.

  • martonx
    veterán

    Ha ez csak HTML fájl esetében igaz, akkor a ?v=1 gondolom, a HTML-en belül a CSS, JS fájlok bejegyzéseinél szükséges, ugye?

    Pl.:
    <link rel="stylesheet" href="css/style.css?v=1">

    Pontosan

  • martonx
    veterán

    Nem tudom, hogyan működik, csak ma eszembe jutott, hogy ez még nincs lekezelve, pedig tervezek módosításokat.
    Akkor ezek szerint ha frissítek valamit az oldal kódjában (html, css, js), akkor azt következő töltéskor a kliensek már töltik és használják is, nem kell semmilyen "trükközés"?

    Ahogy írtam is, ez a HTML file esetében igaz. Css, js file-oknál mögéjük szoktak csapni egy ?v=1 - et, és frissítéseknél ezt növeled. Ezzel jelezve a böngészőnek, hogy ez már egy új verzió, ezt használja.

  • martonx
    veterán

    Köszönöm, átnézem mindenképp. Belekezdtem már akkor, csak sok dolog közbejött.

    Lenne egy másik kérdésem is:

    Tegyük fel, hogy van egy oldalam, aminek van 2 menüpontja. Telik-múlik az idő, a felhasználók használják az oldalt. Aztán úgy látom jónak, hogy azt a 2 menüpontot 5-re bővítem.
    Hogyan lehet azt megoldani, hogy a frissített oldalszerkezet eljusson a felhasználókhoz?
    Mert sima újratöltésnél ugye csak cache-ből dolgozik, így gondolom, ha "nem muszáj", nem fogja megnézni, van-e újabb source verzió. Így amíg nem tölti le a frissített fájlokat az új menüpontokkal, addig én hiába csináltam meg az 5 menüpontot, a felhasználó csak 2-t fog látni.

    Hogyan szoktátok, hogyan lehet ezt kezelni? Mi a bevált módszer erre? Van esetleg egy változó, hogy bizonyos időközönként ellenőrizze, van-e újabb source verzió? De ez így nem lenne teljesen jó, mert ha megcsinálom egyik nap, szeretném, ha másnap már használnák az új fájlokat. Szóval olyan opció kellene (ha van, ha lehetséges), hogy ha módosítok, akkor a következő töltésnél már az új változatot szedje le a kliens.

    Köszönöm.

    Miért ne szedné le az új verziót?
    A static content-et persze szeretik cachelni a böngészők, de a .html-eket nem.

  • disy68
    aktív tag

    Ti írtatok már saját kezűleg sütikezelőt? (GDPR-sáv)

    Nagyjából készen vagyok az oldallal, a megfelelő engedélyekre várok még, és funkcionalitását tekintve még a sütikezelés hiányzik. (Bár sütiket nem használok (egyelőre), csak local storage-ot, de úgy láttam, hogy jogszabály szerint ez egy kalap alá van véve, tehát mindegy, hogy cookie vagy local storage, kell a hozzájárulás és a GDPR-sáv.)

    Nem tudom, megéri-e energiát belefektetni, és megírni magamnak (bár nem igazán tudom/értem, mi-hova-miért tartozik), vagy jobban járnék, ha vennék egy jól felépítettet, és csak beépíteném.

    Ez utóbbira van ötletetek?
    Feleljen meg az előírásoknak, legyen minden állítható, amit állítani kellhet (user szempontjából).

    A működését illetően pedig, ha magamnak akarnám csinálni:
    Amire használom jelenleg a local storage-ot:
    - sötét mód állapota
    - lokáció (weather widget-hez)
    - 18 éves elmúlt-e (tartalmak szűrése, megjelenítése)
    - hasonlók.

    Ez szerverre egyáltalán nem kerül, nem mentek semmit a userekről (jelenleg - majd talán később, egyszer), még igazából látogatottságot se nézek (még), és nincs összekötve se Google-lel, se Fb-kal. Ehhez a két utóbbihoz már tuti kelleni fog egy megfelelő megoldás - de azon kívül?
    Ugye ezeket amiket írtam, nevezhetem a működéshez szükséges "cookie-knak", így ezt amúgy sem lehetne lekapcsolni. Vagy ezt sem én döntöm el? Lehet a sötét mód állapota kényelmi beállítás, és akkor már máshogy és máshol kell kezelni?

    Ebben tudnátok segítséget adni? Ha csak egy jól összeszedett cikk is az, az is bőven jó lenne, csak tudjam, merre-hogyan induljak.

    Köszi.

    Kiindulónak itt van ez. Találsz ott generátort is. Nem vagyok a téma nagy ismerője, de neked a sima cookie consent is elég lehet, nem kell külön gdpr rész.

  • polymorphin
    csendes tag

    Egyelőre ez még csak egy tapogatózó, felületes kérdezősködés, de azt szeretném elérni, hogy az oldalam csak olyan (verziójú) böngészőkön jelenhessen meg, amit 100%-ig támogat mindent, amit az oldalam használ.

    Ehhez ugye előbb tudnom kellene, hogy pontosan mit használ az oldalam. Ehhez valamelyik topikban láttam belinkelve a Can I use oldalát, talán ezzel el tudok indulni.

    De van esetleg olyan oldal, ami "átnézni" az oldalamat, és megmondja, hogy milyen böngészőkből milyen verzió az alap, hogy gond nélkül fusson minden?

    Mert ha meglenne ez a lista, akkor az oldal betöltése előtt ellenőrizhetném a böngésző verzióját, és ha az általam beállított (a megkapott) verzió alatt van, akkor csak egy információs lapot jelenítenék meg, hogy a böngésző verziója nem támogatott, frissítse stb.

    Vagy van erre jobb módszer? Ti hogyan kezelitek/kezelnétek ezt?

    (JS topikba írom a kérdést, mert gondolom, azzal a legegyszerűbb ezt kezelni.)

    Köszi.

    Babel + @babel/preset-env valamelyik module bundlerrel vagy task runnerrel, szerintem az esetek tobbsegeben nincs ra szukseg, ha csak nem Afrikat vagy Indiat celzod meg, vagy ES10+ featureket hasznalsz

  • martonx
    veterán

    Egyelőre ez még csak egy tapogatózó, felületes kérdezősködés, de azt szeretném elérni, hogy az oldalam csak olyan (verziójú) böngészőkön jelenhessen meg, amit 100%-ig támogat mindent, amit az oldalam használ.

    Ehhez ugye előbb tudnom kellene, hogy pontosan mit használ az oldalam. Ehhez valamelyik topikban láttam belinkelve a Can I use oldalát, talán ezzel el tudok indulni.

    De van esetleg olyan oldal, ami "átnézni" az oldalamat, és megmondja, hogy milyen böngészőkből milyen verzió az alap, hogy gond nélkül fusson minden?

    Mert ha meglenne ez a lista, akkor az oldal betöltése előtt ellenőrizhetném a böngésző verzióját, és ha az általam beállított (a megkapott) verzió alatt van, akkor csak egy információs lapot jelenítenék meg, hogy a böngésző verziója nem támogatott, frissítse stb.

    Vagy van erre jobb módszer? Ti hogyan kezelitek/kezelnétek ezt?

    (JS topikba írom a kérdést, mert gondolom, azzal a legegyszerűbb ezt kezelni.)

    Köszi.

    Ez a jó módszer. Viszont nem lesz olyan rendszer, ami ezt megmondja neked, hogy mit kell minimum támogatnod. Neked kell kitalálnod, hogy mi az amit támogatsz.

  • dqdb
    nagyúr

    Belefutottam egy olyan hibába ezzel a kóddal, hogy amikor több szót is szeretnék kijelölni, és az egyik ezek közül a mark része (pl. ma, vagy simán csak az a betű), akkor a <mark></mark>-ban lévő karaktereket is átírja, ezzel elrontva az egészet.

    JSFiddle

    A gond itt nyilván az, hogy már ugyanarra a sztringre hívom rá újra a kijelölő függvényt, amiben már benne vannak a mark tag-ek.

    Ki lehet valahogy kerülni, hogy a kijelölő mark tag-eket is átírja? Mármint valami egyszerű módon.

    Köszi.

    [link]

    Azonban ahogyan a korábbi kódomnál jeleztem, nem túl szerencsés escape-elés nélkül betolni egy stringet reguláris kifejezésnek, mert speciális karakternél szépen jön az exception.

  • martonx
    veterán

    Ah, amit én ~50 sorban sem tudtam tökéletesen megoldani, te rendbe raktad ~10 sorban, úgy, hogy annak is a fele még logolás is... :Y

    Igazából kell még egy kis idő, hogy felfogjam, mi is történik itt... :B (Értve ezalatt a $1-et és a zárójelezést a var textToMark-nál stb..)

    Ismételten köszönöm szépen mindenkinek!

    @cstomee: Amikor ide írok, már túl vagyok nagyon sok keresésen, kutakodáson, utánajáráson. Próbálom ennek a fórumnak az eszét csak akkor igénybe venni, ha már tényleg nem találom a megoldást saját erőből.
    És "sajnos" élettapasztalat, ha valamit már nem írok alaposan körbe az elején, akkor később magyarázkodhatok és pontosíthatok, elvesztegetve sok időt és energiát.
    De köszönöm az észrevételt mindenképp, igyekszem a jövőben kevésbé regényesre ereszteni! :K

    Egy kicsit tovább szépítve cstomee példáját: Edit fiddle - JSFiddle - Code Playground

    Taci, az nem baj, hogy értelmesen leírod, hogy mit szeretnél, mert sokszor olyankor jön rá az ember, hogy még megfogalmazni sem tudja, nem hogy megvalósítani.
    De egy működő jsfiddle példa száz szónál is többet ér :D

  • Persze, jogos minden gondolat. :)

    Azért nem írtam eddig, mert egyszerűsítettem, mert az előző változat már ránézésre is túlbonyolított volt.

    Így talán egy fokkal egyszerűbb, és van benne példa is:
    https://jsfiddle.net/4awv16hg/3/ (konzolba logolással)
    https://jsfiddle.net/4awv16hg/4/ (konzolba logolás nélkül, ha zavaró lenne a sok plusz sor)

    Itt csak 1 elemen futtatom, if használatával, arra szépen lefut. Amúgy while-lal akarom (mert ha ez a függvény meghívódik, akkor 1 találat már biztosan van, szóval egyszer mindenképp le kell futnia), csak az a baj, ha átírom az if-et while-ra, akkor lefagy egy időre (felteszem, ismét valahol infinite loop) (logolásnál látszik, hogy valami nem stimmel a loop-ban), a logolás nélküliben pedig a konzolban írja, hogy "Invalid string length at markText".

    Szóval valószínűleg a ciklusban hibázok valamivel, mert a logban látszik, hogy a textContainerLocal elkezd "önmagába írni" már azután is, hogy elvileg megtalálta mindkét bejegyzést.

    Csak egy észrevételt ha megengedsz... Túl hosszasan írod le hogy mit szerenél ahelyett hogy 4-6 kulcsszót beírnál a google-be. pl: javascript mark text non case sensitive
    jsFiddle
    Nem tudom hogy ez kell e neked mert őszintén bevallom nem olvastam végig amit írtál, TLDR;.
    Szerk.:
    Időközben a példa mondat majdnem hasonló lett :) Egy kicsit bonyi a tiéd, de ha működik akkor jó ...

  • Taci
    addikt

    Azt elfelejtettem írni, hogy persze ezt debuggolom én, eszem ágában nincs ezt mástól kérni, csak status update-ként írtam. Amint megoldottam, adom majd a kódot hozzá, hátha később hasznos lesz valakinek.

    Készen is van az "ultimate kereső kijelölő" :DDD

    https://jsfiddle.net/4awv16hg/16/

    Rengeteg bug volt benne, de most már javítva vannak.

    Illetve majdnem mind, mert ha vesszőre (",") keresek, meg infinte-loop-gyanús, pontnál (".") pedig kijelöl mindent mindenhol.

    De látom, írt dqbd még valamit, ha visszajöttem, átnézem.

    Köszi.

  • Taci
    addikt

    Persze, jogos minden gondolat. :)

    Azért nem írtam eddig, mert egyszerűsítettem, mert az előző változat már ránézésre is túlbonyolított volt.

    Így talán egy fokkal egyszerűbb, és van benne példa is:
    https://jsfiddle.net/4awv16hg/3/ (konzolba logolással)
    https://jsfiddle.net/4awv16hg/4/ (konzolba logolás nélkül, ha zavaró lenne a sok plusz sor)

    Itt csak 1 elemen futtatom, if használatával, arra szépen lefut. Amúgy while-lal akarom (mert ha ez a függvény meghívódik, akkor 1 találat már biztosan van, szóval egyszer mindenképp le kell futnia), csak az a baj, ha átírom az if-et while-ra, akkor lefagy egy időre (felteszem, ismét valahol infinite loop) (logolásnál látszik, hogy valami nem stimmel a loop-ban), a logolás nélküliben pedig a konzolban írja, hogy "Invalid string length at markText".

    Szóval valószínűleg a ciklusban hibázok valamivel, mert a logban látszik, hogy a textContainerLocal elkezd "önmagába írni" már azután is, hogy elvileg megtalálta mindkét bejegyzést.

    Azt elfelejtettem írni, hogy persze ezt debuggolom én, eszem ágában nincs ezt mástól kérni, csak status update-ként írtam. Amint megoldottam, adom majd a kódot hozzá, hátha később hasznos lesz valakinek.

  • martonx
    veterán

    Igen, ezzel valóban a jókat jelöli ki, viszont az a gond továbbra is, hogy ha csupa kisbetűvel írom be a keresőbe a szót (pl. "máté"), akkor hiába szerepel az eredeti tartalomban nagy kezdőbetűvel (pl. "Máté"), a keresési találatokban átírja a keresésben megadott formára.

    Ha pl. a textContainer az, hogy "Alszik Máté, mert elfáradt.", a keresési kifejezés pedig az, hogy "mÁtÉ", akkor bár kijelöli a megfelelő sztringet, viszont ez lesz a megjelenített sztring:
    "Alszik mÁtÉ, mert elfáradt."

    Így csináltam meg, legalábbis itt járok benne:
    https://jsfiddle.net/j7qt4bva/

    Ha "normál kifejezésre" keresek (pl. "máté" vagy "apple"), tökéletesen működik, de rövidebbekre (pl. "a" vagy "az") végtelen cikulsba kerül valahol.

    (Amúgy sanszos, hogy erősen túlbonyolítva csináltam meg...)

    Az alapötlet az, hogy a keresett szó pozícióinak megkereséséhez csupa nagybetűssé alakítom a szöveget, amiben keresek, és a keresett szót is. Aztán ha megvan a pozíció (vagy pozíciók, több találatnál), akkor egy tömbbe szétvágom az eredeti sztringet a találat pozíciók végén. Majd ezeken belül megcsinálom az öleted alapján (RegExp "i") a <mark> tag hozzáadását úgy, hogy a már megszerzett pozíciók alapján kiszedem az eredeti karaktereket (így meglesz az a változat, hogy a kis- és nagybetűk az eredetiben vannak).
    Aztán ezeket a tömbelemeket összefűzöm újra, és ezt adom vissza.

    Csak valahol rövid(ebb) karakterszámnál végtelen ciklusba futok.

    Netán ha kaphatnánk működő konkrét példát html-el? Az mondjuk így ránézésre látszik, hogy amit tippre pár sor kóddal meg lehetne oldani, te 29 teleírt sorból oldottad meg.
    Szóval komolyabban bele se néztem, mert ez így biztos, hogy nem jó :D és nem működő példa híján, hogy az 5 sor helyett, 29 sorban hol a hiba....

  • cattus
    addikt

    Keresés eredményéhez akarom kijelölni a találatokon belül a keresett szavakat.
    Erre a <mark> tag-et használom.

    function markText(textContainer, textToMark){
        return textContainer.replace(textToMark, "<mark>" + textToMark + "</mark>");
    }

    Így viszont nem tudom kezelni a kis- és nagybetűket.

    Pl. arra keresek, hogy "máté". A szerver visszaadja találatnak a "Máté"-t (nagy kezdőbetűvel) tartalmazó találatokat is (ehhez kapcsolódóan amúgy a PHP topikban van egy nyitott kérdésem, és nagyon összezavarodtam vele, ha valakinek magabiztos tudása van a keresés mikéntjével PHP-ban/SQL-ben, kérem, nézzen majd rá), viszont a JS csak azokat jelöli be, amik pontosan megfelel a keresésnek.

    És nem tudom, hogyan kellene úgy módosítanom a fenti függvényt, hogy ha a szövegben az van, hogy "Máté" (nagy kezdőbetű), a keresési szöveg az "máté" (kis kezdőbetű), a találatban lévő sztringben a nagy kezdőbetűs Mátét is vegye körbe <mark> taggel. (Ha csak a kezdőbetűt kellene figyelni, könnyű lenne, viszont ugye lehet olyan találat is, ahol csupa nagybetű, vagy csak a 3. karakter nagy stb. És nekem az kellene, hogy kijelölje, bárhogyan is találja meg a "máté"-t: máté, Máté, MÁTÉ, mÁtÉ, MáTé stb.)

    Lehet, valami nagyon egyszerű, és amint elküldöm a hozzászólást, eszembe is jut - de egyelőre nem jövök rá.

    Hátha ti már találkoztatok ilyen helyzettel.

    Köszi.

    Regex segítségével be tudod állítani hogy a kis-nagybetű ne legyen probléma:

    const regex = new RegExp(textToMark, "gi");
    textContainer.replace(regex, "<mark>" + textToMark + "</mark>");

  • Mr. Y
    őstag

    Amit belinkeltél, ez egy CSS-ben összerakott "ablak". Viszont az alert() függvény az nem ez.
    https://developer.mozilla.org/hu/docs/Web/API/Window/alert
    Kipróbálható példával: https://www.w3schools.com/jsref/met_win_alert.asp

    Attól függ, hol és mire szeretnéd használni. Ha csak egy üzenetet megjeleníteni a weblapodon, ott csak a képzeleted szab határt, hogy milyen ablakot, animációt stb. készítesz.
    Ha a beépített alert() függvényt akarod használni, akkor nincs nagy nyújtózkodási felületed, cserében viszont 1 sorban megvan hozzá a kódod.

    Igazad van, mint írtam fentebb, csak ránéztem, bele nem. Akkor erről ennyit, köszönöm

  • martonx
    veterán

    Köszönöm a részletes választ. :)

    És persze elrontottam a kérdést, rossz példát hoztam fel, mert a gombokon, elemeken lévő onclick-függvényhívásokra akartam volna rákérdezni - azért is hoztam a félkövérre állítós példát mellé.

    Szóval arra irányult volna eredetileg a kérdés, hogy van-e hátránya annak, hogy ha onclick-ként állítom be magában a HTML kódban a gombra, mit csináljon (függvényhívás), azzal szemben, ha a gombnak csak meg van adva az osztály pl. hogy class="btn-toggleDarkMode", aztán egy külső JS-ben pedig definiálva van hozzá egy addEventListener, és ott történik a JS hívása?

    Nyilván szebb, tisztább a kód, ha csak egy class van megadva a gombnak, viszont emiatt ugye több kódolás is a háttérben.

    A T-s dologra pedig nem reagálok. :DDD

    Ez erősen attól függ.

    1. ha valami mv* frameworköt használsz, akkor azoknál alap, hogy a html-be írod az eseménykezelőt. Pl. react, vuejs, svelte, angular
    2. minden más esetben SZERINTEM az a tiszta, ha a js kódot elkülöníted a html-től, ugyanúgy ahogy css-t is külön illik kezelni, noha ez is mind mehetne html style-ba az elementekre.

  • Silεncε
    őstag

    Sziasztok!

    Van annak valami hátránya, ha a HTML-kód tartalmaz direktben JS-hívást?

    Sok oldal forrásábán találok <script></script> tageket, viszont soknál pedig "el vannak rejtve".
    Pl. itt a szerkesztőben a félkövérre állítás gombja:
    <button type="button" class="btn btn-light" title=""
    data-tmce-toggle="bold" data-original-title="Félkövér">
    <span class="fas fa-bold"></span></button>

    Itt ha jól sejtem, a data-tmce-toggle="bold" "mögött" van a JS.

    Melyik a jobb megoldás? Már ha jobb bármelyik is.

    Ha most megnézem a kezdőlapom kódját, ott van az elején pl. hogy:
    <script>setDarkModeFromLocalStorage();</script>

    Ez jelent bármilyen hátrányt? Támadhatóbb az oldal emiatt?
    Ha esetleg igen, mi a jó mód a "javításra"?

    Köszi.

    Én nem tudok olyanról, hogy el lehetne rejteni a JS kódot. Azok a data propertyk nem JS-t rejtenek, hanem a HTML5 szabványban már tudsz ilyen kezdetű attribútumokat definiálni, amikben bármilyen adatot tárolhatsz (például mint a be rakott kódrészben a gombhoz tartozó custom adatok). Errol itt tudsz olvasni: [link]

    Az oldal védelméről: ha egy sima static oldalról van szó (tehát nincs input, vagy esetleg minden csak localban van tárolva) ott sok mindent nem tudnak támadni az oldalon keresztül (ott arra kell figyelni, hogy a host webserver ne legyen törtető, hogy mondjuk módosított, káros kódot tartalmazó fájlok ne kerülhessenek fel). Ha pedig van interakció (akár mondjuk egy régebbi, PHP-s oldal, akar egy újabb JS-es webapp, ami mögött van egy REST-API) ott úgyis a “backend” részen külön validalni kell mindent mert ugye az első számú szabály, a userben SOSEM bízunk (tsystems likes this :DDD )

  • Taci
    addikt

    Sziasztok!

    (Bocsánat, csak ilyen hosszan leírva tudom elmagyarázni, mi is a probléma.)

    A template-ben amit használok (Bootstrap-alapon), van egy JS, ami a scroll-ozásért felel:
    smooth-scrollbar.js

    Ezeket az infókat látom róla benne kommentelt sorokban, hátha segít beazonosítani, hátha valami általánosabb JS:
    Copyright (c) Microsoft Corporation. All rights reserved.
    Licensed under the Apache License, Version 2.0 (the "License")
    * cast `I.Scrollbar` to `Scrollbar` to avoid error
    *
    * `I.Scrollbar` is not assignable to `Scrollbar`:
    * "privateProp" is missing in `I.Scrollbar`
    *
    * @see https://github.com/Microsoft/TypeScript/issues/2672

    Ahogy látom, ez a szkript a sidebar-ban van használva. Úgy találtam rá, hogy van a sidebar-ban pár elem, ami data-toggle="collapse" segítségével "bont ki" és "zár össze" tartalmakat (hogy több/kevesebb tartalmat mutasson), és most jött elő a következő hiba:

    Ha a sidebar alján lévő gombbal (data-toggle="collapse") bontom ki a tartalmat, és legörgetek a kibővített lista aljára, és az ott lévő gombbal bezárom ezt a listát (szintén data-toggle="collapse"), akkor nem scroll-oz vissza, és ha mondjuk egy oldalnyi plusz tartalmat mutatott pluszban, és most azt zárom be, akkor a sidebar kvázi üres lesz, mert a tartalmat már elrejtette, viszont az összezárt tartalom feljebb van, és már csak az üres területet mutatja. Aztán amint egy picit is scroll-ozok, ugrik egy hathalmasat, pontosan onnan folytatva, ahol a kibontás előtt állt.

    Ezen a ponton kezdtem el keresgetni, mi-hol is történik, és ekkor találtam rá, hogy a smooth-scrollbar.js végzi ezt a scroll-ozós számításokat.

    Azt találtam, hogy létrehoz egy scroll-content nevű class-t/osztályt, aminek folyamatos számítások alapján állítja be a transform stílust, konkrétan ezzel mozgatva a tartalmat, srollozás gyanánt.

    Ha a tetejére scroll-ozok, akkor:
    <div class="scroll-content" style="transform: translate3d(0px, 0px, 0px);">

    Ha a jelenlegi ablakméret aljára, akkor:
    <div class="scroll-content" style="transform: translate3d(0px, -291px, 0px);">

    Ha kibontom a tartalmat, és az aljára scroll-ozok, akkor:
    <div class="scroll-content" style="transform: translate3d(0px, -988px, 0px);">
    Tehát kb. 700 pixellel lejjebb visz/vagyok.

    Aztán itt jön a probléma, mert amikor összezárom a tartalma a data-toggle="collapse" segítségével, akkor konkrétan lent hagy az alján, -988px-en marad a transform, míg a tartalom már azt a kb. 700 pixelt visszazárta, így ott marad kb. 700 pixelnyi üres terület.

    Aztán ha egy picit is görgetek felfelé, akkor nem -988px-elről kezdi felfele a görgetést, hanem az azelőtti értékről, a -291px-ről.

    Szóval az a változó amit figyel, hogy meddig tart a tartalom alja, az már visszaállt a helyes értékre, a -291px-re, viszont a transform: translate3d()-vel nem "megy utána".

    Ezért arra gondoltam, hogy oké, akkor "utána küldöm" én:

    document.getElementsByClassName("scroll-content")[0].style.transform = "translate3d(0px, 0px, 0px)";

    És itt jött az a gond, hogy alapból nem akartam ezzel sokat vesződni, mert akkor mindig azt kéne néznem, hogy honnan indult a kibontás, mennyi pixelről, és oda küldeni vissza. Ehelyett inkább egyből a tetejére dobtam vissza (0px, 0px, 0px).

    Viszont itt láttam, hogy hiába a transform, attól még a -291px van bejegyezve, hogy ott állt meg legutóbb a scroll-ozás, így hiába dobom a tetejére, ha kicsit görgetek, újra -291px-elről folytatja.

    Van valakinek tapasztalata ezzel esetleg? Meg lehet ezt oldani valami egyszerű módon?
    Remélem, ez valami általánosabb JS (bár én sosem láttam még), és esetleg más is találkozott már ilyen "jelenséggel", így nem túl specifikus a kérdésem.

    Köszi!

    Jobb megoldás híján maradtam transform-piszkálásnál.

    Én így oldottam meg, ha esetleg később valaki ilyen problémával találkozna:

    function scrollSidePanelScrollContent(yToScroll){
        var sidePanelScrollContent = document.getElementsByClassName("scroll-content")[0];
        var transformCurrentValue = sidePanelScrollContent.style.transform;
        var translate3DValueOfYpx = transformCurrentValue.split(",")[1];
        var translate3DValueOfY = translate3DValueOfYpx.replace("px", "");
        var scrollToY = parseInt(translate3DValueOfY) + yToScroll;
        leftSidePanelScrollContent.style.transform = "translate3d(0px, " + scrollToY + "px, 0px)";
    }

    (Nyilván profibban is lehet, de így átlátható, mit-miért, alapnak tökéletes lehet.)

    Ha valaki azért tudja a "rendes" megoldást erre a problémára, írjon majd.
    Köszi.

  • Silεncε
    őstag

    Ctrl+F5 tölti újra a forrásfájlokat is. Vagy esetleg a Network tab alatt a Disable Cache opció?

    Disable cache alapvető, ha fejlesztesz. Engem anno CSS-el szívatott meg, hogy elcachelt mindent és hiába módosítottam, baxott frissíteni...

  • nevemfel
    senior tag

    Köszönöm a linket, úgy látom, ez (elsőre) egy nagyobb lélegzetvételű téma, de érdekel, és hátha valóban ez a jó megoldás, úgyhogy mindenképp végig olvasom és értelmezem. :)

    Meg ő tudja is magáról, hogy szar a netje és türelmesen kivárja
    Ezt azért tudjuk, hogy sajnos nem (mindig) így működik. :)

    A CDN-téma viszont teljesen ismeretlen számomra. Van esetleg ajánlott szolgáltató? Jó lenne, ha üzemelne még jó pár évig, és nem baj, ha fizetős, csak legyen próba verziója, hogy tesztelni tudjam.

    Köszi!

    Én azt javaslom, hogyha sok képet akarsz megjeleníteni, akkor használj progresszív képbetöltést, tehát csak akkor kérd le a képet, ha az oldal görgetése a képhez ér (vannak rá kész libek), vagy inkább használj valami galériát, ami szintén nem tölti be az összes képet előre, csak ha a képlapozás odaér (szintén ezernyi kész program van rá, ami előre is tölt x darabot, lapozás irányától függően.)

  • martonx
    veterán

    Köszönöm a linket, úgy látom, ez (elsőre) egy nagyobb lélegzetvételű téma, de érdekel, és hátha valóban ez a jó megoldás, úgyhogy mindenképp végig olvasom és értelmezem. :)

    Meg ő tudja is magáról, hogy szar a netje és türelmesen kivárja
    Ezt azért tudjuk, hogy sajnos nem (mindig) így működik. :)

    A CDN-téma viszont teljesen ismeretlen számomra. Van esetleg ajánlott szolgáltató? Jó lenne, ha üzemelne még jó pár évig, és nem baj, ha fizetős, csak legyen próba verziója, hogy tesztelni tudjam.

    Köszi!

    "és hátha valóban ez a jó megoldás" - nem hátha, hanem ez az egyetlen jó megoldás. Ez egy publikus topik, amellett hogy segítünk, én legalábbis arra is próbálok odafigyelni, hogy ne szerepeljenek hülyeségek, tévutak, másokat ne vigyenek félre hülyeségek, még ha valakinek éppen nagyon be is csípődött a saját ötlete (ami önmagában elvi szinten nem is lenne hülyeség, csak épp megvalósításkor minden elvi előnye el is úszna).

    CDN-re nem kell sokat találgatni, valamelyik nagy felhő providernél be kell regelni, és elkezdeni használni. AWS, Azure, Google Cloud mindegyik tud CDN-t, és ezek mindegyike sokáig velünk lesz még szerintem. És ahogy mondtam a te szinteden ingyenesek, majd ha lesz napi több ezer látogatója az oldaladnak, akkor elkezdhetsz fizetni havi 1-2EUR-t nekik a CDN-ért. Regisztráció után X ingyenes keretet szoktak adni 1 évig, szóval nyugodtan próbáld ki, első hónap után látni fogod, hogy normál esetben mennyit kellene fizetned (tippre a te felhasználásoddal csak CDN esetben nullát).

  • martonx
    veterán

    De valahogy akkor is tudnom kell, hogy melyik kliensnek adjam a lebutított (460x230-as) képet, és melyiknek a normál (1000x500-as) képet. (Akár saját tartalommal, akár máshonnan.)
    Nem akarok én persze sebességméréssel bajlódni, egyetértek veled teljesen, de akkor hogyan tudom egyszerűbben ketté ágaztatni ezt, hogy a lassabb ezt kapja, a gyorsabb meg azt? Rendszer szinten van definiálva valami változó/függvény, amit ehhez fel lehet használni?
    Pl. egy mobil rendszer (Android, iOS) tudja, hogy milyen kapcsolaton van. És a Windows is. A böngészők tudják? Meg lehet kérdezni tőlük? Ha igen, hogyan?

    Erre való az image srcset How to Use HTML5 “picture”, “srcset”, and “sizes” for Responsive Images (tutsplus.com)
    Felejtsd már el a hálózati sebességet, lényegtelen. Valahogy nálad ez csípődött be, könyörgök felejtsd el! :O
    Egy dologra kell figyelj, hogy a képernyő felbontásának megfelelő méretű képet add oda, és akkor mindenki boldog lesz.
    Ha kicsi a képernyő (értsd mobil), akkor annak egy kicsi kép fog menni, ha nagy a képernyő, mert desktopon nézed, akkor annak egy nagy kép fog menni.
    Egyébként is, attól, hogy valakinek lassabb a netje, még nem fogsz minden képet 32X32 pixelesen küldeni, hogy is nézne már ki. Meg ő tudja is magáról, hogy szar a netje és türelmesen kivárja :D

    A linkelt példa szerintem egész jól bemutatja, elmagyarázza.

  • coco2
    őstag

    Igen, köszönöm, ez a megoldás egy része lehetne az elejének, hogy minden felhasználó megkapja a kisebb felbontású képet.

    Viszont utána a lassú kapcsolaton lévőknél annak nem lenne értelme, hogy még azoknak a képeknek a nagy változatát töltse, amiken már rég túlpörgetett, miközben az újak, amik már szem előtt vannak, már töltődni kellene, de még mindig a korábban már túlpörgetettek nagyobb változatát tölti.

    Ezért gondoltam egy szétválasztásnak sebesség szerint.

    Hát pedig akkor sebességmérned kellene. És ahhoz nem jók a statikus linkek, xhr-t kellene indítanod. Amikor elindítasz egy letöltést, rakd el az időpontot. Amikor végeztél vele, összehasonlítod. A Date.now() millisec alapon mér.

  • Mr. Y
    őstag

    De valahogy akkor is tudnom kell, hogy melyik kliensnek adjam a lebutított (460x230-as) képet, és melyiknek a normál (1000x500-as) képet. (Akár saját tartalommal, akár máshonnan.)
    Nem akarok én persze sebességméréssel bajlódni, egyetértek veled teljesen, de akkor hogyan tudom egyszerűbben ketté ágaztatni ezt, hogy a lassabb ezt kapja, a gyorsabb meg azt? Rendszer szinten van definiálva valami változó/függvény, amit ehhez fel lehet használni?
    Pl. egy mobil rendszer (Android, iOS) tudja, hogy milyen kapcsolaton van. És a Windows is. A böngészők tudják? Meg lehet kérdezni tőlük? Ha igen, hogyan?

    Most olvasom csak a problémádat.
    Erre viszonylag egyszerűen szokták a megoldást megadni. Minden esetben a kisebbik felbontás tölt be és az hamar meg is jelenik. Közben a háttérben (elrejtve) betölti a nagyobb felbontású képeket is. Ha azzal végzett (ezt egy egyszerű js rutinnal le tudod követni), akkor megjelennek a nagyok és eltűnnek a kicsik.

    Ez eredményez "gyorsan" betöltő weboldalt minden eszközön és mire a felhasználó eljut odáig, hogy részketesen szemügyre vegye a médeatartalmat is, addigra már be vannak töltve a nagyobb, jobb minőségű képek.

    Amennyiben vizsont nem ez lenne a cél, akkor nem szóltam :))

  • martonx
    veterán

    martonx és sztanozs: Köszönöm a tanácsokat, utána nézek ezeknek a megoldásoknak.

    Azt még meg tudnátok mondani, a lap betöltésének melyik pontján tudom mérni a sebességet úgy, hogy a lap más elemeinek töltése ne kavarjon be? Mert így most csak az első teljes betöltés utánra tudok gondolni, de jó lenne még az elemek töltésének megkezdése előtt, hogy csak akkor kezdje el, miután sebességet mértem. Ezt a JS-hívást hova kell raknom, vagy hogyan kell meghívnom, hogy így működjön? Köszi.

    Továbbra is azon a véleményen vagyok, hogy maximálisan értelmetlen sebességet mérned, pláne ha ezzel a célod a betöltés gyorsítása :D mivel a pagespeed a plusz js szüttyögés miatt még le is fog pontozni, miközben a probléma az, hogy ha meg akarsz jeleníteni egy 460X230-as képet, akkor nem egy 2Mbyte-os 4K-s képet kellene lerángatni netről, hanem egy 20kbyte-os pontosan 460X230-asat.
    És ezen nem fog semmit segíteni, hogy te page initnél pár másodpercig hálózati sebességet méricskélsz, hogy eldöntsd majd hogy, mekkora képet szolgálj ki. :)

  • sztanozs
    veterán

    martonx és sztanozs: Köszönöm a tanácsokat, utána nézek ezeknek a megoldásoknak.

    Azt még meg tudnátok mondani, a lap betöltésének melyik pontján tudom mérni a sebességet úgy, hogy a lap más elemeinek töltése ne kavarjon be? Mert így most csak az első teljes betöltés utánra tudok gondolni, de jó lenne még az elemek töltésének megkezdése előtt, hogy csak akkor kezdje el, miután sebességet mértem. Ezt a JS-hívást hova kell raknom, vagy hogyan kell meghívnom, hogy így működjön? Köszi.

    a lap betöltése előtt és utána elmented ezt egy cookieba és redirectelsz a valós oldalra.

  • martonx
    veterán

    Ezt nem értem.
    Mármint azokat a képeket egyáltalán nem célom tárolni semmilyen formában. Viszont ha nem tárolom, átméretezni sem tudom őket. A megjelenített méreteit meg tudom változtatni, így át tudom "méretezni", de ettől a fájlméret még nem változik, nekem pedig most csak az számít. (Bár szerintem egyről beszélünk, csak én vagyon nagyon fáradt.)

    Ez a példa amit írtál azt jelenti, hogy letöltöm, átméretezem, aztán hivatkozok rá, hogy honnan van(?) (&source=).
    Vagy valahogy mégis meg lehet oldani, hogy a kliens úgy kapjon kisebb felbontású (és így fájlméretű) képet, hogy én ezt nem tárolom? Ez lenne a "/kepatmeretező?width=460&heigh=230"? Egy kód szerver oldalon (php)? Hogyan működik? Minden képletöltésnél átméretez, és azt "adja oda"? De akkor minden egyes kép minden egyes letöltésekor ez lefut és dolgozik? Letilt a szolgáltató. :D Ezt optimalizálni úgy lehetne, hogy tárolom az átméretezett képeket, de ez nem opció.

    Kérlek, írd le picit pontosabban, milyen megoldásra is gondolsz. Vagy ha van neve a megoldásnak, az is elég, ha megírod, és rákeresek. De egyelőre ez így nem világos, mert az előbb végig logizákozott vonal forráspazarlásnak tűnik csak.

    Köszi.

    Jól érted, pont ezt kell csinálnod. Szerver oldalon (ami most esetedben PHP) letöltöd, de nem tárolod, csak kiszolgálod a kicsire átméretezett képet.
    És itt jön a történetben a csavar, hogy a rendszered fölé teszel egy CDN-t, ami egyébként kb. ingyenes, legalábbis ahhoz egész nagy terhelésednek kell lennie, hogy elérd a havi 1EUR-os fizetendő díját.
    Azaz ez benne trükk, hogy te ezt tényleg nem fogod tárolni, ezt megoldja helyetted a CDN :)

  • sztanozs
    veterán

    (Ne haragudjatok, hosszú lett, "hangosan gondolkodom", offba is rakom, de tanácsot szívesen elfogadnék, van pár kérdésem benne.)

    Ötletem sincs, mik lehetnek a jó mérőszámok, de ezeket a kategóriákat szeretném lefedni:

    1) Gyenge hálózati kapcsolat
    3G és alatta

    2) Közepes sebességű hálózati kapcsolat
    3G és 4G között, 4G-t is beleszámítva, mert 1-2-5 MB-os képeket én sem szeretnék 4G-n töltögetni, hiába lejönne hamar. (több 10-100 db képről is szó lehet, attól függően, mennyit scroll-ozik a user).
    Sőt, lehet, hogy ebbe a kategóriába kerülne minden mobileszközös kapcsolat.

    3) Gyors hálózati kapcsolat
    Ezt meghagynám az asztali böngészőknek (LAN, otthoni vagy céges wifi, ahol nincs korlát az adatmennyiségre) a nagy fájlméretek miatt.

    Ezekhez akkor hogyan lehetne jól belőni a számokat? Amiket példának mondtál, azokat lehet is használni? Mindjárt nézem a hálózati sebességeket.

    Preset,download(kb/s),upload(kb/s),RTT(ms) GPRS,50,20,500 Regular 2G,250,50,300 Good 2G,450,150,150 Regular 3G,750,250,100 Good 3G, 1000,750,40 Regular 4G, 4000,3000,20 DSL 2000, 1000,5 WiFi 30000,150000,2

    kB-ban:
    - erős 2G: 56 kB/s
    - átlagos 3G: 94 kB/s
    - erős 3G: 125 kB/s
    - átlagos 4G: 500 kb/s

    Egy fontos kérdés ezen a ponton: Az oldal többi elemét is tölti, nyilván nem 1 szálon dolgozik. Viszont a sebességmérésnek csak akkor van értelme, ha a teljes sávszélesség az övé (mármint más alkalmazások is használnak, de legalább az oldalam más elemeinek betöltése ne lassítsa, amíg sebességet mér.)
    Ezt melyik ponton tudom a legbiztosabban kivitelezni? a document onload nem jó, mert addigra már az első 4 elemet betöltötte. Ha előtte indítom, akkor párhuzamosan tölti a többi elemet is (css, js stb.).
    Erre mi a jó megoldás, hol van a "jó mérési pont", ahol csak ez a szál futhat?

    Tegyük fel, hogy ez megvan (nincs, tanácsot kérnék ide is - de csak hogy a gondolatmenetet folytatni tudjam).

    Egyszerre 4 képet tölt be az oldal - persze ha a user scroll-oz mint az őrült, akkor végtelen + 4-et. De nézzük azt, hogy egyszerre csak 4-et tölt be.
    Ahogy néztem, egy átlagos, jó minőségű kép, amik a feed-ekben vannak általában 100 és 250 kB között vannak. Ezeket a képeket adnám a 2-es kategóriának.
    Tehát ha 4 ilyen képet tölt egyszerre, és mind 250 kB, akkor 1 MB-ot kell betöltenie egyszerre (csak a képeket számolva).

    Na és itt elakadtam... Milyen számokat adjak meg a három kategória határétékeinek?
    Mi számít elfogadható betöltési sebességnek?

    Ez ugye 4G-n 2 mp / betöltés (4 db kép). Ez rendben van, bőven belefér.
    Erős 3G-n ez már 8 mp / 4 db kép. Tehát betölt az első adag, scrollozol lefel kicsit, és tölt a következő adag. 8 db képre ez már 16 mp. Túl sok, ez biztos.
    Talán képenként 1 mp még belefér. 250 kB/s.

    Az 1)-es kategóriába akkor tartozna a 250 kB/s alatti sebesség.

    A 2-es kategória lenne mondjuk akkor 250-500 kB/s között, így az átlagos méretű (250 kB) képekkel számolva 2-4 mp alatt töltene be egy-egy 4-es képcsoport.
    Illetve valahogy ide kell szűrnöm az akár gyorsabb kapcsolattal, de mobilon netezőket, mert azért az adatcsomagot nem szeretném "leenni" róluk. Erre is biztosan van valami módszer, hogy kiszűrjem - keresek is majd.
    Mobilon nyilván wifi-n is lehet netezni, és ott nem számít az adatmennyiség. Szóval nem mondhatom minden mobilról érkezőnek, hogy ti csak a 2)-es kategória képeit kapjátok. Bár gondolom, ez egy egyszerű IF-ág lesz (HA mobilról ÉS a sebessége a 2-es kategóriában)

    A 3)-as kategóriába pedig a nem mobil eszközről (hanem PC-ről) érkezők. Vagy HA mobilról ÉS a sebessége gyorsabb mint... na egyelőre ezt sem tudom, itt milyen sebességekre szűrjek.

    Túl sok gondolat ez így egyszerre, leírom, aztán ha kifújtam magam, visszanézek majd.
    Bocs, hogy ilyen hosszú lett.

    ;TLDR - van API ami visszaadja, de nem támogatott minden környezetben (Mac, iOS, Firefox, IE). IP alapján lehet még esetleg vélelmezni:
    Privát IP tartomány: wifi
    - 10.0.0.0/8
    - 172.16.0.0/12
    - 192.168.0.0/16
    Minden más (ISP és publikus): mobilnet

    https://stackoverflow.com/questions/8598065/how-do-you-detect-3g-vs-wifi-connection-on-mobile-safari

  • martonx
    veterán

    Nem tárolok egyetlen egy képet sem (csak a blank, "kitöltő" képeket, amiket gyenge kapcsolatnál adnék vissza). Az összes többi csak link, RSS-ből kiszedve, nem én tárolom, így méretezni sem tudom. Muszáj vagyok számolgatással és sebességméréssel szétválasztani a terített tartalmat.

    Az teljesen mindegy, hogy a képek sajátok-e, és te tárolod-e őket :D A link alapján le tudod szedni, át tudod méretezni, és vissza tudod adni a megfelelő méretben.
    A böngészőnek küldött html-ben nem az lesz, hogy <a href="https://kulsodomain.com/ezegykulsokep.jpg"> hanem az hogy <a href="https://azenoldalam.hu/kepatmeretező?width=460&heigh=230&source=https://kulsodomain.com/ezegykulsokep.jpg">

  • martonx
    veterán

    Sziasztok!

    Arra gondoltam, hogy a kliens hálózati sebességétől teszem függővé, hogy milyen (vagy milyen minőségű) képeket küldök ki az eszközre (ezeket természetesen felülbírálhatja, ha szeretné).

    Ha gyenge a kapcsolata (pl. 3G), akkor csak 1-2 ismétlődő "template" kép, cache-li, és nyilván ugyanazt tölte be újra és újra. Ha jobb kapcsolata van (4G pl.), akkor már jöhetnek mondjuk a 250kB alatti képek is. Ha pedig mondjuk LAN-on van, akkor akár az egészen nagy képek is.

    Így lenne 3 kategória, csinálnék az oldal betöltésekor egy sebességtesztet, és ehhez mérten adnám a tartalmat.

    A kérdés csak az, hogyan lehet legjobban ezt a sebességtesztet elvégezni. Amilyen megoldásokat találtam, azok úgy működnek, hogy van 1 fix fájl (kép), annak adott a mérete byte-ban, azt letölti a kliens, és ahhoz mérten, hogy mennyi idő alatt szedi le, abból számolja ki a hálózati sebességet.
    Pl.: [link]

    Ez kisebb fájlokkal is működik? Mert mondjuk ha adott egy rossz lefedettségű 3G kapcsolat, nyilván nem fogom azzal kezdeni az oldal betöltését, hogy rádobok egy 5 MB-os fájlt, hogy megnézzem, mennyit bír. :DDD Elég egy 100kB-os is? Valós (használható) eredményt ad?

    Vagy van erre jobb módszer, hogy megállapítsam a kliens hálózati sebességét?

    Köszi!

    Rosszul közelíted meg. Mindig éppen akkora képet adj vissza, amekkora kell, semmivel se nagyobbat. És igen, ehhez kelleni fog némi backend, amivel ezt megoldod, hogy mindig tökéletesre méretezett, optimálisan tömörített képet tudj szerezni.
    Semmi értelme nincs tesztelgetni a kliens sávszélességét.

  • sztanozs
    veterán

    Sziasztok!

    Arra gondoltam, hogy a kliens hálózati sebességétől teszem függővé, hogy milyen (vagy milyen minőségű) képeket küldök ki az eszközre (ezeket természetesen felülbírálhatja, ha szeretné).

    Ha gyenge a kapcsolata (pl. 3G), akkor csak 1-2 ismétlődő "template" kép, cache-li, és nyilván ugyanazt tölte be újra és újra. Ha jobb kapcsolata van (4G pl.), akkor már jöhetnek mondjuk a 250kB alatti képek is. Ha pedig mondjuk LAN-on van, akkor akár az egészen nagy képek is.

    Így lenne 3 kategória, csinálnék az oldal betöltésekor egy sebességtesztet, és ehhez mérten adnám a tartalmat.

    A kérdés csak az, hogyan lehet legjobban ezt a sebességtesztet elvégezni. Amilyen megoldásokat találtam, azok úgy működnek, hogy van 1 fix fájl (kép), annak adott a mérete byte-ban, azt letölti a kliens, és ahhoz mérten, hogy mennyi idő alatt szedi le, abból számolja ki a hálózati sebességet.
    Pl.: [link]

    Ez kisebb fájlokkal is működik? Mert mondjuk ha adott egy rossz lefedettségű 3G kapcsolat, nyilván nem fogom azzal kezdeni az oldal betöltését, hogy rádobok egy 5 MB-os fájlt, hogy megnézzem, mennyit bír. :DDD Elég egy 100kB-os is? Valós (használható) eredményt ad?

    Vagy van erre jobb módszer, hogy megállapítsam a kliens hálózati sebességét?

    Köszi!

    Szvsz célszerű három különböző méretű fájllal dolgozni, hogy melyik jön le az adott időn belül (pl 3 sec): 10 kB, 100 kB, 1 MB
    Ez alapján be tudod lőni a sebességet. Ha valamelyik nem jön le a kért időn belül akkor az annál egyel kisebb sebességet választod (és a következővel meg sem próbálkozol).
    De lehet más módszerrel is próbálkozni (pl websocket és fix méretű (random) payload és azt nézed meg, hogy adott idő alatt mennyi csomag jön át).

Új hozzászólás Aktív témák

Hirdetés