Hirdetés

Keresés

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

  • Taci
    addikt

    Igen értem a logikáját és valóban egy fájlban van a js és a php.
    Akkor jól gondoltam, hogy kéréssel tudom megoldani.
    Valaki egy csöpp kódot tudna írni erre ?!

    Valaki egy csöpp kódot tudna írni erre ?!
    Próbáld ki a ChatGPT-t. Az eredeti kérdésedet egy az egyben bemásolva már adja is a példakódot. Persze még sokszor hibázik/hibázhat, de mindig rá lehet a részletekre kérdezni, és leírást is ad, kommentel is. Én szeretem használni, ha épp gyorsan kellene egy példakód, és magamtól valamelyik rész nem megy, nem világos.

  • Taci
    addikt

    Nem tudom. Nem igazán látom át a linkelt példa-oldal működését, de akárhogy próbáltam, nem tudtam olyan url-t írni, ami egy adott kulszóra keresne az oldalon:
    https://www.oldal.com/akármi/?q=kulcsszó
    https://www.oldal.com/akármi/?query=kulcsszó
    https://www.oldal.com/akármi/?s=kulcsszó
    https://www.oldal.com/akármi/?search=kulcsszó

    Ezt nem tudod csak kliens oldalon (JS) megvalósítani. Kell a szerver oldal is, PHP-ben meg kell írni, hogyan kezelje a kapott paramétert, mit csináljon vele.
    Itt (keresésnél) a JS-nek annyi szerepe van, hogyan jeleníti meg a találatokat, mit csinál velük. De maga a keresés és a paraméterként átadott kulcsszó feldolgozása szerver oldalon történik.

  • Taci
    addikt

    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.

  • Taci
    addikt

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

    Nekem ez volt a legelső Google-találat. Lehet, Bingen nézted. :D

  • Taci
    addikt

    Sziasztok!

    Lehet, furcsa a kérdésem, de fontos. Adott egy site, amiben van egy iframe. Az iframe behív egy másik oldalt.
    Kérdés az, hogy a két oldal egymással tud-e kommunikálni?

    Konkrétan az lenne a cél, hogy a behívott oldal információt közöljön az őt behívó oldallal, akár csak úgy, hogy van benne egy azonosítóval ellátott DIV, amit a behívó le tud esetleg kérdezni. Ez megoldható?

    Előre is köszönöm a válaszokat!

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

  • Taci
    addikt

    Sziasztok!

    Tudjátok esetleg, hogy a navigator.share használatával hogyan lehet a szövegtörzsbe (text paraméter) kattintható linket elhelyezni?

    Mobilon megosztva persze szépen megy (mert az ha linket lát, alakít), viszont Windows alatt ha a Posta alkalmazással osztom meg, akkor csak az url paraméterhez helyezett link "él", máshol nem.

    Ez az alap:
    https://codepen.io/j471n/pen/gOxgxed

    De ha egy url-t írok be a text-hez, akkor nem lesz aktív (kattintható). Pl.:
    19. sor:
    webShareAPI("header", "www.google.com", "www.url.com")
    Csak ami az url paraméterhez kerül.

    Próbáltam HTML kóddal is, hátha az kell az Outlook-nak, Gmail-nek, Postának, de nem segített:
    shareHTMLBody = "<html><body>";
    shareHTMLBody = shareHTMLBody + '<a href="www.google.com">Google</a>';
    shareHTMLBody = shareHTMLBody + "</body></html>";

    Lehetséges egyáltalán?
    Köszönöm.

  • Taci
    addikt

    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

    Köszönöm, hogy ilyen részletesen leírtad!
    @Bzozoo: Neked is köszönöm.

    Mindkettőtöknek igaza van amúgy, mind a naiv és béna kivitelezésben, mind a lehetőségek ismeretének hiányában. De ezért kérdezek, hogy tanulhassak. :)

  • Taci
    addikt

    "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.

    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.

  • Taci
    addikt

    Az mért nem járható út, hogy realtime generálod a tartalmat és azt realtime rendereled, akkor amikor az user megnyitja? Ekkor a felhasználó a legfrissebb generált információt kapná HTML-ben és a Google is ugyanazt a renderelt infót kapná.
    Szerintem ez a JS-es div felülírás sem túlságosan SEO kompatibilis.

    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.

  • 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.

  • Taci
    addikt

    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?

    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.

  • Taci
    addikt

    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/

    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.

  • Taci
    addikt

    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.

  • Taci
    addikt

    https://jsfiddle.net/n5ap87gh/

    A jobbra gombot majd úgy nyomd, ha előtte belekattintottál a jobb alsó területbe, ahova a gombot is generálja.

    Jaj bocs, eggyel lejjebb akart menni a válasz. :)

  • Taci
    addikt

    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]

    Nagyon tetszenek az ilyen szép és egyszerű megoldások! Köszönöm. :)
    (Remélem, lassan (gyorsan) már nekem is beugranak majd az ilyenek, és nem csak extra nagy körökkel tudok célba érni. :) )

  • Taci
    addikt

    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.

  • Taci
    addikt

    Nagyon jó, köszönöm szépen!
    Ezt a megoldást kerestem igazából, hogy végre tudjam class-okon keresztük irányítani ezeket a tulajdonságokat. (Amit írtam megoldást, azt csak amit saját kútfőből össze tudtam hozni, de ez az igazi.)
    Köszönöm!

  • Taci
    addikt

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

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

    Pedig ez volt szinte az első, amit próbáltam, igaz, csak a for ciklusnál. Így, hogy átírtam a ciklusban lévő többit is, így már úgy működik, ahogy szeretném.
    Köszönöm a gyors segítséget.

  • Taci
    addikt

    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.

  • Taci
    addikt

    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.

    Köszönöm szépen a részletes magyarázatot! (Már sokadjára! :R )

  • Taci
    addikt

    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.

  • Taci
    addikt

    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.

    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.

  • Taci
    addikt

    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á.

    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. :)

  • Taci
    addikt

    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

    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. :)

  • Taci
    addikt

    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.

  • Taci
    addikt

    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.

    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.)

  • 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?

  • 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!

  • Taci
    addikt

    Sziasztok!

    Lehet, hülye kérdés, de! Amikor egy Weboldal annak betöltése folyamán elindít egy JS-t, ami lekérdezi az aktuális dátumot, órát, percet, stb., az olyankor az internetről szedi az információt, vagy az őt betöltő eszköztől kérdezi meg?

    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.

  • Taci
    addikt

    Köszönöm a tippeket!
    @Taci igen erre én is gondoltam, csak talán lenne erre rövidebb kód is, nem?
    @nevemfel igen igen, ez világos, csak nem értem, ezt hogy kéne a buttonhoz hozzárendelni? Valahogy nem jött össze nekem még a dolog( igaz eddig csak olyasmiket csináltam, ahol a gomb egy CSS tulajdonságot változtatott, pl animációt indított el stb. )

    Rakj össze JSFiddle-ben egy példát, úgy könnyebb lesz, mert azt tudjuk szerkeszteni, és azzal tippeket/megoldást adni.

  • Taci
    addikt

    Sziasztok! A következőben szeretnék segítséget kérni:
    készítettem egy egyszerű naptárat. Szeretnék mellé tenni két-három gombot, amikre kattintva a naptár nyelve változtatható.
    Most ugye "default", tehát magyarul írja ki a hónapot/napot.

    const dayName = new Date().toLocaleString("default",{weekday:"long"}) ;
    const monthName = new Date().toLocaleString("default",{month:"long"});

    Mondjuk lenne egy német "de-DE" , egy orosz "ru-RU" stb. Már sikerült belezavarodnom, mert eddig amiket próbáltam, nem voltak jók.

    És ha úgy csinálnád, hogy megnézed, a
    const d = new Date();
    var month = d.getMonth();
    mit ad vissza, és egy if-else vagy switch-case módszerrel úgy íratod ki, hogy
    - ha a month + 1 == 1 (a d.getMonth() 0-től 11-ig adja vissza a hónap számát)
    - és ha magyar a nyelv, akkor január a sztring,
    - ha angol, akkor January
    - stb.?

  • 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]

  • 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!

  • Taci
    addikt

    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

    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

  • Taci
    addikt

    Hozz létre egy .htaccess fájlt a webroot könyvtárban (nálad ez nyilván nem a /var/www/html könyvtár, de hogy hol van, azt csak te tudhatod. Lényegében az a könyvtár, ahol a főoldal index.html van), ha még nincs, és másold bele ezt:

    <FilesMatch "\.(html|htm|js|css|php)">
    FileETag None
    Header unset ETag
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    </FilesMatch>

    A legelső sorban (FilesMatch) láthatod, hogy milyen nevű, illetve milyen kiterjesztésű fájlokra fog vonatkozni ez a kódrész.

    A Header set direktíva azt eredményezi, hogy a webszerver minden egyes válaszába ezeket a fejléceket fogja belerakni.

    A Header set Cache-Control egy cacheléssel kapcsolatos fejléc, ami arra utasítja a böngészőt, hogy ne cachelje az adott oldalt. A többi (Pragma, Expires) inkább csak régebbi böngészők miatt kell.

    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.

  • 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.

  • Taci
    addikt

    Sziasztok!

    Szeretnék megoldást kérni az alábbira, mert csak hasonlót találtam neten, de nem egyértelmű sajnos.
    Adott egy <input type="text" id="test"> terület, ahová szöveges bevitel szükséges. Szeretnék hozzá egy háttér JS-t, ami abban a pillanatban aktiválódik, amint lenyomásra került a "," vessző billentyű.
    Például minden egyes "," lenyomása után jelenjen meg egy alert("megnyomtad a vessző billentyűt");. De ez csak akkor, ha abba az egy adott mezőbe történik a bevitel.

    Lehetséges ilyen?

    Előre is köszönöm a válaszokat!

    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.

  • Taci
    addikt

    Sziasztok!

    Van arra lehetőség, hogy egy általam meghatározott, a szerveremen lévő mappának a tartalmát kilistáztassam JS kóddal?
    Továbbá lehetséges-e olyan, hogy JS kóddal elindítsak egy PHP kódot?

    Előre is köszönöm a válaszokat!

    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.)

  • Taci
    addikt

    Sziasztok
    Van egy táblázatom, ahol szükséges a sorszám oszlopom mezőjének a szerkesztése is. Szeretném ha még elküldés előtt jelezne, ha duplikált sorszámot használnak a táblázat sorszám oszlopában.
    előre is köszi ;)

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

  • 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)

  • 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.

  • Taci
    addikt

    if (ttt == "\n") {
    console.log("Új sor!");
    }

    És ugyanúgy a "\t"-re is beugrik a tab (mert a kódban valóban egy tabot nyomtál be (mármint Mr. Y) - bár kétségtelen, működött. :D ).

  • Taci
    addikt

    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.

    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.

  • Taci
    addikt

    Sziasztok!

    Ha eddig egy adott szöveges változó tartalmából ki akartam nyerni egy-egy részletet, azt a következőképpen tettem:
    value.slice(6,-5)
    Azonban szeretném a váltózó tartalmából egyetlen karakterre egy lekérdezést. Tehát ha adott egy <div id="valtozo">Kecske</div>, és nekem ebből kell a második karakter, akkor oda valam ilyesmi: get(valtozo[1]);. Csak persze működőképesben :)

    Illetve ide tartozó kérdés, amiért egyáltalán kellene ez nekem. Ez egy input változó, amibe be kell másolni egy iratot, amit aztán karakterenként lebontva csinálja azt, amit kell. Csakhogy, a bemásolandó dokumentumok tartalmaznak tabulátort (behúzás) és entert (új sor) is. Ha a szövegben ilyeneket talál, akkor el kell végezie egy mellékes rutint.
    Az addig oké, hogy kell rá egy feltételt tenni, pl if(character == "") {name = "Kati néni";}, a kérdés az, hogy mi kerül az idézőjelek közé (vagy helyére) új sor, illetve tabulátor találásakor.

    Van ezekre (főként utobbira) lehetőség?
    Előre is köszönöm a válaszokat!

    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.

  • Taci
    addikt

    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ó.

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

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

  • Taci
    addikt

    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]

    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.).

  • Taci
    addikt

    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.

    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).

  • Taci
    addikt

    Külön gombra téve a törlést működik a Küldés gombon a script :C
    Ezer hála Taci! :R

    Ö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.)

  • Taci
    addikt

    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?

    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.

  • Taci
    addikt

    É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?)

    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.

  • Taci
    addikt

    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.

    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;

  • Taci
    addikt

    Esetleg ebből kiindulhatnék?
    [link]

    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á)

  • Taci
    addikt

    Sziasztok!

    Borzasztó láma kérdés, de sok helyen találkoztam már példákban vele, azonban nem egészen értem, hol és mikre kell vagy lehet használni a return parancsot. Valaki tud dobni róla egy magyarázót?

    Előre is köszönöm

    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.

  • Taci
    addikt

    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.

    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).

  • Taci
    addikt

    Sziasztok!

    Van egy CSS opció arra, hogy az ugratott görgetés mit csináljon. Nálam két eset játszik: Vagy simán odaugrik, vagy használom a scroll-behavior: shooth; elemet, hogy animáltan menjen a helyére. A kérdésem az lenne, hogy van-e opció arra, hogy ezt (pl gombnyomásra) JS alól kezeljem?

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

  • Taci
    addikt

    Sziasztok!

    Még egy kérdés. Összedobtam egy JSFiddle-t róla.
    Látható, hogy a felhasznóló kétszer látja ugyan azt, holott 2 teljesen eltérő módon lett megalkotva. A problma az, hogy míg a második is szép, nem működik. Ennek mi az oka? Consol.log azt dobja ki, hogy nincs definiálva, mint HTMLXElement. De szerintem meg igen...

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

  • Taci
    addikt

    Sziasztok!

    Nem vagyok 100% biztos benne, hogy ez JS kategória lenne, de hátha.
    Hogyan csinálják azt (számtalan Weboldal), hogy nem tölti be az egészet, csak ha elkezdesz legörgetni egy szintig?

    Infinite scroll a neve, de van más megoldás is, a Pagination.
    Előbbit úgy képzeld el, mint a Fb-ot, görgetsz, görgetsz, de végig a facebook.com-on maradsz. Ahogy sztanozs elmagyarázta.
    Utóbbinál pedig görgetsz, eléred az aktuális "oldal" alját, ott kattintasz egy gombra ("További tartalom" stb.) akkor betölti a következőt, és a címsorban már azt látod a kezdeti sample.com helyett, hogy sample.com/2, aztán /3, /4 és így tovább.

  • Taci
    addikt

    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.

  • Taci
    addikt

    Sziasztok,

    Van egy html kódom, amiben van egy legördülő menü (select).
    JS-el szeretném ellenőrizni, hogy ha a user az alapértelmezett első soron hagyta a menüt( aminek a neve "válassz", akkor írjon ki egy hibaüzenetet (alert), hogy nem választott.
    selectet, hogyan ellenőrzöm Javascripttel?

    Ezt szeretném ellenőrizni:

    <label for="lehetosegek">Válassz lehetőséget!</label>  
    <p><select name="lehetoseg" id="lehetosegID" value="válassz!">      
    <option value="valassz"> válassz!</option>     
     <option value="lehetoseg1"> Lehetőség1</option>     
     <option value="lehetoseg2"> Lehetőség2</option>      
    <option value="lehetoseg3"> Lehetőség3</option>    </select></p>

    Ezzel:
    func.js

    function ellenoriz() {
    userLehetoseg = document.getElementById('lehetosegID')
    if(userLehetoseg.value =='válassz!'){
    alert('Nem választottál lehetőséget!')}

    Jelen állapotban ok gombra kattintva (ez hívja meg a ellenoriz()-t) csak alaphelyzetre állít mindent (Van egy név és egy e-mail cím bekérés is, de azt nem szeretném ellenőrizni, most nem azon van a hangsúly).

    A segítséget előre is köszönöm! Ötletem nincs, hogy mit írjak az if() feltételvizsgálatba.

    Nézd meg ezt, szerintem ezt keresed (mobilról vagyok, alaposabban nem tudom megnézni):
    [link]

  • Taci
    addikt

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

    Igen, abszolút. Már megvan az elgondolás, csinálom előröl, (remélhetőleg) jól.

  • Taci
    addikt

    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.

    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.

  • Taci
    addikt

    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

    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.

  • Taci
    addikt

    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?

  • Taci
    addikt

    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.

    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).

  • Taci
    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.

  • Taci
    addikt

    Sziasztok,

    Találkoztatok már olyan viselkedéssel, hogy a myInput.focus() Androidos Chrome böngészőben egyszerűen nem hajlandó viselkedni? Desktopon és iOS Safariban például tökéletesen működék, de Androidon mintha ez az egy function nem akarna működni.

    É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.

  • Taci
    addikt

    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

    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.)

  • Taci
    addikt

    Hello,
    Volna pár kérdésem:
    - arrNr =0 , tömb hossza = 2
    if (arrNr < zoomKepek.length) {      arrNr++    } else {arrNr = 0;};
    ez miért tud 2-re futni?
    Ha tömb hossza zoomKepek.length-1 et rakok az if condition-ba,csak akkor 0 és 1
    Nem értem miért?
    -html -ben : url("kep.jpg")
    ezt hogy tudom kikérni?

    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.

  • 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.

  • Taci
    addikt

    var userData = lekerdezesEredmenye;

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

    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)

  • Taci
    addikt

    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.

  • Taci
    addikt

    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)

    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.

  • Taci
    addikt

    Sziasztok!

    Csak gondolom, hogy JS, így ide rakom fel a kérdést.

    Vannak olyan Weboldalak, amin ha kijelölsz egy szövegrészt és vágólapra helyezed, akkor oda teszi pl az adot oldal saját webcímét. Ahogyan pl ez is csinálja.

    Ilyet hogyan lehet csinálni?

    Előre is köszönöm

    É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).

  • Taci
    addikt

    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?

  • Taci
    addikt

    Sziasztok!

    Segítségeteket szeretném kérni, szöveg áttetszőség állításban.
    Itt egy példa, amiben szeretném, ha a szöveg áttetsző lenne. Vagyis nem fehér és nem is piros. Úgy szeretném, ha pl a HTML háttere egy kép, amin van egy DIV, aminek piros a hátterre, akkor az azon DIV-en belül eső szöveg legyen a HTML hátterén lévő kép mintájával ellátva.

    Hogy érthetőbb legyek, a megoldásról készítettem egy képet PS-ben:

    Előre is köszönöm a helyes megoldást!

    Esetleg ez a megoldás jó lehet: [link]

  • Taci
    addikt

    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.

    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">

  • Taci
    addikt

    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.

    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"?

  • Taci
    addikt

    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.

    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.

  • Taci
    addikt

    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.

  • Taci
    addikt

    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

    Tapasztalatból tudom, hogy sokak nem is foglalkoznak vele, milyen böngészőt használnak, menjen minden mindenen (ha már egyszer drágán megvették a gépet), így még ha tehetnék, most is IE-ben nyitnának meg mindent. Ezért akarom ezt az ellenőrzést bele, szétesve inkább ne jelenítse meg az oldalt sehogy, helyette egy információs lap, hogy használd ezt vagy azt a böngészőt.

    Plusz valamelyik adblockeres Chrome addon-nál láttam olyan opciót egyből kéz alatt, hogy a Javascriptek futását letiltja teljesen. Na erre is fel akarom készíteni.

    De leghamarabb maximum csak hétvégén lesz időm ezzel foglalkozni (vagy inkább csak bőven később), ezért is szántam még csak puhatolózó kérdésnek.

    Köszönöm a válaszokat.

  • Taci
    addikt

    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.

  • Taci
    addikt

    Sziasztok!

    Elméleti kérdést tennék fel, tehát nem kérek kódot, példát vagy iyesmit.
    Vannak olyan játékok, hogy például elindul egy lézersugár és különböző tükrök módosítják annak útját, ha a felhasználó oda mozgatja az adott elemet. A kérdés az lenne, hogy egy ilyesmi számítás / megjelenítés kivitelezhető HTML + JS -el?

    Egyből a biliárd játékok jutottak eszembe, és találtam is még tutorialt is hozzá:
    JavaScript + HTML5 GameDev Tutorial: 8-Ball Pool Game
    Van forráskód is, illetve maga a játék is a leírásban szereplő linkek alatt.

  • Taci
    addikt

    [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.

    Köszönöm szépen!
    Ez a megoldás tuti eszembe nem jutott volna soha, főleg úgy, hogy csak sokadjára átnézve értettem meg, mi és hogyan is működik benne.

    Az escape-elést pedig már előtte megoldottam, ami keresőszavak a tömbbe bekerültek, azok már "tiszták".

    Köszönöm még egyszer.

  • Taci
    addikt

    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ó ...

    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.

  • Taci
    addikt

    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ó ...

    Teljesen igazad van, a linkelt Google-keresés első találatában ott a megfejtés. És köszönöm szépen, hogy ezen felül még a példakódomra is igazítottad! :R

  • Taci
    addikt

    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

    Na basszus, nekem pont ott törte a sort a böngésző cstomee válaszánál, hogy úgy tűnt, a "jsFiddle" még az előző linkhez tartozik, így fel sem tűnt, hogy az egy külön belinkelt példakód... Munka utána azonnal nézem is, a tiéddel együtt, martonx. :)

    És megfogadom a tanácsot, ha újra elakadnék, linkelek példakódot mindenképp. :)

  • Taci
    addikt

    Ajánlott előtte a textToMark tartalmának escape-elése, ha véletlenül regex számára speciális karaktert tartalmazna.

    var textToMark = "a*b*c";
    var textContainer = "xxxx A*B*C yyyy a*b*c zzzz";

    var escapeRegex = new RegExp(/[.*+?^${}()|[\]\\]/g, "g");

    console.log(textToMark);
    var textToMark = "(" + textToMark.replaceAll(escapeRegex, "\\$&") + ")";
    console.log(textToMark);

    var replaceRegex = new RegExp(textToMark, "gi");
    console.log(textContainer);
    textContainer = textContainer.replaceAll(replaceRegex, "<mark>$1</mark>")
    console.log(textContainer);

    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

  • 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.

  • Taci
    addikt

    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....

    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.

  • Taci
    addikt

    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>");

    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.

  • Taci
    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.

  • Taci
    addikt

    Az én javaslatom, ami szerintem A megoldás, még ha elsőre komplexnek is hathat a js-es barkácsmódszerekhez képest:

    Egyrészt, ha mindent jól csináltál, akkor css media query-ket használtál, azaz tisztán css-ben dől el, hogy ez a div block vagy flex (ezen kicsit elmosolyodtam, hiszen a flex pont erre való, hogy ne kelljen media query-ket se használni, de te tudod, hogy miért jó hol block, hol flex-ként használni, szóval nekem már eleve itt bűzlik valami :B ).

    A tisztán css-es megoldásból kiindulva, csak annyit kell tenned, hogy csinálsz egy css class-t, amit hívj mondjuk .hidden-nek, amiben egyetlen egy rule van: display: none !important;
    Alapból oldal betöltésnél ezen a div-en legyen rajta ez a hidden class. Ezzel elérve, hogy betöltéskor ez az elemed nem fog látszódni. Ha minden igaz, akkor ezt eddig is így csináltad, ha viszont nem, akkor máris nem hiába koptattam a billentyűzetet.

    És amikor gombnyomásra vissza akarod hozni láthatóvá, akkor elég lesz csak ezt a class-t leszedni róla

    document.getElementById("bazinga").addEventListener('click', event => {
    document.getElementById("walami").classList.remove('hidden'); // fejből írtam, nem biztos, hogy hibátlan...
    });

    és voilá, ekkor máris a tisztán css-ben, az adott szabályoknak megfelelő display lesz rá érvényes :) és így nem kell js-ben találgatni, hiszen a js nem erre való (függetlenül attól, hogy js-ben is meg lehet oldani). Separation of Concerns.

    Köszönöm, ezt sikeresen implementáltam én is, nagyon egyszerű (és pont ettől szép) megoldás. :)

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