-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
-
Frissítve: 2014-02-25 10:20 Téma összefoglaló
JavaScript != Java (A JavaScript nem összekeverendő a Javával, két különböző programozási nyelvről van szó!)
Új hozzászólás Aktív témák
-
martonx
veterán
Sziasztok!
Próbálnék egy olyan megoldást csinálni, hogyha eredeti forrásból (CDN) nem sikerül behúzni a kívánt .js fájlt, akkor használja saját szerverről.
Többféle megoldással is próbálkoztam, de egyedül csak a
document.writeműködik, a többi sajnos nem.JSFiddle: https://jsfiddle.net/942fgodv/
(Elsőnek egy Bootstrap JS-t töltenék a példa kedvéért, azt direkt elrontom, aztán jön a fallback, ami a példában egy custom alert JS, szintén CDN-ről.)Tehát az elején szimulálom a CDN elérhetetlenségét, elrontom a linket (1-est írok elé).
Aztán próbáltam egy olyan megoldást, hogy a <script> tagbe írtam egy onerror-lépést, de sajnos nem működik. (Fura, CSS-nél működik.)
Aztán jön a
document.write, ami szépen működik, fel is jön az custom alert, tehát betöltött a 2. JS, és így a custom funkciót is tudta használni.
Eredetileg ezzel a megoldással készítettem el az oldalam ezen részét, viszont a Lightroom lepontozza, azt írja, ne használjam, mert lassíthatja a lassú kapcsolattal rendelkezőknél a betöltést. Ezért keresek más megoldást.Harmadik megoldási kísérletem pedig az, hogy document.head.appendChild()-dal hozzáadom a feltöltött script taget.
Ez szépen hozzá is adja, betöltés után látom, hogy jó helyen van (a custom funkció hívása előtt), viszont gondolom, a HTML feldolgozása nem várja meg, így hamarabb jut a funkcióhíváshoz, minthogy betöltené a hozzá szükséges JS-t, ezért le sem fut.Miért megy document.write-tal, és miért nem appendChild-dal? (Bár gondolom, azért nem, mert aszinkronban tölti le, míg a document.write blokkolja a további feldolgozást addig. És talán pont ezért nem javasolt a használata.)
Tudtok erre a problémára jó megoldást?
(Nem csak a CDN elérhető / nem elérhető helyzetre kell, másra is szeretném használni.)Köszönöm.
szerintem az appendchild-os megoldás is működhet, csak épp rosszul használod. A scritpnek kellene egy onload event vagy valami ilyesmi, és azon belül már működne a swal hívás.
-
Mr. Y
őstag
-
Bzozoo
tag
Most pontosan így működik, és a Google semmit sem lát a JS által kliens oldalon generált tartalomból.
(A search console-ban látom, hogy néha betölti a szükséges JS-t, olyankor van indexelt tartalom is, de aztán "vált", és mondjuk másnaptól már kihagyja a fájlt, így csak egy üres statikus váz van.)
Vannak saját cikkeik is, hogy az indexelő botok már látják a JS által generált tartalmat is, hogy a dinamikusan épülő weblapokat is indexelni tudják - sajnos azonban ez nem tökéletes / vagy nálam van valami baja (amit amúgy látok is - úgy gondolja, hogy az az 1 szál JS fájl neki nem kell és kész, és így bukta az egész oldalépítés).
Ezért akartam szerver oldali összerakásra váltani, viszont mivel az oldal ettől még görgetés után dinamikusan épül fel (infinite scroll), eléggé zsákutcába kerültem. Már a projekt kukázásán és újrakezdésén gondolkodom.De én nem erről beszéltem. Nem arról beszéltem, ahogy nálad van. Arról, hogy nem kell előre generált HTML-eket gyártani. A HTML-t akkor kell előállítaani, amikor a felhasználó lekéri a tartalmat. A felhasználó már csak a generált HTML-t kapja, ami akkor generáloódik szerver oldalon, amikor a felhasználó megnyitja az oldalt.
Node.js, Next.js, Nuxt.js mind tudja ezeket. -
martonx
veterán
Igen, ezért csináltam úgy (kényszer-öszvérmegoldásként), hogy a HTML tartalommal feltöltve és frissen tartva van szerver oldalon, így a Google is látja és indexeli - aztán a kliensen betölt, és a JS lecseréli a legfrissebbre.
Na de ez se nem szép, se nem hatékony. Rossz irány volt.
Úgyhogy ezt el is engedem, és hagyom a dinamikus tartalomgenerálást. Lesznek szerver oldalon pár percenként PHP-val frissített, statikus, tartalommal szépen feltöltött oldalak, a Google-nek lesz mit indexelnie. Nem lesz olyan szép és kreatív mint most (amit amúgy nagyon szeretek), ellenben nem csak a családom és én fogom ismerni és látni...
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.
Inkább váltok valami 1.000.001. standard híroldal-kinézetre. Ehhez mondjuk szerintem nem kell semmi extra, elég a PHP --> SQL --> PHP --> HTML irány, de hátha ti mást mondotok.Köszönöm.
Tanulni mindig jó és hasznos. Kiábrándítani nem akarlak, de ez nem olyan ötlet, amiből valaha is haszon lesz, mindegy, hogy a google látja-e vagy sem.
Tanuláshoz irányok, amiket javaslok:
1. Szerver oldali frameworkök. Ha eddig PHP-ztél, és elégedett vagy vele, akkor valami értelmesebb PHP frameworköt javaslok, mint pl. Laravel, Yii, vagy azt se tudom mik a trendi PHP frameworkök mostanában.
2. Kliens oldali frameworkök. Ezek valóban nem barátai a SEO-nak, de manapság egyre kevésbé megkerülhetőek. Vuejs, React, Angular, Svelte (még talán ez utóbbi a legmegfelelőbb a SEO barát weboldalak kicsit erősebb interaktív irányba felokosítására).
3. Ezt csak nagyon óvatosan mondom, mert ez nagyon szubjektív, de én a helyedben elgondolkodnék az aranyos, játszós nyelv PHP helyett (öhm, tudom hogy most szereztem egy rakás ellenséget, és sokan a szívükhöz kapnak), valami komolyabb, teljesítmény orientált nyelvre váltani backenden pl. Java (Spring), C# (Asp.Net Core), Go (nem tudom milyen frameworkök léteznek hozzá) mennek mostanában. Én személy szerint az Asp.Net Core-ra esküszök, de mondom ez nagyon szubjektív -
martonx
veterán
Most pontosan így működik, és a Google semmit sem lát a JS által kliens oldalon generált tartalomból.
(A search console-ban látom, hogy néha betölti a szükséges JS-t, olyankor van indexelt tartalom is, de aztán "vált", és mondjuk másnaptól már kihagyja a fájlt, így csak egy üres statikus váz van.)
Vannak saját cikkeik is, hogy az indexelő botok már látják a JS által generált tartalmat is, hogy a dinamikusan épülő weblapokat is indexelni tudják - sajnos azonban ez nem tökéletes / vagy nálam van valami baja (amit amúgy látok is - úgy gondolja, hogy az az 1 szál JS fájl neki nem kell és kész, és így bukta az egész oldalépítés).
Ezért akartam szerver oldali összerakásra váltani, viszont mivel az oldal ettől még görgetés után dinamikusan épül fel (infinite scroll), eléggé zsákutcába kerültem. Már a projekt kukázásán és újrakezdésén gondolkodom."viszont mivel az oldal ettől még görgetés után dinamikusan épül fel" - oké, akkor elárulom azt is, hogy a Google majdnem tökéletesen ignorálja azt a tartalmat, amihez görgetni kell.
-
Taci
addikt
Igen, teljesen igazad van. Azóta már rájöttem, hogy ugyanaz lenne a probléma, és hogy pont ugyanúgy kliens oldalon generálódna a tartalom, ahogy most - szóval csak mentem volna egy nagy kört a semmiért.
Úgyhogy marad a B terv, a generált tartalomhoz való hozzáfűzés. Így ez teljesen szerver oldali generálás lesz, JS csak akkor fog futni, ha a felhasználó a görgetésben az utolsó elemek közelébe ér (infinite scroll). Így a JS állomány nagy részét (amik eddig a tartalomgenerálásért voltak felelősek) elég ha a csak FCP (First Contentful Paint) után húzom be (async? Ennek még utána kell néznem amúgy is: [link]), de ez még arrébb van kicsit.Köszönöm.
Sajnos nem jó a B terv, nagyon sok a probléma vele. Így mennék még egy kört:
Adott egy tartalommal feltöltött div:
<div id="content">Tartalom</div>Meg lehet szakítani / kihagyni az adott div renderelését?
<div id="content"><script>if (jsBetoltve == 0){ //content div betöltésének átugrása }</script>Tartalom</div>És az elrejtés (display:none, z-index stb.) sajnos nem ajánlott a SEO szempontjából, sok cikket átolvastam a témában.
Ott kell hogy legyen a tartalom a szerveren, az sem nagy baj, hogy azt a plusz pár kB-ot le kell tölteni, viszont eléggé zavaró, ahogy látszódik egy pillanatra, mielőtt a JS lenullázná a div-et. (Hiszen rendereli, ha már benne van.)
Köszönöm.
-
sztanozs
veterán
Köszönöm (sztanozs, neked is), a példakódot is (jó a fejcsere
) .
Viszont a tartalom elrejtését már az elején kizártam, mert a Google nem mindig egyértelműen áll hozzá (rendben van, látja, indexeli - vagy épp SEO-manipulálásnak tartja, és ejnyebejnye). És az egész átalakításom lényege pont az, hogy a G felé rendben legyen az oldal.Talán megpróbálom úgy, hogy üres lesz a div, és ha a (tartalomgeneráláshoz) szükséges JS-ek közül nem töltődött be bármelyik is, akkor behúzza oda az előre generált tartalmi részt. Máskülönben pedig üresen hagyja, és engedi, hogy a JS végezze a dolgát.
Nagy vonalakban:
https://jsfiddle.net/1dgyfs2v/
(disy68, a példakódodban van pár rész, amit így is fel tudok használni, köszönöm.)Bár jobban szeretném, ha nem csak utólag, szkripttel rakna bele tartalmat - hisz' az egész kálváriám abból indult eleve. Na de ezt már kisakkozom valahogy, most már elég lehetőségem van. Köszönöm a segítséget.
Talán megpróbálom úgy, hogy üres lesz a div, és ha a (tartalomgeneráláshoz) szükséges JS-ek közül nem töltődött be bármelyik is, akkor behúzza oda az előre generált tartalmi részt.
De ha a robot épp nem futtat JS-t, akkor ezt hogy oldod meg? -
disy68
aktív tag
Sziasztok!
Szeretném azt elérni, hogy ha egy adott szkript (külső JS fájl) nem tölt be, akkor az adott div tartalma kiürítésre kerüljön még feldolgozás előtt, sőt, ha lehet, be se töltődjön:
https://jsfiddle.net/byvfcex0/Most egyelőre kb. csak így tudtam megoldani, ahogy a példában van, viszont a Network tabon látszódik, hogy ettől a div tartalmát még feldolgozza nyilván, a képet is betölti, és csak utána üríti - és ez így nem a legjobb.
A háttér:
Kliens oldalon JS által generálódik a div tartalma, viszont a Google nem (mindig) tölti be a hozzá szükséges JS-t, így indexeléskor nem lát tartalmat.
Ezért most már szerver oldalon generálom le a tartalmi részt - viszont ez nem a legfrissebb, nem ugyanaz, mintha amikor a felhasználó betölti az oldalt, és a pár mp-es frissen (kliens oldalon) generált adatok ott vannak.Ezért betöltéskor szeretném azt elérni, hogy:
- ha a szükséges JS nem lett betöltve (Google indexel), akkor ott van a szerver oldalon generált tartalom, 1 óránként frissítve,
- viszont ha betöltött a JS (normál felhasználó), akkor a div tartalma eleve fel se legyen dolgozva, mert a JS úgyis kiüríti és friss tartalommal tölti fel. (Az a plusz pár kB-nyi HTML-rész pedig nem akkora vérveszteség.)Most is működik, viszont az első pár képet feleslegesen tölti be, mert azonnal kukázva lesz (a többi lazyload-os, szóval nem számít), illetve egy pillanatra látszódik is a tartalom, amit aztán a JS leszed, és ez nem tetszik.
Meg lehet oldani, hogy a szkript betöltésének sikerességétől függően dolgozza fel a div tartalmát / vagy skippelje?
Van B tervem is (és C is), dobom a div törlését, és a szerver oldalon generált tartalomra építek, csak sűrűbbre veszem a generálását, 5 percre, és ahhoz fűzöm hozzá a többi tartalmat. Csak ez sok módosítás, így ha megoldható az első változat, azt csinálnám.
Köszönöm.
Nekem is hasonló megoldás jutott eszembe, mint sztanozsnak. Alapból elrejted a generált tartalmat, a betöltendő js-ben jön a függvény, ami betölti az új content-et, amit ellenőrzöl, hogy létezik-e, ha nem akkor megjeleníted a generált tartalmat, ha igen, akkor meghívod a betöltött js-ből az új content letöltést, ami a végén meg is jeleníti a betöltött tartalamat.
Ha a generált html-ben a képeket se akarod betölteni, amíg nem muszáj, akkor generáld úgy őket, hogy az src-t berakod data attribútumba amit akkor állítasz be, amikor nem töltött be js fájl.
-
sztanozs
veterán
Sziasztok!
Szeretném azt elérni, hogy ha egy adott szkript (külső JS fájl) nem tölt be, akkor az adott div tartalma kiürítésre kerüljön még feldolgozás előtt, sőt, ha lehet, be se töltődjön:
https://jsfiddle.net/byvfcex0/Most egyelőre kb. csak így tudtam megoldani, ahogy a példában van, viszont a Network tabon látszódik, hogy ettől a div tartalmát még feldolgozza nyilván, a képet is betölti, és csak utána üríti - és ez így nem a legjobb.
A háttér:
Kliens oldalon JS által generálódik a div tartalma, viszont a Google nem (mindig) tölti be a hozzá szükséges JS-t, így indexeléskor nem lát tartalmat.
Ezért most már szerver oldalon generálom le a tartalmi részt - viszont ez nem a legfrissebb, nem ugyanaz, mintha amikor a felhasználó betölti az oldalt, és a pár mp-es frissen (kliens oldalon) generált adatok ott vannak.Ezért betöltéskor szeretném azt elérni, hogy:
- ha a szükséges JS nem lett betöltve (Google indexel), akkor ott van a szerver oldalon generált tartalom, 1 óránként frissítve,
- viszont ha betöltött a JS (normál felhasználó), akkor a div tartalma eleve fel se legyen dolgozva, mert a JS úgyis kiüríti és friss tartalommal tölti fel. (Az a plusz pár kB-nyi HTML-rész pedig nem akkora vérveszteség.)Most is működik, viszont az első pár képet feleslegesen tölti be, mert azonnal kukázva lesz (a többi lazyload-os, szóval nem számít), illetve egy pillanatra látszódik is a tartalom, amit aztán a JS leszed, és ez nem tetszik.
Meg lehet oldani, hogy a szkript betöltésének sikerességétől függően dolgozza fel a div tartalmát / vagy skippelje?
Van B tervem is (és C is), dobom a div törlését, és a szerver oldalon generált tartalomra építek, csak sűrűbbre veszem a generálását, 5 percre, és ahhoz fűzöm hozzá a többi tartalmat. Csak ez sok módosítás, így ha megoldható az első változat, azt csinálnám.
Köszönöm.
Azt tudod csinálni, hogy alapból eltakarod / eltünteted a DIV-et és csak akkor jeleníted meg, ha a JS felülírta. Esetleg beleraksz egy 1x1-es IMG-t és az ALT szövegbe betöltöd azt, amit a DIV-be tennél és azt berántja a google.
-
martonx
veterán
Azt hogyan lehetne szépen kezelni, ha a többi elem csak később generálódik?
Esetemben görgetés után, de a példában úgy csináltam, hogy 1mp után tölti be a 3. és 4. elemet:
https://jsfiddle.net/vsecyd1t/Ha így oldom meg:
https://jsfiddle.net/vsecyd1t/2/
akkor az összes elemre újra megcsinálja. 4 elemnél még oké, de ha esetemben már a 200. elemnél jár a görgetésben, akkor az már pazarlás.Plusz a 3. és 4. elem betöltése után ha az 1. vagy a 2. elemre kattintok, duplán hívja meg a funkciót. (A másik alertet direkt kiszedtem, hogy egyértelmű legyen, hogy mikor hív duplán.)
Hogyan lehetne ezt jól megoldani?
Köszönöm.van ám olyan is, hogy removeeventlistener. Hm vagy még jobb megoldás, hogy megjelölöd azokat, amihez már adtál eventlistenert. És akkor elég csak azokhoz adni, amik még nem kaptak.
Csak minimális változtatás kellett

[link] -
martonx
veterán
Ahogy most van:
https://jsfiddle.net/swndoygm/Ahogy szeretném, de nem áll össze:
https://jsfiddle.net/swndoygm/1/Köszönöm.
-
nevemfel
senior tag
Sziasztok!
Adott az alábbi típusú HTML elem:
<a id="category1"href="https://pelda.hu/category1"onclick="funkcio('categories', 'category1'); return false;">Category1</a>Ezeket szeretném megcsinálni úgy, hogy ne legyen a HTML kódban az onclick esemény:
<a id="category1"href="https://pelda.hu/category1">Category1</a>Ezt a kódot készítettem hozzá:
for (var i = 0; i < categoriesArray.length; i++){var element = document.getElementById(categoriesArray[i]);element.addEventListener("click", function(e){funkcio(0, categoriesArray[i]);//alert('element: ' + element);e.preventDefault();});}Azt szeretném, hogy menjen végig a tömb összes elemén (amik az elemek ID-jai), majd mindegyikhez állítsa be, hogy kattintás esetén fusson le a funkcio() függvény (csak a példa kedvéért a név) paraméterként a tömbelemet megkapva. A preventDefault azért kell, hogy ilyenkor ne kövesse a href linkjét.
Az alertet azért raktam bele, hogy lássam, mit csinál - és azt látom, hogy az összes elemnél a tömb utolsó elemét mutatja.
Elég sok találat van rá neten (például ez), de eddig egyikkel sem sikerült megoldanom.
Tudnátok segíteni benne? Köszönöm.for (var i=0; -t cseréld,for (let i=0;-re.Lehet, hogy a másik var-t is cserélni kell.
-
martonx
veterán
Sziasztok!
Adott az alábbi típusú HTML elem:
<a id="category1"href="https://pelda.hu/category1"onclick="funkcio('categories', 'category1'); return false;">Category1</a>Ezeket szeretném megcsinálni úgy, hogy ne legyen a HTML kódban az onclick esemény:
<a id="category1"href="https://pelda.hu/category1">Category1</a>Ezt a kódot készítettem hozzá:
for (var i = 0; i < categoriesArray.length; i++){var element = document.getElementById(categoriesArray[i]);element.addEventListener("click", function(e){funkcio(0, categoriesArray[i]);//alert('element: ' + element);e.preventDefault();});}Azt szeretném, hogy menjen végig a tömb összes elemén (amik az elemek ID-jai), majd mindegyikhez állítsa be, hogy kattintás esetén fusson le a funkcio() függvény (csak a példa kedvéért a név) paraméterként a tömbelemet megkapva. A preventDefault azért kell, hogy ilyenkor ne kövesse a href linkjét.
Az alertet azért raktam bele, hogy lássam, mit csinál - és azt látom, hogy az összes elemnél a tömb utolsó elemét mutatja.
Elég sok találat van rá neten (például ez), de eddig egyikkel sem sikerült megoldanom.
Tudnátok segíteni benne? Köszönöm.Hú, de ronda. Egy jsfiddle-t csinálj hozzá légyszi, hogy megírhassuk szépre.
-
martonx
veterán
Meg tudnátok mondani, kérlek, hogy JS-ben mi a helyes hivatkozási "forma" a szerveren lévő fájlokra?
Jelenleg így használom (példának most még csak az Axios-t tudom felhozni, de ettől még jó példa):
axios.get("../html/feed_item.html")HTML-ben pedig így:
<script src="../js/script.js?v=1.0.0"></script>Tehát nem a teljes elérési út van megadva, csak a jelenlegi mappára viszonyítva, és ahhoz képest itt pl. ugye egy mappával visszább :
../Nem hiszem, hogy saját kútfőből csináltam volna így, és most randomra megnéztem pár weboldalt, és ott sem egységes. Ezeket láttam még:
- teljes elérési útvonal (https://pelda.hu/js/script.js)
- egy db /-jellel kezdve (/media/product/.....)
- két db /-jellel kezdve (//stat.pelda.hu/script.js)Melyik a "helyes" (vagyis inkább ajánlott) módszer?
Azzal amit jelenleg használok, most egy kis probléma adódott, ahogy új aloldalakat hoznék létre, mert mivel új almappákba kerültek, a szükséges fájlok már más útvonalon vannak az előzőhöz képest. Ezért szeretném kikérni a véleményeteket, melyik irányba változtassak.
Nem tudom, van-e előnye/hátránya bármelyiknek is, de ti hátha tudjátok.
Nekem a teljes elérési út lenne a leglogikusabb, mégis, találtam jó pár nevesebb weboldalt, ahol nem így van - és nem tudom az okát.Köszönöm.
Ha egy url /-el kezdődik, akkor az jelenti azt, hogy a root url-hez képest.
Azaz a helyes megoldás a "/js/script.j?v=1.0.0"
A teljes elérési útvonalas megoldás is jó még, de ennek csak akkor van értelme ha pl. CDN-t használsz.
A // kezdetű ugyanez, csak az megengedi mind a http, mind a https-t, egy időben divat volt, de http-t már senki nem használ, szóval értelmetlen. -
martonx
veterán
No igen, ezért is írtam, hogy itt nézd. A böngészőben localhoston minden villámgyors

Azért képeket is tartalmazó oldalnál lassú 4G emulálással is simán lehet 90 pont felett szerezni az igazi pagespeeden. -
martonx
veterán
Ne lighthouse-ban (böngésző F12) nézd, hanem a pagespeed weboldalán a google-nek: PageSpeed Insights (web.dev)
És itt is igaziból mostanra egyedül a mobilos szám számít, a google már csak ezt veszi bele a rangsorolásba. -
martonx
veterán
Köszönöm a tanácsot.

A 800kB-nyi JS-t sikerült 250kB-ra összehúznom, és a felesleges CSS-eket is kigyomláltam, (eddig észre sem vettem, hogy ilyen rengeteg felesleges volt benne...) így a kezdeti 1MB-ból lett 650kB. Ami még így is sok, de majd innen folytatom.Viszont most már egyértelműen szóba áll velem a Google - legalábbis a fájlok mennyisége már nem zavarja.

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

Látod - látod :D
Itt kezdődik a webfejlesztés. Cms fölé template-et minden hülye be tud húzni, az fölé minden hülye össze tud kókányolni valamit. Aztán meg megy a csodálkozás, hogy miért lett szar a végeredmény.
Örülök, hogy te normálisan állsz hozzá. -
martonx
veterán
Sziasztok!
A Google Search Console-ban látom, hogy a Googlebot rendre kihagy random JS-fájlokat, amikor az oldalamat indexeli. (És .css és .jpg fájlokat is, de az nem érdekel most annyira.)
A probléma az, hogy az oldal tartalmi részét a JS fájlok töltik fel, így amikor kihagyja őket, nem, vagy nem teljesen tölt be az oldal, így indexelés közben csak egy üres vázat lát.
Keresem, mi lehet a jó megoldás rá.
- Pár helyen azt írják, ha a fájlnevek sorrendjében tölti be a fájlokat, aztán amint elérte a limitet, hagyja a többit. Ezért ott azt javasolják, hogy a fontos JS fájlok mondjuk számokkal kezdődjenek. Pl. 01-fontos.js, 02-kevesbe-fontos.js, 09-abszolut-nem-fontos.js.
Ennek viszont ellent mond, hogy legutóbb pl. a bootstrap.min.js fájlt hagyta ki, holott az szinte a legelső az ABC-sorrendben.
- Máshol azt ajánlják, hogy össze kell vonni a JS fájlokat. Most 25 db JS fájlt használ az oldal, ezt amúgy a SEO checkerek rendszeresen szóvá is teszik. Ebből 9 db az enyém (a többi a HTML template-hez volt, és már abból is kiszedtem mindet, aminek a hiánya nem okozott hibát), ezeket össze tudom vonni, ha muszáj. Összesen amúgy 800kB ez a 25 JS fájl, az enyém ebből 100kB.
Viszont máshol meg azt írják, ez (az összevonás) csak régen volt hatásos, most már néha lassíthatja is a betöltést. Mondjuk az a pár század mp pont nem érdekel, ha a másik oldalon meg az van, hogy a be nem töltött JS-ek miatt az oldal tartalmi része üresen marad az indexelésnél.Még a CSS fájlokat is összevonhatom, hogy minél kevesebb fájl legyen a végén. De nem tudom, hogy a Googlebot csak darabszám alapján hagy ki fájlokat, vagy a fájlméretet is nézi.
Tudnátok ebben a témában tanácsot adni?
PageSpeed, hátha mond valami hasznosat, amit én nem értekKöszönöm.
Css és Js file-okat valóban érdemes összevonni (ezt hívják bundle-nek).
Viszont ettől függetlenül a SEO legnagyobb barátja a server side rendering. Minden más, ami nem server side renderelődik, kétesélyes hogy megjelenik a google bot számára.
800kbyte js, óriási. Ha a google bot valami css, js-t nem tud X másodperc (de ez inkább kisebb, mint 1) alatt betölteni, akkor inkább hagyja a fenébe, nincs ideje szarakodni a lassú weboldalakkal.
Nem véletlenül írtam le, hogy nem kellene mindeféle szart behúzkodni kliens oldalra, mint pl. axios, amik csak totál feleslegesen növelik a bundle size-ot, és lassítják le az oldalt, rontják a pagespeedet. Cserébe legalább semmit sem adnak
-
disy68
aktív tag
Köszönöm a tanácsot.
Átállítottam 1.1.1.1-re, és egy bő 10 percig próbáltam előhozni a lassulást, de nem sikerült.
Viszont azt nem értem, hogy miért kellett az újabb DNS lookup?
Mármint böngészek az oldalon egy ideje, így a DNS lookup a szerveremre nyilván már az eleje óta megvolt, másképp be se töltött volna.
Aztán böngészek-böngészek, és egyszer csak belassul (előző screenshot), és írja, hogy megint volt egy lookup.
Nagyon felületesek az ismereteim a témában, de nem úgy van, hogy X időre cacheli, hogy ez a domain ez az ip cím? És amíg él a cache, addig nem kérdezi újra.
Most vagy ilyen rövidre van állítva a cache (kinél? szolgáltatónál?), vagy valami máshol mással van a baj?(Kérlek, javíts ki bármiben, amit rosszul tudok. Persze csak amennyire időd engedi.
)Köszi.
@martonx: De az akkor nem DNS Lookup-ként jelentkezne, hanem a kliens és szerver közötti kommunikácóban, a php által visszaadot értékekben. Erre látom is a számokat (F12 - Network alatt) a megfelelő axios-os hívásnál, de mind jó érték. (Persze ettől még belassulhat a szerver, de ez amit elkaptam és ennyiszer sikerült megismételni pont nem ez volt - legalábbis így látom, de simán tévedhetek, nagyon új ez még nekem.)
Nem ismerem mélyen én se a témát, lehet, hogy a szolgáltatónál van valami hiba/rossz konfig, de az is lehet, hogy csak nálad lokál akadt össze valami és okozta a problémát és az új dns szerver miatt jött helyre a dolog
Amíg ez nem jön elő tömegesen a felhasználóknál, addig nem ölnék bele túl sok energiát, hogy kiderítsem mi és hol csúszott meg.
-
martonx
veterán
Bocs a sok szövegért és a már 3. bejegyzésért egymás után, de közben a Network fül alatt ezt találtam:

Ez már nyilván nem JS-téma, és máris nézek ennek is utána, de igazából még most látok ilyet először (közben ezt kezdem el olvasni hozzá: [link] ) , nem tudom, merre kezdjek neki a "javításnak". Esetleg szerver oldalon kell valamit átállítanom? Vagy ilyen a szolgáltató sebessége?
Tudok ezzel valamit kezdeni?Szerintem csak hiszed, hogy a szerver gyors. Pontosabban időnként belassul, és ezt tapasztalod.
-
disy68
aktív tag
edit: állítsd át a dns kiszolgálód címét pl. 1.1.1.1-re vagy 8.8.8.8-ra esetleg (gépen/routeren) ha így jobb, akkor net szolgáltatód dns feloldása lassú (lassúságot nem, de olyat tapasztaltam szolgáltatói dns szervernél, hogy nem tudott feloldani valamit)
Nézd meg dev-tools (F12) network fülön, hogy pontosan meddig tartanak az egyes kérések vagy logold ki az összesnél, mikor indul és mikor jön válasz. Szerintem nem az "első" hívás tart sokáig, hanem az összes. Ellövöd a kéréseket egymás után és azok visszatérnek lassan, amiből azt látod, hogy az első lassú volt és ahhoz képest a többi meg gyors, mert async mennek a kérések. Persze így nulla kód mellett csak találgatni lehet.
-
Taci
addikt
Bocs a sok szövegért és a már 3. bejegyzésért egymás után, de közben a Network fül alatt ezt találtam:

Ez már nyilván nem JS-téma, és máris nézek ennek is utána, de igazából még most látok ilyet először (közben ezt kezdem el olvasni hozzá: [link] ) , nem tudom, merre kezdjek neki a "javításnak". Esetleg szerver oldalon kell valamit átállítanom? Vagy ilyen a szolgáltató sebessége?
Tudok ezzel valamit kezdeni? -
Taci
addikt
Sziasztok!
Nem igazán tudom, miért, de néha kb. 2 mp-el megnő az egyes aloldalak/menüpontok (JS-sel generált tartalom) betöltése.
Nem tudom megfogni, hogy pontosan mikor, mert sosem ugyanott, sosem ugyanakkor - de nagyon szeretném kideríteni az okát.
Először arra gondoltam, az SQL query-m lassú, és amiatt tölt be lassabban néha az egy-egy eredmény.
De megcsináltam egy dev aloldalt hozzá, ahol máshogy (optimalizáltabban) rakom össze a lekérdezést ugyanabból az adatabázisból, egymás mellé raktam a két oldalt (sima és dev), és ugyanazokat ugyanúgy töltöttem be, és ahol lassú volt az első, lassú volt a második is. Szóval nem a query a baja.Mivel produktív oldal, a logolást leszedtem, de most a deven a megfelelő helyeken visszakapcsoltam, és meglepő eredményt találtam (a logok így jönnek a konzolban sorrendben):
(1) 16:06:49.994 showJS.js?v=1.0.4:176 Script (showJS) started.
(2) 16:06:49.995 showJS.js?v=1.0.4:424 Calling first axios
(7) 16:06:49.997 showJS.js?v=1.0.4:733 Script (showJS) finished.
(3) 16:06:51.465 showJS.js?v=1.0.4:429 titleHTML (axios.get)
(4) 16:06:51.494 showJS.js?v=1.0.4:551 itemHTML (axios.get)
(5) 16:06:51.604 showJS.js?v=1.0.4:557 frontend.php (axios.get)
(6) 16:06:51.606 showJS.js?v=1.0.4:640 Displaying results.Az elején a számok (pl. (1)) azt jelzik, milyen sorrendben következnek a console.log-ok a szkirptben.
Aztán az időbélyegző. Itt akadt meg a szemem azon, hogy két közvetlen egymás alatt lévő lépés között 2 mp időkülönbség van:
(2) 16:06:49.995 showJS.js?v=1.0.4:424 Calling first axios
(3) 16:06:51.465 showJS.js?v=1.0.4:429 titleHTML (axios.get)Tehát a 424. sorban logoltatom, hogy most jön az első
axios.get,
a 426. sorban ez lefut,
a 429.-ben pedig kiíratom a visszakapott választ:console.log("titleHTML (axios.get): " + response);Na ennek a műveletnek néha 2 mp-re van szüksége, holott egy 1kB-os fájlról van szó...
Néha gondolkodás nélkül behúzza, máskor meg ott pörög a kis loader 2 mp-ig, mire végre hajlandó csinálni. Nem kell csinálnia a fájllal semmit, csak a benne lévő kemény 4-5 sornyi HTML-kódot visszaadni.
Az a fura még, hogy utána hív ugyanígy egy másik html fájlt pont mellőle (4. lépés), aztán meg szerver oldalon végez több bonyolult műveletet is (köztük az SQL-lekérdezést és annak kiértékelését is), és annak az eredményét adja vissza (szintén axios a közvetítő közeg) az 5. lépésben, és ennek a kettőnek együtt is bőven elég pár század mp.A szerver gyors, ez látszik az SQL-es részből is, SSD-n is van, szóval azt kizárnám.
Esetleg az axios-szal lenne a baj? De ha igen, mi?Az első axios:
axios.get("../location/title.html")A második:
axios.get("../location/item.html")A harmadik:
axios.get("../location/frontend.php?a=...&b=...)Van tippetek, mi lehet itt a bibi?
Persze átrakhatnám JS-be a HTML tartalmát, de azért az nem oké, hogy egy 1kB-os fájl akassza meg a rendszert. Plusz lehet, az axios-szal van a baj (vagy bármi mással), és akkor a következő fájlnál lassulna be.Hátha ti láttok ebben valami javítható dolgot, mert nekem nem áll össze, mi ez a 2mp-es delay.
Köszi!
Kiszedtem belőle az első axios-t, de most is ugyanúgy előjön (már amikor), és most az eddigi második (most már első) axios-nál "üldögél" 2 mp-et.
Szóval nem a fájllal van baja. De akkor mivel? -
Mr. Y
őstag
Köszi az infót. És be lehet állítani valahogy, hogy ne a kliens adataival dolgozzon?
Ugyanis roppant fontos volna nekem, hogy ténylegesen másodpercre pontosan a helyes időt nézze a műveletekhez -
Taci
addikt
Sziasztok!
Van egy Windows és Android alatti böngőszőkben jól működő keresőm, ami viszont Safarin nem 100%-os.
Első körben kezdeném mondjuk azzal, hogy nem ismeri fel a keyup eventet:
elementMainSearch.addEventListener("keyup", function(event) {console.log('Typing to searchbox.');}Ez például csak akkor ír a konzolba Safari alatt, ha Shift vagy Ctrl gombokat nyomok. Semmi másra nem reagál. A keresőmezőbe persze beírja amit írok, csak a lenyomáshoz (felemeléshez) kötött funkciókat nem hívja meg.
Hogyan lehet ezt megoldani? Hátha ti már tapasztaltátok (és megoldottátok ezt).
Aztán később van egy feltétel, ahol az Enter leütését vizsgálom:
if (event.keyCode === 13) {}
Nem tudom, abba is belerondít-e, odáig még "nem jutott el", de inkább már nem írok külön bejegyzést erről.Köszi!
Annyira haladtam a témában, hogy valamiért a
keyup-ot nem szereti, viszont akeydown-nal és akeypress-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, hogyelementMainSearchValue: 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:qqwe--> 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.:
Azinputevent lesz a jó, úgy látom. -
Taci
addikt
Sziasztok!
Van egy Windows és Android alatti böngőszőkben jól működő keresőm, ami viszont Safarin nem 100%-os.
Első körben kezdeném mondjuk azzal, hogy nem ismeri fel a keyup eventet:
elementMainSearch.addEventListener("keyup", function(event) {console.log('Typing to searchbox.');}Ez például csak akkor ír a konzolba Safari alatt, ha Shift vagy Ctrl gombokat nyomok. Semmi másra nem reagál. A keresőmezőbe persze beírja amit írok, csak a lenyomáshoz (felemeléshez) kötött funkciókat nem hívja meg.
Hogyan lehet ezt megoldani? Hátha ti már tapasztaltátok (és megoldottátok ezt).
Aztán később van egy feltétel, ahol az Enter leütését vizsgálom:
if (event.keyCode === 13) {}
Nem tudom, abba is belerondít-e, odáig még "nem jutott el", de inkább már nem írok külön bejegyzést erről.Köszi!
Can I Use szerint pedig mennie kellene... [link]
-
nevemfel
senior tag
Na ez teljesen jogos.
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?
A módszer ismert ( [link] ), a probléma meg az, hogy neked kell kézzel verzióznod az összes belinkelt forrásfájlt (css, js, img). Ha csak egy-két fájlról van szó, nem probléma, ha 15-ről, akkor, jó, ha sok szabadidőd van.
A másik lehetőség, hogy valami build toolt (pl. babel) használsz a css, js generáláshoz, ami megoldja, hogy ha a fájlok változnak, akkor a html-be beszúrt verziót automatikusan frissíti. De ez már haladó szint.
-
martonx
veterán
Na ez teljesen jogos.
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?
Jól használod. @nevemfel csak azt jegyezte meg, hogy ez ugyan egy tök jó módszer, csak nagyon törékeny, mert nagyon könnyű elfelejteni a huszonyolcadik file-ban is átírni a verziószámot. Vagy pedig külön automatizmust érdemes rá készíteni.
A böngésző teljes url alapján cache-el. És ezt használja ki ez a módszer. Az már csak, nekünk embereknek fontos, hogy olvasmányos ?v=1.0.0 legyen az url vége. Ez itt lehetne ?myversion=kiskutya is a böngészőnek édesmindegy. Ezt becacheli, és amíg pontosan ugyanez az url kell, addig cacheből szedi elő, amit kell. Ennyi.
-
nevemfel
senior tag
Javítsatok ki, ha tévedek,
de ezzel a megoldással ezeket a fájlokat újra és újra letölti a kliens. Tehát hiába nem változtattál semmit rajtuk 1 éve, a kliensek minden alkalommal újra és újra letöltik.
Persze ez a korlátlan adatforgalom világában már nem akkora probléma, de jó figyelni erre is.Itt a fórumon valamelyik topikban ajánlottá(to)k ezt a megoldást:
<link rel="stylesheet" href="/fajlmappa/style.css?v=1.0.0"><script src="/fajlmappa/javascript.js?v=1.0.0"></script>
stb.Ez a html kódban van, és amíg nem változtatsz a verziószámokon, nem tölti le újra, cache-ből használja, ha tudja. Ha változtatsz a fájlok tartalmán, akkor pedig itt is verziót emelsz, így a kliens az új verziót tölti le és használja.
Hátha ez (is) hasznos lehet.
Ez a módszer akkor jó, ha létezik valamiféle automatizmus a verziószám kezelésre. Kézzel elég macerás minden fájlt megfelelően verziózni, rádaásul könnyű elfelejteni.
-
martonx
veterán
Javítsatok ki, ha tévedek,
de ezzel a megoldással ezeket a fájlokat újra és újra letölti a kliens. Tehát hiába nem változtattál semmit rajtuk 1 éve, a kliensek minden alkalommal újra és újra letöltik.
Persze ez a korlátlan adatforgalom világában már nem akkora probléma, de jó figyelni erre is.Itt a fórumon valamelyik topikban ajánlottá(to)k ezt a megoldást:
<link rel="stylesheet" href="/fajlmappa/style.css?v=1.0.0"><script src="/fajlmappa/javascript.js?v=1.0.0"></script>
stb.Ez a html kódban van, és amíg nem változtatsz a verziószámokon, nem tölti le újra, cache-ből használja, ha tudja. Ha változtatsz a fájlok tartalmán, akkor pedig itt is verziót emelsz, így a kliens az új verziót tölti le és használja.
Hátha ez (is) hasznos lehet.
A kettőt összekombinálni is lehet ám

Pl. csak a html file-ra beállítani, hogy mindig töltse le a böngésző. A többi file-t pedig hagyni a böngésző a megadott verzió szám alapján eldöntse, hogy le kell-e töltenie.Mert a nálad lévő módszer tök jó, de mi van akkor, ha maga a html file cachelődött be a böngészőben? Akkor hiába raksz ki egy új html file-t, amiben megemelted a css, js verziókat, ha erről a böngésző mit sem fog tudni, és vígan használja az előző html-edet, benne a régi verziójú css, js hivatkozásokkal?

-
Taci
addikt
Valami ilyesmivel kellene kezdeni:
var elementTest = document.getElementById("test");elementTest.addEventListener("keyup", function(event) {if (event.keyCode === 188) {//vessző lett nyomva}}Innen szedtem ki, hogy a vessző keycode-ja a 188.
A keyup akkor "ugrik", ha felengeded a billentyűt. Ha neked már az is kell, amikor lenyomja, akkor az a keydown lesz.
-
Mr. Y
őstag
Szia!
Direktben a JS szerintem nem fog tudni hozzáférni a szerveren lévő tartalomhoz. Ehhez kell a PHP és a JS közötti kapcsolódás (második része a kérdésednek).
Én erre az Axios-t használom: [link]
(Használhatsz Ajaxot is, de sokmindenre kell figyelni később, ha "élesben" akarnád használni, úgyhogy jobban jársz, ha már eleve az Axios-szal kezdesz. Ajax: [link] )Írnod kell egy .php szkriptet, ami listázza a mappa tartalmát, és ezt az adatot visszaadja Axios-on keresztül a JS-nek.
(Ha a -megfelelő- gép mellett leszek, segítek majd az Axios-ban, ha kell, addig nézd átt a linkelt oldalt, beszédesek a példák benne.)
Köszönöm a linkeket és a segítő szándékot, de ha ezen kívül nincs más opció, akkor hanyagolom. Alapelvem, hogy nem használok más által kidolgozott kódot.

-
laracroft
senior tag
-
laracroft
senior tag
-
Mr. Y
őstag
-
Taci
addikt
Nem lehet, hogy az a szöveg még a W3-as oldalról került oda?
Mert nekem sem megy a jsfiddle-ről. Először nekem is ott volt a szöveg, aztán arra gondoltam, lehet, csak a W3-as vágólapos másolásról, szóval másoltam valami más szöveget rá, aztán vissza a jsfiddle-be, és az előzőleg másolt tartalmat illeszti be vágólapról.@Mr. Y: Nekem pont van ilyen fícsör a weblapon, működik is szépen, bemásolom majd, amint gépközelben leszek.
Parancsolj: [link] (anno én is valahol stackoverflow-n találtam)
-
Mr. Y
őstag
Nem lehet, hogy az a szöveg még a W3-as oldalról került oda?
Mert nekem sem megy a jsfiddle-ről. Először nekem is ott volt a szöveg, aztán arra gondoltam, lehet, csak a W3-as vágólapos másolásról, szóval másoltam valami más szöveget rá, aztán vissza a jsfiddle-be, és az előzőleg másolt tartalmat illeszti be vágólapról.@Mr. Y: Nekem pont van ilyen fícsör a weblapon, működik is szépen, bemásolom majd, amint gépközelben leszek.
Köszönöm
-
Mr. Y
őstag
Hmm. Én a tabokat kiszedem, így arra a trim()-et használom, és nem direktben azt keresem. Az input mezőt pedig csak egy sorosra állítottam (kereséshez), így nincs új sor (bemásolva sem).
De az előzőben leírtakat találok máshol is: [link]
enteredText = textareaVariableName.val();numberOfLineBreaks = (enteredText.match(/\n/g)||[]).length;characterCount = enteredText.length + numberOfLineBreaks;De ezt tényleg ki kell próbálni. Remélhetőleg ezek közül valamelyikkel működni fog.
Annyi a pontosítás kedvéért, hogy nem input hanem textarea. A másik pedig, hogy számomra fontos, hogy a bemásolt szöveg tartalmazza az új sorokat és a tabokat, mert azok határolják nekem a szöveget, így azzal szeretnék dolgozni. Egyelőre az eddig linkelt dolgokkal nem értem el eredményt, de próbálkozom.
-
Mr. Y
őstag
Az első részhez próbáld ki a charAt() függvényt. [link]
A másodiknál a forrástól is függ, mit kellene használnod, mert nem mindegy, hogyan szerepel benne az új sor.
Esetleg RegExp?
Tab: [link]
New line: [link]De új sor lehet még a \n, \r, vagy a \n\r is, nem is beszélve a <br>-ről.
Vagy ezek olyan dolgok, amiket te is kipróbáltál már? Csak mert az első pár Google-találat.
Nem volt még alkalmam próbálni, így megnézem ezeket, hátha. A lényeg, hogy pl nyitsz egy jegyzettömböt, írsz bele pár dolgot, nyomsz pár tabot és pár entert, majd ezt a szöveget kimásolod és beilleszted az input mezőbe.
-
atyca
senior tag
-
atyca
senior tag
Erre sajnos nem látok rá, ehhez használnom kellene a programot.
De az első linkben lévő megoldás ugye ez:
if (event.target.value!="Off") {this.getField("address_secondary").value = this.getField("address_main").valueAsString;}Gondolom, a változóneveket átírtad a megfelelőekre.
Illetve az sem mindegy, hogy .value-t vagy .valueAsString-et használsz.
With valueAsString you know what you're getting back, ie a string. With value you don't know. It can be a string, or a number or even a boolean or an array. JavaScript is very flexible and does automatic type casting for you, but it's better to know what you're working with.Bár igazából egy mező tartalmát másolod, ott ez a példa is jó kellene hogy legyen.
Nézd meg, hogy jó mezőneveket adtál-e meg (az "address_secondary" (ide másol) és az "address_main" (innen) helyett. Hova <-- Honnan.).
if (event.target.value!="Off") {
this.getField("HONNAN").value = this.getField("LAKCÍM").AsStringvalue;
}
Jól gondolom, hogy hiányzott egy kapcsos zárójel a végéről?
Így legalább nem dobott hibaüzit, de sajnos nem működik.
Próbáltam AsString nélkül is.
Próbáltam a másik megoldás szerint gombra, egérkattintásra rakni, az sem jó. -
atyca
senior tag
Örülök, hogy működik, nagyon szívesen.

@Mr. Y: Betölteni betölt, viszont ahogy sztanozs is írja, egy bizonyos időn túl nem engedi futni a szkripteket. (Amúgy ha JS-tel szeretnél számoltatni, úgy érdemes, hogy a rendszeridőhöz mérten számolsz, mert ha a háttérben le is áll a szkript, amikor aktív lesz, és folytatódik, "jó helyen lesz", hiszen a rendszeridőhöz képest számol, ami mindig adott.)
-
Mr. Y
őstag
Nekem az oldal tartalmát 99%-ban JS generálja (JS --> PHP --> SQL --> PHP --> JS --> HTML), és ha háttérben is nyitom (pl. linkjére középső egérgomb), akkor is betölt mindent.
Ezt a részt már elég rég csináltam, nem emlékeztem elsőre, hogy hogyan tölt be, de most megnéztem, az index.html-ben van egy
<script>elsoBetoltes();</script>rész (más néven persze), az indít el minden mást. Animációt is hoz magával (betöltő), felteszem, az is gond nélkül lefut, legalábbis se logban se konzolban nem látok hibát.Viszont a külső plugineket (pl. CookieBot banner-e) tényleg csak akkor, ha aktív lesz a böngésző tabja.
Nem tudom, csak egy tipp, de nem lehet, hogy "rossz helyen" (időben) van hívva az animáció, az oldal betöltése után?
Logold, hol tölt be az oldal, és azt is, hol indul el az animáció, és nézd meg, nincs-e ez utóbbi a teljes betöltés után indítva.window.onload = function() {console.log('The page has fully loaded');}Jobb ötletem nincs erre sajnos most, nálam ilyen még nem fordult elő (ezek szerint talán csak szerencsém volt).
Röviden, hogyan működik:
Adott egy HTML felület, mely így indít:
<body onload="engine()">
Azengine()JS csinál mindent. Az adatokat JSON fájlokból szedi, Cooke-kat nem használok. Az animáció, melyet egyinterval()vezérel, előbb fut le, mint a betöltés.A JS kinézete:
function engine() {
animation();
uploaddata();
}Szerk: a JS is külső fájl, de még a Body előtt, a Head-ben kerül behívásra
-
Mr. Y
őstag
Örülök, hogy működik, nagyon szívesen.

@Mr. Y: Betölteni betölt, viszont ahogy sztanozs is írja, egy bizonyos időn túl nem engedi futni a szkripteket. (Amúgy ha JS-tel szeretnél számoltatni, úgy érdemes, hogy a rendszeridőhöz mérten számolsz, mert ha a háttérben le is áll a szkript, amikor aktív lesz, és folytatódik, "jó helyen lesz", hiszen a rendszeridőhöz képest számol, ami mindig adott.)
Van egy betöltő animáció. Amit ha elindít és ellépek, képes megállítani. Ha pedig
_blankelven nyitom meg, el sem indul, csak ha rámegyek. Illetve, a tartalom feltöltése is egy JS segítségével megy véghez, külső forrásból
Végülis számomra nem probléma, ha a felhasználókat nem zavarja. -
atyca
senior tag
Google-ben van egy ilyen találat a saját topikjában: [link]
var emptyFields = [];for (var i=0; i<this.numFields; i++) {var f= this.getField(this.getNthFieldName(i));if (f.type!="button" && f.required ) {if ((f.type=="text" && f.value=="") ||(f.type=="checkbox" && f.value=="Off"))emptyFields.push(f.name);}}if (emptyFields.length>0) {app.alert("Error! You must fill in the following fields:\n" +emptyFields.join("\n"));}For anyone else who is trying to implement this heres how:
Create a button
Right click the button and go to properties -> Actions tab
Trigger:Mouse Up
Action: Run JavaScript
-> Add...
Copy and paste Giliad D's code
->ok -> close
Select the fields you want required by right clicking the fields and selecting the "Set as Required Field" option
Save and done!De találtam egy videókat is: [link] [link]
Ilyesmi keresésekkel (Google-ön és YouTube-on is) még sok más találatot is kapsz:
adobe reader dc pdf check if field is empty javascript
adobe reader dc pdf form validationRemélem, így már meglesz.
Napok óta túrom a netet, persze nem az Adobera kihegyezve.
Nem gondoltam, hogy ez külön világ....
Még pallérozom az elmémet, aztán ha nem megy - így 56 év környékén már nem vagyok olyan befogadó képes
- megpróbálom valamelyik informatikusunkat becserkészni ezügyben. -
atyca
senior tag
Hú, hát ez meg mi? o.O
Akkor ez a gombletiltós dolog nem jó ide, ha műveletet csak a gomb lenyomásához tudsz társítani (mert inaktivált gombot nehéz lenyomni
).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, kuldesGombIlletve 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.
//mezoNevif ((document.getElementById("mezoEmail").value.length > 0) &&(document.getElementById("mezoTelefonszam").value.length > 0)){//gomb deaktiválásának megszüntetésedocument.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.
-
atyca
senior tag
És ezt hova?
Én ide gondoltam, de így nem működik....
Gomb/Tulajdonságok/Műveletek
Ehhez a vezérlő eseményhez adjam a küldés-törlést is, vagy azokat a felengedéshez párosítsam?
Vagy eleve rosszul csinálom.......
/Esetleg ezt a kötelezően kitöltendő mezőkhöz kellene adni?/
(Ha átdobnám privátba a fájlt, ránéznél?) -
atyca
senior tag
-
atyca
senior tag
Bocsi, és
.
(de tényleg azzal készítettem az űrlapot
)
Ez irányú tudásom a nulla felé konvergál....
A problémát az okozza, hogy van egy küldés gomb, ami az egérgomb lenyomásakor küld és, és felengedéskor törli a mezők adatait.
Sajnos csak ezután érkezik figyelmeztetés a nem kitöltött kötelező mező(k)ről, lehet kitölteni újra.
Valahogy azt szeretném megoldani, hogy a küldés - törlés ne valósulhasson meg, ha nem teljes az ürlap.
Az elképzelés, hogy a kurzor gomb fölé vitelekor lefutna egy ellenőrző script. -
Mr. Y
őstag
Egy egyszerű példával:
var a = 1;var b = 2;var c;function osszead(szam1, szam2){var osszeg = szam1 + szam2;return osszeg;}c = osszead(a, b);Ekkor c érték az osszead függvény által visszaadott (return) érték lesz, azaz 3.
Egy függvény vagy ad vissza értéket, vagy nem. Ha ad, akkor azt a return-nel teszi.
Köszönöm szépen, tiszta, egyszerű, érthető

-
Mr. Y
őstag
Egy sima if-else ág?
Ahova azonnalit akarsz, oda nem kell a
event.preventDefault();és nem kell az animate sem:
$('html, body').animate({scrollTop: $(hash).offset().top}, 800, function(){// Add hash (#) to URL when done scrolling (default click behavior)window.location.hash = hash;})Próbáld ki abban a példában a linken, kommenteld ki ezeket a részeket, és máris egyből ugrik. Tehát meg lehet csinálni (akár saját függvényben paraméterezve is), hogy ahol akarod, ott finoman gördüljön (legyen benne a fenti 2 rész), ahol pedig nem, azonnal ugorjon (ott a fenti 2 rész ne legyen benne).
Köszönöm, megpróbálom akkor így.
Egyébként: iOS alatt futó Google Chrome böngészőben miért nem működik az animált görgetés? Itt bármit csinálok, csak azonnal ugrik.
-
Mr. Y
őstag
-
Mr. Y
őstag
Oké, én ezt nem értem. Megcsináltam így, JSFiddle-ben tökéletesen működik. De Ctrl+C Ctrl+V -vel beraktam a szükséges fájlba és nem működik..., továbbra is azt írja a Console.log
Minden esetre, köszönöm a megoldásod -
sztanozs
veterán
XSS elleni védelemben kérnék segítséget/tanácsot.
Egyelőre csak 1 user inputos rész van az oldalon, a keresőmező. Ezt jelenleg így kezelem:
- Kliens oldalon:
strSearch = strSearch.replace(/&|!|\?|%|\*|\+|-|=|<|>|\(|\)|\[|\]|{|}|"|'|\||\/|\\|\^/g,"");
Tehát kiszedek belőle minden speciális karaktert. (Aztán még pár feldolgozó művelet, mielőtt szerver oldalra át lenne küldve.)- Szerver oldalon:
$strSearch=htmlspecialchars($_GET["searchString"], ENT_QUOTES, 'UTF-8');
Aztán SQL-nek paraméterként vannak átadva a keresőszavak.Tehetek még ennél többet? Kell egyáltalán? Én úgy látom, ezekkel a lépésekkel a keresőmezőre vonatkozólag le van védve XSS (és SQL Injection) ellen is.
Viszont ha rosszul látom, kérlek, javítsatok ki.
----------
Illetve később majd lesz:
- felhasználókezelés (tehát mezők felhasználónévnek, jelszónak, email címnek stb.)
- kommentelésOda ez a megoldás viszont már egészen biztosan kevés lesz.
Nem akarok előre szaladni, előbb az legyen kész, amivel indulni akarok, de mivel egy téma (XSS, Cross Site Scripting), így azért ez is szem elé került.És hogy ezek a funkcióim is le legyenek majd védve, úgy láttam, kelleni fog egy "user input sanitizer". Utána olvasva nem egy egyszerű téma - vagy csak rossz/régi/bonyolult találatokat néztem.
Furcsáltam, hogy nincs rá beépített megoldás, amikor is ezt találtam:
Sanitizer.sanitize()
Viszont ez még valami nagyon új feature lesz, egyelőre csak teszt változatban.Talán majd az encodeURI() / decodeURI() (Component) lehet majd hasznos.
Na de majd ha odaértem.Az első részre ha tudnátok tanácsot/véleményt adni, azt megköszönném.
-
martonx
veterán
Nem akartam kókányolósra, csak az alap lekérdezésen túli második lekérdezés, ami visszaadja ezt az adatot, amivel aztán haladnom kell tovább, annyira belassította az első betöltődést, hogy ki kellett vennem belőle, mert tökre elrontotta az élményt (sokáig nem volt tartalom). És a második lekérdezés adatára csak sok-sok scrollozás után volt szükség, így gondoltam, ráér később is. És onnan tolta magával a többi dolgot.
(Lehet, csak túlgondolom amúgy, és olyan esetet próbálok megoldani, amit amúgy nem is kellene...)
De már annyira nyakatekert az egész, hogy visszamegyek az alaphoz, és hagyom ezt az időeltolósdit, mert annyi esetet kell lekezelni, hogy ennyit nem ér az egész.
Nekikezdtem amúgy a setInterval-os clear-es megoldásnak is, de aztán valamiért a timeout-ossal folytattam.
De inkább vissza az elejére, mert ez így már nem szép (és közel sem hatékony).
Köszi.async - await, kódszervezés, átgondolás és probléma megldva. SetTimeout, SetInterval nem ehhez kellenek.
-
martonx
veterán
Köszönöm a tippet.
A UI már eleve így készült, felkészítve arra, hogy mi történjen, amíg eredményre vár az adatbázisból.
Ez most csak egy extrém ritka lehetőség, amit kezelni akartam, de úgy vagyok vele, legyen minden rendesen lekezelve, még akkor is, ha csak nagyon kis eséllyel fordulhat elő.
Szóval végül úgy oldottam meg, hogy az egész JS-kódrészt, ami a várt változóval dolgozna, beletettem egy setTimeout-ba, aminek a végén a várakozási időt egy változó állítja be. Ezt a változót a setTimeout előtt egy if-else állítja be: ha undefined a változó típusa, akkor még nem érkezett meg a válasz, ilyenkor váratom 500 ms-t (még tesztelem, hogy ez elég-e, vagy nem-e túl sok stb.). Ha viszont már megvan az érték, akkor 0-ra állítja, és azonnal lefut.
Ha már ilyen kókányolás kell neked, akkor legalább csináld meg setInterval-osra timeout helyett. 100 ms-enként lefut az interval, és ha minden oké, akkor clear, ha nem akkor hagy fusson újra.
-
dqdb
nagyúr
Szükségem lenne egy függvényre, ami egészen addig nem engedi tovább futni a szkript többi részét, amíg a szükséges változó értéket nem kap (mert utána azzal az értékkel dolgoznék tovább).
(Nem lehet összedrótozni/egybeágyazni őket sehogy, hogy csak akkor fusson a szkript maradék része, ha az érték visszajött az adatbázisból. Sajnos ez nem megoldható.)Ilyesmit kezdtem el összerakni, de nem úgy működik, ahogy szeretném:
function waitForResult(resultToWaitFor, acceptValue){console.log("In waitForResult. resultToWaitFor = " + resultToWaitFor);if (typeof resultToWaitFor !== 'undefined'){setTimeout(function(){waitForResult();console.log("Waiting for result.")if (resultToWaitFor >= acceptValue){return 0;}}, 100);} else {console.log("Megvan az eredmény.");return 0;}}***** Az elképzelés lényege az lenne, hogy 100ms-onként ellenőrzi, hogy kapott-e már értéket a vizsgált változó. Ha nem, ellenőrzi újra (rekurzívan). Ha kapott, kilép, és engedi futni az utána következő részeket. Nem ad vissza értéket. Semmit nem csinál, csak "feltartja" a szkriptet addig, amíg a változó értéket nem kap. (És mindig kap. Jellemzően pár tized mp-en belül, viszont van, hogyha "túlbuzgó" a user, eljuthat ahhoz a részhez a kódhoz, ahol használni kell ezt az értéket, mielőtt még materializálódna a változó. Ezt szeretném orvosolni.)
Ha a jelen formájában használom, hiába érkezik meg az érték, folyamatosan pörög tovább (logban látszódik, hogy Waiting for result-ot dobálja eszement módon utána is).
Pont ennek utánajárva találtam, hogy az első if-ágban is kell egy return - a belső ellenőrzést (és vele az acceptValue-t) ezért hoztam be. De nem segített.
A return 0 azért lett, mert a sima return-nal nem (sem működött), próbáltam hát így is.
----------
Vagy csináljak egy setTimeout-os, while-os ellenőrzést, a végén emelgetve egy számlálót, és megadok egy értéket neki, amit soha nem érhet el? Max ez a backup plan, de jó lenne a későbbiekben is egy ilyen "waitForResult" függvény, jó lenne azt rendbe rakni.Irányt tudnátok mutatni a témában, kérlek?
Alapvetően hibás, amit csinálni szeretnél. Persze mindenki valami hasonlót szeretne elérni, amikor először kell aszinkron hívást beépíteni az addig szinkron homokozójába, de ettől még nem így kell

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 aDIV-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ál1. az adatbázis-lekérdezés előtt ugyanazt csinálod, mint az előző megoldásban és
setTimeoutsegí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 asetTimeoutcallback fut le először, akkor előtérbe hozol egy másik teljes képernyősDIV-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 egycancelTimeout-ot, és a háttérbe küldöd mindkétDIV-et -
Zedz
addikt
Az viszont nagyon érdekes, mert nálam tökéletesen működnek, és Androidon kívül más issuet nem említettek.
-
Zedz
addikt
Az elsőben a bal oldali mezők szépen fókuszba kerülnek gépen és Androidon is Chrome alatt nálam.
De se a jobb oldali mezők (Outputs), se a második link mezői nem, se gépen, se telefonon.Viszont különböző típusúak is. Amik fókuszba kerülnek, azok mat-form-field típusúak, és fókuszba álláskor kapnak egy mat-focused osztályt.
A nem működőek pedig input mezők.
Nem tudom, hogy ezzel most segítettem-e egyáltalán bármit is.
A jelenség ismert, azért jöttem ide, hogy esetleg volt-e már másnak is hasonló tapasztalata Androidos böngészővel.

Érdekesség, hogy emulált Pixel 3-ban is működnek a dobozok. -
Zedz
addikt
-
lanszelot
addikt
Az a kikötés, hogy kisebb legyen 2-nél, csak az if-en belül él. Attól még amikor az arrNr = 1, belép az if-be, és végrehajtja a növelést, így utána az arrNr értéke 2 lesz. Szóval ha utána használod az értékét (nem if-en belül, mert oda már valóban nem lép be), akkor 2-vel fog dolgozni. (Abból a kódrészletből tudok "dolgozni", amit ide írtál. Ha if-en belül használod az arrNr értékét, akkor valóban nem kellene már 2-t kapnia.)
Értem, igaz.
Nagyon szépen köszönöm
-
lanszelot
addikt
Nem lehet 2, mivel kissebb mint 2
2<2 nem futhat le
2<=2 ekkor lenne 2DOM elérés sikerült
már csak az IF okoz fejtörést -
nevemfel
senior tag
Bénázok...
Szeretnék egy tömböt, amibe feltöltöm (mondjuk) a userek vezetéknevét, keresztnevét, korát.
Így gondoltam megcsinálni:
var userData = new Array();for (var i = 0; i < numberOfUsers; i++){userData[i] = new Array();userData[i]["vezetknev"] = lekerdezesEredmenye[i].vezeteknev;userData[i]["keresztnev"] = lekerdezesEredmenye[i].keresztnev;userData[i]["kor"] = lekerdezesEredmenye[i].kor;//stb.}Lekérdezni meg úgy szeretném, hogy userData[0]["kor"], akkor visszaadja, hogy pl. 28.
Működik, de azt kérdezném, hogy van-e ennek jobb módja.
Mert valamiért olyan "furán néz ki"... (aztán persze ez legyen a legnagyobb gond.)Köszi.
Én így oldanám meg:
var userData = [];
lekerdezesEredmenye.forEach(function(element) {
userData.push({
"vezeteknev": element.vezeteknev,
"keresztnev": element.keresztnev,
"kor": element.kor
});
}); -
Taci
addikt
Más adatokat is tartalmaz a lekerdezesEredmenye, ezért egy az egyben nem tudom/akarom átadni.
Az lenne az ultimate cél, hogy az új lekérdezések (amik új értékekkel töltik fel a lekerdezesEredmenye változót) adatai a userData végére kerüljenek pluszban.
Tehát ha az első lekérdezésből feltöltött 10 elemet (0-9), akkor a következő lekérdezés ehhez fűzze hozzá, a 11. elemtől indulva.Pluszban szeretném, hogy ebből az új tömbből ami adattal (userrel) már dolgoztam, azt kiszedjen belőle (hogy ne pazaroljam a felhasznált helyet feleslegesen), de úgy, hogy az előző hozzáfűzős módszer miatt az "id-k" ne változzanak.
Tehát ha 10 elemem volt az első lekérdezésből, és a második lekérdezésig feldolgoztam 5-öt belőle, akkor magában a tömbben csak a hátra lévő 5 elem legyen (hogy ne foglalja a memóriát, mert kb. végtelenig nyúlhat a bővítés), viszont amint jönnek az adatok az új lekérdezésből, azok a 11. elemként kezdve kerüljenek be. (hogy az "id-jukra" megfelelő módon tudjak hivatkozni)Néztem a slice()-t de az csak új tömbbe rakja, 0-tól kezdőden, így az nem jó.
Esetleg még arra gondoltam, hogy simán csak "lenullázom" az értékét a már felhasznált tömb elemeknek. Pl. userData[0] = ""; (vagy hasonló, ahogy működik majd)Megoldottam közben. Bocs az elpazarolt karakterekért, hamarabb írtam, mint kipihentem volna magam.
-
dqdb
nagyúr
Bénázok...
Szeretnék egy tömböt, amibe feltöltöm (mondjuk) a userek vezetéknevét, keresztnevét, korát.
Így gondoltam megcsinálni:
var userData = new Array();for (var i = 0; i < numberOfUsers; i++){userData[i] = new Array();userData[i]["vezetknev"] = lekerdezesEredmenye[i].vezeteknev;userData[i]["keresztnev"] = lekerdezesEredmenye[i].keresztnev;userData[i]["kor"] = lekerdezesEredmenye[i].kor;//stb.}Lekérdezni meg úgy szeretném, hogy userData[0]["kor"], akkor visszaadja, hogy pl. 28.
Működik, de azt kérdezném, hogy van-e ennek jobb módja.
Mert valamiért olyan "furán néz ki"... (aztán persze ez legyen a legnagyobb gond.)Köszi.
var userData = lekerdezesEredmenye;Így egyszerűbb a kód.
[link] -
Mr. Y
őstag
-
martonx
veterán
Azért ez elég rizikós, és nem túl jövőálló megoldás, noha per pillanat még működik: Document.execCommand() - Web APIs | MDN (mozilla.org)
-
Mr. Y
őstag
-
Pala
veterán
-
Mr. Y
őstag
-
martonx
veterán
-
martonx
veterán
Ahogy írtam is, ez a HTML file esetében igaz. Css, js file-oknál mögéjük szoktak csapni egy ?v=1 - et, és frissítéseknél ezt növeled. Ezzel jelezve a böngészőnek, hogy ez már egy új verzió, ezt használja.
-
martonx
veterán
Köszönöm, átnézem mindenképp. Belekezdtem már akkor, csak sok dolog közbejött.
Lenne egy másik kérdésem is:
Tegyük fel, hogy van egy oldalam, aminek van 2 menüpontja. Telik-múlik az idő, a felhasználók használják az oldalt. Aztán úgy látom jónak, hogy azt a 2 menüpontot 5-re bővítem.
Hogyan lehet azt megoldani, hogy a frissített oldalszerkezet eljusson a felhasználókhoz?
Mert sima újratöltésnél ugye csak cache-ből dolgozik, így gondolom, ha "nem muszáj", nem fogja megnézni, van-e újabb source verzió. Így amíg nem tölti le a frissített fájlokat az új menüpontokkal, addig én hiába csináltam meg az 5 menüpontot, a felhasználó csak 2-t fog látni.Hogyan szoktátok, hogyan lehet ezt kezelni? Mi a bevált módszer erre? Van esetleg egy változó, hogy bizonyos időközönként ellenőrizze, van-e újabb source verzió? De ez így nem lenne teljesen jó, mert ha megcsinálom egyik nap, szeretném, ha másnap már használnák az új fájlokat. Szóval olyan opció kellene (ha van, ha lehetséges), hogy ha módosítok, akkor a következő töltésnél már az új változatot szedje le a kliens.
Köszönöm.
Miért ne szedné le az új verziót?
A static content-et persze szeretik cachelni a böngészők, de a .html-eket nem. -
disy68
aktív tag
Ti írtatok már saját kezűleg sütikezelőt? (GDPR-sáv)
Nagyjából készen vagyok az oldallal, a megfelelő engedélyekre várok még, és funkcionalitását tekintve még a sütikezelés hiányzik. (Bár sütiket nem használok (egyelőre), csak local storage-ot, de úgy láttam, hogy jogszabály szerint ez egy kalap alá van véve, tehát mindegy, hogy cookie vagy local storage, kell a hozzájárulás és a GDPR-sáv.)
Nem tudom, megéri-e energiát belefektetni, és megírni magamnak (bár nem igazán tudom/értem, mi-hova-miért tartozik), vagy jobban járnék, ha vennék egy jól felépítettet, és csak beépíteném.
Ez utóbbira van ötletetek?
Feleljen meg az előírásoknak, legyen minden állítható, amit állítani kellhet (user szempontjából).A működését illetően pedig, ha magamnak akarnám csinálni:
Amire használom jelenleg a local storage-ot:
- sötét mód állapota
- lokáció (weather widget-hez)
- 18 éves elmúlt-e (tartalmak szűrése, megjelenítése)
- hasonlók.Ez szerverre egyáltalán nem kerül, nem mentek semmit a userekről (jelenleg - majd talán később, egyszer), még igazából látogatottságot se nézek (még), és nincs összekötve se Google-lel, se Fb-kal. Ehhez a két utóbbihoz már tuti kelleni fog egy megfelelő megoldás - de azon kívül?
Ugye ezeket amiket írtam, nevezhetem a működéshez szükséges "cookie-knak", így ezt amúgy sem lehetne lekapcsolni. Vagy ezt sem én döntöm el? Lehet a sötét mód állapota kényelmi beállítás, és akkor már máshogy és máshol kell kezelni?Ebben tudnátok segítséget adni? Ha csak egy jól összeszedett cikk is az, az is bőven jó lenne, csak tudjam, merre-hogyan induljak.
Köszi.
Kiindulónak itt van ez. Találsz ott generátort is. Nem vagyok a téma nagy ismerője, de neked a sima cookie consent is elég lehet, nem kell külön gdpr rész.
-
polymorphin
csendes tag
Egyelőre ez még csak egy tapogatózó, felületes kérdezősködés, de azt szeretném elérni, hogy az oldalam csak olyan (verziójú) böngészőkön jelenhessen meg, amit 100%-ig támogat mindent, amit az oldalam használ.
Ehhez ugye előbb tudnom kellene, hogy pontosan mit használ az oldalam. Ehhez valamelyik topikban láttam belinkelve a Can I use oldalát, talán ezzel el tudok indulni.
De van esetleg olyan oldal, ami "átnézni" az oldalamat, és megmondja, hogy milyen böngészőkből milyen verzió az alap, hogy gond nélkül fusson minden?
Mert ha meglenne ez a lista, akkor az oldal betöltése előtt ellenőrizhetném a böngésző verzióját, és ha az általam beállított (a megkapott) verzió alatt van, akkor csak egy információs lapot jelenítenék meg, hogy a böngésző verziója nem támogatott, frissítse stb.
Vagy van erre jobb módszer? Ti hogyan kezelitek/kezelnétek ezt?
(JS topikba írom a kérdést, mert gondolom, azzal a legegyszerűbb ezt kezelni.)
Köszi.
Babel + @babel/preset-env valamelyik module bundlerrel vagy task runnerrel, szerintem az esetek tobbsegeben nincs ra szukseg, ha csak nem Afrikat vagy Indiat celzod meg, vagy ES10+ featureket hasznalsz
-
martonx
veterán
Egyelőre ez még csak egy tapogatózó, felületes kérdezősködés, de azt szeretném elérni, hogy az oldalam csak olyan (verziójú) böngészőkön jelenhessen meg, amit 100%-ig támogat mindent, amit az oldalam használ.
Ehhez ugye előbb tudnom kellene, hogy pontosan mit használ az oldalam. Ehhez valamelyik topikban láttam belinkelve a Can I use oldalát, talán ezzel el tudok indulni.
De van esetleg olyan oldal, ami "átnézni" az oldalamat, és megmondja, hogy milyen böngészőkből milyen verzió az alap, hogy gond nélkül fusson minden?
Mert ha meglenne ez a lista, akkor az oldal betöltése előtt ellenőrizhetném a böngésző verzióját, és ha az általam beállított (a megkapott) verzió alatt van, akkor csak egy információs lapot jelenítenék meg, hogy a böngésző verziója nem támogatott, frissítse stb.
Vagy van erre jobb módszer? Ti hogyan kezelitek/kezelnétek ezt?
(JS topikba írom a kérdést, mert gondolom, azzal a legegyszerűbb ezt kezelni.)
Köszi.
Ez a jó módszer. Viszont nem lesz olyan rendszer, ami ezt megmondja neked, hogy mit kell minimum támogatnod. Neked kell kitalálnod, hogy mi az amit támogatsz.
-
dqdb
nagyúr
Belefutottam egy olyan hibába ezzel a kóddal, hogy amikor több szót is szeretnék kijelölni, és az egyik ezek közül a
markrésze (pl.ma, vagy simán csak azabetű), akkor a<mark></mark>-ban lévő karaktereket is átírja, ezzel elrontva az egészet.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.
Azonban ahogyan a korábbi kódomnál jeleztem, nem túl szerencsés escape-elés nélkül betolni egy stringet reguláris kifejezésnek, mert speciális karakternél szépen jön az exception.
-
martonx
veterán
Ah, amit én ~50 sorban sem tudtam tökéletesen megoldani, te rendbe raktad ~10 sorban, úgy, hogy annak is a fele még logolás is...

Igazából kell még egy kis idő, hogy felfogjam, mi is történik itt...
(Értve ezalatt a $1-et és a zárójelezést avar 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!
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
-
cstomee
tag
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,
ifhasználatával, arra szépen lefut. Amúgywhile-lal akarom (mert ha ez a függvény meghívódik, akkor 1 találat már biztosan van, szóval egyszer mindenképp le kell futnia), csak az a baj, ha átírom az if-et while-ra, akkor lefagy egy időre (felteszem, ismét valahol infinite loop) (logolásnál látszik, hogy valami nem stimmel a loop-ban), a logolás nélküliben pedig a konzolban írja, hogy "Invalid string length at markText".Szóval valószínűleg a ciklusban hibázok valamivel, mert a logban látszik, hogy a textContainerLocal elkezd "önmagába írni" már azután is, hogy elvileg megtalálta mindkét bejegyzést.
Csak egy észrevételt ha megengedsz... Túl hosszasan írod le hogy mit szerenél ahelyett hogy 4-6 kulcsszót beírnál a google-be. pl: javascript mark text non case sensitive
jsFiddle
Nem tudom hogy ez kell e neked mert őszintén bevallom nem olvastam végig amit írtál, TLDR;.
Szerk.:
Időközben a példa mondat majdnem hasonló lett
Egy kicsit bonyi a tiéd, de ha működik akkor jó ... -
Taci
addikt
Készen is van az "ultimate kereső kijelölő"

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,
ifhasználatával, arra szépen lefut. Amúgywhile-lal akarom (mert ha ez a függvény meghívódik, akkor 1 találat már biztosan van, szóval egyszer mindenképp le kell futnia), csak az a baj, ha átírom az if-et while-ra, akkor lefagy egy időre (felteszem, ismét valahol infinite loop) (logolásnál látszik, hogy valami nem stimmel a loop-ban), a logolás nélküliben pedig a konzolban írja, hogy "Invalid string length at markText".Szóval valószínűleg a ciklusban hibázok valamivel, mert a logban látszik, hogy a textContainerLocal elkezd "önmagába írni" már azután is, hogy elvileg megtalálta mindkét bejegyzést.
Azt elfelejtettem írni, hogy persze ezt debuggolom én, eszem ágában nincs ezt mástól kérni, csak status update-ként írtam. Amint megoldottam, adom majd a kódot hozzá, hátha később hasznos lesz valakinek.
-
martonx
veterán
Igen, ezzel valóban a jókat jelöli ki, viszont az a gond továbbra is, hogy ha csupa kisbetűvel írom be a keresőbe a szót (pl. "máté"), akkor hiába szerepel az eredeti tartalomban nagy kezdőbetűvel (pl. "Máté"), a keresési találatokban átírja a keresésben megadott formára.
Ha pl. a textContainer az, hogy
"Alszik Máté, mert elfáradt.", a keresési kifejezés pedig az, hogy "mÁtÉ", akkor bár kijelöli a megfelelő sztringet, viszont ez lesz a megjelenített sztring:"Alszik mÁtÉ, mert elfáradt."Így csináltam meg, legalábbis itt járok benne:
https://jsfiddle.net/j7qt4bva/Ha "normál kifejezésre" keresek (pl. "máté" vagy "apple"), tökéletesen működik, de rövidebbekre (pl. "a" vagy "az") végtelen cikulsba kerül valahol.
(Amúgy sanszos, hogy erősen túlbonyolítva csináltam meg...)
Az alapötlet az, hogy a keresett szó pozícióinak megkereséséhez csupa nagybetűssé alakítom a szöveget, amiben keresek, és a keresett szót is. Aztán ha megvan a pozíció (vagy pozíciók, több találatnál), akkor egy tömbbe szétvágom az eredeti sztringet a találat pozíciók végén. Majd ezeken belül megcsinálom az öleted alapján (RegExp "i") a <mark> tag hozzáadását úgy, hogy a már megszerzett pozíciók alapján kiszedem az eredeti karaktereket (így meglesz az a változat, hogy a kis- és nagybetűk az eredetiben vannak).
Aztán ezeket a tömbelemeket összefűzöm újra, és ezt adom vissza.Csak valahol rövid(ebb) karakterszámnál végtelen ciklusba futok.
Netán ha kaphatnánk működő konkrét példát html-el? Az mondjuk így ránézésre látszik, hogy amit tippre pár sor kóddal meg lehetne oldani, te 29 teleírt sorból oldottad meg.
Szóval komolyabban bele se néztem, mert ez így biztos, hogy nem jó
és nem működő példa híján, hogy az 5 sor helyett, 29 sorban hol a hiba.... -
cattus
addikt
Keresés eredményéhez akarom kijelölni a találatokon belül a keresett szavakat.
Erre a<mark>tag-et használom.function markText(textContainer, textToMark){return textContainer.replace(textToMark, "<mark>" + textToMark + "</mark>");}Így viszont nem tudom kezelni a kis- és nagybetűket.
Pl. arra keresek, hogy "máté". A szerver visszaadja találatnak a "Máté"-t (nagy kezdőbetűvel) tartalmazó találatokat is (ehhez kapcsolódóan amúgy a PHP topikban van egy nyitott kérdésem, és nagyon összezavarodtam vele, ha valakinek magabiztos tudása van a keresés mikéntjével PHP-ban/SQL-ben, kérem, nézzen majd rá), viszont a JS csak azokat jelöli be, amik pontosan megfelel a keresésnek.
És nem tudom, hogyan kellene úgy módosítanom a fenti függvényt, hogy ha a szövegben az van, hogy "Máté" (nagy kezdőbetű), a keresési szöveg az "máté" (kis kezdőbetű), a találatban lévő sztringben a nagy kezdőbetűs Mátét is vegye körbe <mark> taggel. (Ha csak a kezdőbetűt kellene figyelni, könnyű lenne, viszont ugye lehet olyan találat is, ahol csupa nagybetű, vagy csak a 3. karakter nagy stb. És nekem az kellene, hogy kijelölje, bárhogyan is találja meg a "máté"-t: máté, Máté, MÁTÉ, mÁtÉ, MáTé stb.)
Lehet, valami nagyon egyszerű, és amint elküldöm a hozzászólást, eszembe is jut - de egyelőre nem jövök rá.
Hátha ti már találkoztatok ilyen helyzettel.
Köszi.
Regex segítségével be tudod állítani hogy a kis-nagybetű ne legyen probléma:
const regex = new RegExp(textToMark, "gi");
textContainer.replace(regex, "<mark>" + textToMark + "</mark>"); -
Mr. Y
őstag
Amit belinkeltél, ez egy CSS-ben összerakott "ablak". Viszont az alert() függvény az nem ez.
https://developer.mozilla.org/hu/docs/Web/API/Window/alert
Kipróbálható példával: https://www.w3schools.com/jsref/met_win_alert.aspAttól függ, hol és mire szeretnéd használni. Ha csak egy üzenetet megjeleníteni a weblapodon, ott csak a képzeleted szab határt, hogy milyen ablakot, animációt stb. készítesz.
Ha a beépített alert() függvényt akarod használni, akkor nincs nagy nyújtózkodási felületed, cserében viszont 1 sorban megvan hozzá a kódod.Igazad van, mint írtam fentebb, csak ránéztem, bele nem. Akkor erről ennyit, köszönöm
-
martonx
veterán
Köszönöm a részletes választ.

És persze elrontottam a kérdést, rossz példát hoztam fel, mert a gombokon, elemeken lévő onclick-függvényhívásokra akartam volna rákérdezni - azért is hoztam a félkövérre állítós példát mellé.
Szóval arra irányult volna eredetileg a kérdés, hogy van-e hátránya annak, hogy ha
onclick-ként állítom be magában a HTML kódban a gombra, mit csináljon (függvényhívás), azzal szemben, ha a gombnak csak meg van adva az osztály pl. hogyclass="btn-toggleDarkMode", aztán egy külső JS-ben pedig definiálva van hozzá egyaddEventListener, és ott történik a JS hívása?Nyilván szebb, tisztább a kód, ha csak egy class van megadva a gombnak, viszont emiatt ugye több kódolás is a háttérben.
A T-s dologra pedig nem reagálok.
Ez erősen attól függ.
1. ha valami mv* frameworköt használsz, akkor azoknál alap, hogy a html-be írod az eseménykezelőt. Pl. react, vuejs, svelte, angular
2. minden más esetben SZERINTEM az a tiszta, ha a js kódot elkülöníted a html-től, ugyanúgy ahogy css-t is külön illik kezelni, noha ez is mind mehetne html style-ba az elementekre. -
Silεncε
őstag
Sziasztok!
Van annak valami hátránya, ha a HTML-kód tartalmaz direktben JS-hívást?
Sok oldal forrásábán találok
<script></script>tageket, viszont soknál pedig "el vannak rejtve".
Pl. itt a szerkesztőben a félkövérre állítás gombja:<button type="button" class="btn btn-light" title=""data-tmce-toggle="bold" data-original-title="Félkövér"><span class="fas fa-bold"></span></button>Itt ha jól sejtem, a
data-tmce-toggle="bold""mögött" van a JS.Melyik a jobb megoldás? Már ha jobb bármelyik is.
Ha most megnézem a kezdőlapom kódját, ott van az elején pl. hogy:
<script>setDarkModeFromLocalStorage();</script>Ez jelent bármilyen hátrányt? Támadhatóbb az oldal emiatt?
Ha esetleg igen, mi a jó mód a "javításra"?Köszi.
Én nem tudok olyanról, hogy el lehetne rejteni a JS kódot. Azok a data propertyk nem JS-t rejtenek, hanem a HTML5 szabványban már tudsz ilyen kezdetű attribútumokat definiálni, amikben bármilyen adatot tárolhatsz (például mint a be rakott kódrészben a gombhoz tartozó custom adatok). Errol itt tudsz olvasni: [link]
Az oldal védelméről: ha egy sima static oldalról van szó (tehát nincs input, vagy esetleg minden csak localban van tárolva) ott sok mindent nem tudnak támadni az oldalon keresztül (ott arra kell figyelni, hogy a host webserver ne legyen törtető, hogy mondjuk módosított, káros kódot tartalmazó fájlok ne kerülhessenek fel). Ha pedig van interakció (akár mondjuk egy régebbi, PHP-s oldal, akar egy újabb JS-es webapp, ami mögött van egy REST-API) ott úgyis a “backend” részen külön validalni kell mindent mert ugye az első számú szabály, a userben SOSEM bízunk (tsystems likes this
) -
Taci
addikt
Sziasztok!
(Bocsánat, csak ilyen hosszan leírva tudom elmagyarázni, mi is a probléma.)
A template-ben amit használok (Bootstrap-alapon), van egy JS, ami a scroll-ozásért felel:
smooth-scrollbar.jsEzeket az infókat látom róla benne kommentelt sorokban, hátha segít beazonosítani, hátha valami általánosabb JS:
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License")
* cast `I.Scrollbar` to `Scrollbar` to avoid error
*
* `I.Scrollbar` is not assignable to `Scrollbar`:
* "privateProp" is missing in `I.Scrollbar`
*
* @see https://github.com/Microsoft/TypeScript/issues/2672Ahogy látom, ez a szkript a sidebar-ban van használva. Úgy találtam rá, hogy van a sidebar-ban pár elem, ami
data-toggle="collapse"segítségével "bont ki" és "zár össze" tartalmakat (hogy több/kevesebb tartalmat mutasson), és most jött elő a következő hiba:Ha a sidebar alján lévő gombbal (
data-toggle="collapse") bontom ki a tartalmat, és legörgetek a kibővített lista aljára, és az ott lévő gombbal bezárom ezt a listát (szinténdata-toggle="collapse"), akkor nem scroll-oz vissza, és ha mondjuk egy oldalnyi plusz tartalmat mutatott pluszban, és most azt zárom be, akkor a sidebar kvázi üres lesz, mert a tartalmat már elrejtette, viszont az összezárt tartalom feljebb van, és már csak az üres területet mutatja. Aztán amint egy picit is scroll-ozok, ugrik egy hathalmasat, pontosan onnan folytatva, ahol a kibontás előtt állt.Ezen a ponton kezdtem el keresgetni, mi-hol is történik, és ekkor találtam rá, hogy a
smooth-scrollbar.jsvégzi ezt a scroll-ozós számításokat.Azt találtam, hogy létrehoz egy
scroll-contentnevű class-t/osztályt, aminek folyamatos számítások alapján állítja be a transform stílust, konkrétan ezzel mozgatva a tartalmat, srollozás gyanánt.Ha a tetejére scroll-ozok, akkor:
<div class="scroll-content" style="transform: translate3d(0px, 0px, 0px);">Ha a jelenlegi ablakméret aljára, akkor:
<div class="scroll-content" style="transform: translate3d(0px, -291px, 0px);">
Ha kibontom a tartalmat, és az aljára scroll-ozok, akkor:<div class="scroll-content" style="transform: translate3d(0px, -988px, 0px);">
Tehát kb. 700 pixellel lejjebb visz/vagyok.Aztán itt jön a probléma, mert amikor összezárom a tartalma a
data-toggle="collapse"segítségével, akkor konkrétan lent hagy az alján,-988px-en marad a transform, míg a tartalom már azt a kb. 700 pixelt visszazárta, így ott marad kb. 700 pixelnyi üres terület.
Aztán ha egy picit is görgetek felfelé, akkor nem-988px-elről kezdi felfele a görgetést, hanem az azelőtti értékről, a-291px-ről.Szóval az a változó amit figyel, hogy meddig tart a tartalom alja, az már visszaállt a helyes értékre, a
-291px-re, viszont atransform: translate3d()-vel nem "megy utána".
Ezért arra gondoltam, hogy oké, akkor "utána küldöm" én:document.getElementsByClassName("scroll-content")[0].style.transform = "translate3d(0px, 0px, 0px)";És itt jött az a gond, hogy alapból nem akartam ezzel sokat vesződni, mert akkor mindig azt kéne néznem, hogy honnan indult a kibontás, mennyi pixelről, és oda küldeni vissza. Ehelyett inkább egyből a tetejére dobtam vissza (0px, 0px, 0px).
Viszont itt láttam, hogy hiába a transform, attól még a
-291pxvan bejegyezve, hogy ott állt meg legutóbb a scroll-ozás, így hiába dobom a tetejére, ha kicsit görgetek, újra-291px-elről folytatja.Van valakinek tapasztalata ezzel esetleg? Meg lehet ezt oldani valami egyszerű módon?
Remélem, ez valami általánosabb JS (bár én sosem láttam még), és esetleg más is találkozott már ilyen "jelenséggel", így nem túl specifikus a kérdésem.Köszi!
Jobb megoldás híján maradtam transform-piszkálásnál.
Én így oldottam meg, ha esetleg később valaki ilyen problémával találkozna:
function scrollSidePanelScrollContent(yToScroll){var sidePanelScrollContent = document.getElementsByClassName("scroll-content")[0];var transformCurrentValue = sidePanelScrollContent.style.transform;var translate3DValueOfYpx = transformCurrentValue.split(",")[1];var translate3DValueOfY = translate3DValueOfYpx.replace("px", "");var scrollToY = parseInt(translate3DValueOfY) + yToScroll;leftSidePanelScrollContent.style.transform = "translate3d(0px, " + scrollToY + "px, 0px)";}(Nyilván profibban is lehet, de így átlátható, mit-miért, alapnak tökéletes lehet.)
Ha valaki azért tudja a "rendes" megoldást erre a problémára, írjon majd.
Köszi. -
Silεncε
őstag
-
nevemfel
senior tag
Köszönöm a linket, úgy látom, ez (elsőre) egy nagyobb lélegzetvételű téma, de érdekel, és hátha valóban ez a jó megoldás, úgyhogy mindenképp végig olvasom és értelmezem.

Meg ő tudja is magáról, hogy szar a netje és türelmesen kivárja
Ezt azért tudjuk, hogy sajnos nem (mindig) így működik.
A CDN-téma viszont teljesen ismeretlen számomra. Van esetleg ajánlott szolgáltató? Jó lenne, ha üzemelne még jó pár évig, és nem baj, ha fizetős, csak legyen próba verziója, hogy tesztelni tudjam.
Köszi!
Én azt javaslom, hogyha sok képet akarsz megjeleníteni, akkor használj progresszív képbetöltést, tehát csak akkor kérd le a képet, ha az oldal görgetése a képhez ér (vannak rá kész libek), vagy inkább használj valami galériát, ami szintén nem tölti be az összes képet előre, csak ha a képlapozás odaér (szintén ezernyi kész program van rá, ami előre is tölt x darabot, lapozás irányától függően.)
-
martonx
veterán
Köszönöm a linket, úgy látom, ez (elsőre) egy nagyobb lélegzetvételű téma, de érdekel, és hátha valóban ez a jó megoldás, úgyhogy mindenképp végig olvasom és értelmezem.

Meg ő tudja is magáról, hogy szar a netje és türelmesen kivárja
Ezt azért tudjuk, hogy sajnos nem (mindig) így működik.
A CDN-téma viszont teljesen ismeretlen számomra. Van esetleg ajánlott szolgáltató? Jó lenne, ha üzemelne még jó pár évig, és nem baj, ha fizetős, csak legyen próba verziója, hogy tesztelni tudjam.
Köszi!
"és hátha valóban ez a jó megoldás" - nem hátha, hanem ez az egyetlen jó megoldás. Ez egy publikus topik, amellett hogy segítünk, én legalábbis arra is próbálok odafigyelni, hogy ne szerepeljenek hülyeségek, tévutak, másokat ne vigyenek félre hülyeségek, még ha valakinek éppen nagyon be is csípődött a saját ötlete (ami önmagában elvi szinten nem is lenne hülyeség, csak épp megvalósításkor minden elvi előnye el is úszna).
CDN-re nem kell sokat találgatni, valamelyik nagy felhő providernél be kell regelni, és elkezdeni használni. AWS, Azure, Google Cloud mindegyik tud CDN-t, és ezek mindegyike sokáig velünk lesz még szerintem. És ahogy mondtam a te szinteden ingyenesek, majd ha lesz napi több ezer látogatója az oldaladnak, akkor elkezdhetsz fizetni havi 1-2EUR-t nekik a CDN-ért. Regisztráció után X ingyenes keretet szoktak adni 1 évig, szóval nyugodtan próbáld ki, első hónap után látni fogod, hogy normál esetben mennyit kellene fizetned (tippre a te felhasználásoddal csak CDN esetben nullát).
-
martonx
veterán
De valahogy akkor is tudnom kell, hogy melyik kliensnek adjam a lebutított (460x230-as) képet, és melyiknek a normál (1000x500-as) képet. (Akár saját tartalommal, akár máshonnan.)
Nem akarok én persze sebességméréssel bajlódni, egyetértek veled teljesen, de akkor hogyan tudom egyszerűbben ketté ágaztatni ezt, hogy a lassabb ezt kapja, a gyorsabb meg azt? Rendszer szinten van definiálva valami változó/függvény, amit ehhez fel lehet használni?
Pl. egy mobil rendszer (Android, iOS) tudja, hogy milyen kapcsolaton van. És a Windows is. A böngészők tudják? Meg lehet kérdezni tőlük? Ha igen, hogyan?Erre való az image srcset How to Use HTML5 “picture”, “srcset”, and “sizes” for Responsive Images (tutsplus.com)
Felejtsd már el a hálózati sebességet, lényegtelen. Valahogy nálad ez csípődött be, könyörgök felejtsd el!
Egy dologra kell figyelj, hogy a képernyő felbontásának megfelelő méretű képet add oda, és akkor mindenki boldog lesz.
Ha kicsi a képernyő (értsd mobil), akkor annak egy kicsi kép fog menni, ha nagy a képernyő, mert desktopon nézed, akkor annak egy nagy kép fog menni.
Egyébként is, attól, hogy valakinek lassabb a netje, még nem fogsz minden képet 32X32 pixelesen küldeni, hogy is nézne már ki. Meg ő tudja is magáról, hogy szar a netje és türelmesen kivárja
A linkelt példa szerintem egész jól bemutatja, elmagyarázza.
-
coco2
őstag
Igen, köszönöm, ez a megoldás egy része lehetne az elejének, hogy minden felhasználó megkapja a kisebb felbontású képet.
Viszont utána a lassú kapcsolaton lévőknél annak nem lenne értelme, hogy még azoknak a képeknek a nagy változatát töltse, amiken már rég túlpörgetett, miközben az újak, amik már szem előtt vannak, már töltődni kellene, de még mindig a korábban már túlpörgetettek nagyobb változatát tölti.
Ezért gondoltam egy szétválasztásnak sebesség szerint.
Hát pedig akkor sebességmérned kellene. És ahhoz nem jók a statikus linkek, xhr-t kellene indítanod. Amikor elindítasz egy letöltést, rakd el az időpontot. Amikor végeztél vele, összehasonlítod. A Date.now() millisec alapon mér.
-
Mr. Y
őstag
De valahogy akkor is tudnom kell, hogy melyik kliensnek adjam a lebutított (460x230-as) képet, és melyiknek a normál (1000x500-as) képet. (Akár saját tartalommal, akár máshonnan.)
Nem akarok én persze sebességméréssel bajlódni, egyetértek veled teljesen, de akkor hogyan tudom egyszerűbben ketté ágaztatni ezt, hogy a lassabb ezt kapja, a gyorsabb meg azt? Rendszer szinten van definiálva valami változó/függvény, amit ehhez fel lehet használni?
Pl. egy mobil rendszer (Android, iOS) tudja, hogy milyen kapcsolaton van. És a Windows is. A böngészők tudják? Meg lehet kérdezni tőlük? Ha igen, hogyan?Most olvasom csak a problémádat.
Erre viszonylag egyszerűen szokták a megoldást megadni. Minden esetben a kisebbik felbontás tölt be és az hamar meg is jelenik. Közben a háttérben (elrejtve) betölti a nagyobb felbontású képeket is. Ha azzal végzett (ezt egy egyszerű js rutinnal le tudod követni), akkor megjelennek a nagyok és eltűnnek a kicsik.Ez eredményez "gyorsan" betöltő weboldalt minden eszközön és mire a felhasználó eljut odáig, hogy részketesen szemügyre vegye a médeatartalmat is, addigra már be vannak töltve a nagyobb, jobb minőségű képek.
Amennyiben vizsont nem ez lenne a cél, akkor nem szóltam

-
martonx
veterán
martonx és sztanozs: Köszönöm a tanácsokat, utána nézek ezeknek a megoldásoknak.
Azt még meg tudnátok mondani, a lap betöltésének melyik pontján tudom mérni a sebességet úgy, hogy a lap más elemeinek töltése ne kavarjon be? Mert így most csak az első teljes betöltés utánra tudok gondolni, de jó lenne még az elemek töltésének megkezdése előtt, hogy csak akkor kezdje el, miután sebességet mértem. Ezt a JS-hívást hova kell raknom, vagy hogyan kell meghívnom, hogy így működjön? Köszi.
Továbbra is azon a véleményen vagyok, hogy maximálisan értelmetlen sebességet mérned, pláne ha ezzel a célod a betöltés gyorsítása
mivel a pagespeed a plusz js szüttyögés miatt még le is fog pontozni, miközben a probléma az, hogy ha meg akarsz jeleníteni egy 460X230-as képet, akkor nem egy 2Mbyte-os 4K-s képet kellene lerángatni netről, hanem egy 20kbyte-os pontosan 460X230-asat.
És ezen nem fog semmit segíteni, hogy te page initnél pár másodpercig hálózati sebességet méricskélsz, hogy eldöntsd majd hogy, mekkora képet szolgálj ki.
-
sztanozs
veterán
martonx és sztanozs: Köszönöm a tanácsokat, utána nézek ezeknek a megoldásoknak.
Azt még meg tudnátok mondani, a lap betöltésének melyik pontján tudom mérni a sebességet úgy, hogy a lap más elemeinek töltése ne kavarjon be? Mert így most csak az első teljes betöltés utánra tudok gondolni, de jó lenne még az elemek töltésének megkezdése előtt, hogy csak akkor kezdje el, miután sebességet mértem. Ezt a JS-hívást hova kell raknom, vagy hogyan kell meghívnom, hogy így működjön? Köszi.
a lap betöltése előtt és utána elmented ezt egy cookieba és redirectelsz a valós oldalra.
-
martonx
veterán
Ezt nem értem.
Mármint azokat a képeket egyáltalán nem célom tárolni semmilyen formában. Viszont ha nem tárolom, átméretezni sem tudom őket. A megjelenített méreteit meg tudom változtatni, így át tudom "méretezni", de ettől a fájlméret még nem változik, nekem pedig most csak az számít. (Bár szerintem egyről beszélünk, csak én vagyon nagyon fáradt.)Ez a példa amit írtál azt jelenti, hogy letöltöm, átméretezem, aztán hivatkozok rá, hogy honnan van(?) (&source=).
Vagy valahogy mégis meg lehet oldani, hogy a kliens úgy kapjon kisebb felbontású (és így fájlméretű) képet, hogy én ezt nem tárolom? Ez lenne a "/kepatmeretező?width=460&heigh=230"? Egy kód szerver oldalon (php)? Hogyan működik? Minden képletöltésnél átméretez, és azt "adja oda"? De akkor minden egyes kép minden egyes letöltésekor ez lefut és dolgozik? Letilt a szolgáltató.
Ezt optimalizálni úgy lehetne, hogy tárolom az átméretezett képeket, de ez nem opció.Kérlek, írd le picit pontosabban, milyen megoldásra is gondolsz. Vagy ha van neve a megoldásnak, az is elég, ha megírod, és rákeresek. De egyelőre ez így nem világos, mert az előbb végig logizákozott vonal forráspazarlásnak tűnik csak.
Köszi.
Jól érted, pont ezt kell csinálnod. Szerver oldalon (ami most esetedben PHP) letöltöd, de nem tárolod, csak kiszolgálod a kicsire átméretezett képet.
És itt jön a történetben a csavar, hogy a rendszered fölé teszel egy CDN-t, ami egyébként kb. ingyenes, legalábbis ahhoz egész nagy terhelésednek kell lennie, hogy elérd a havi 1EUR-os fizetendő díját.
Azaz ez benne trükk, hogy te ezt tényleg nem fogod tárolni, ezt megoldja helyetted a CDN
-
sztanozs
veterán
(Ne haragudjatok, hosszú lett, "hangosan gondolkodom", offba is rakom, de tanácsot szívesen elfogadnék, van pár kérdésem benne.)
Ötletem sincs, mik lehetnek a jó mérőszámok, de ezeket a kategóriákat szeretném lefedni:
1) Gyenge hálózati kapcsolat
3G és alatta2) Közepes sebességű hálózati kapcsolat
3G és 4G között, 4G-t is beleszámítva, mert 1-2-5 MB-os képeket én sem szeretnék 4G-n töltögetni, hiába lejönne hamar. (több 10-100 db képről is szó lehet, attól függően, mennyit scroll-ozik a user).
Sőt, lehet, hogy ebbe a kategóriába kerülne minden mobileszközös kapcsolat.3) Gyors hálózati kapcsolat
Ezt meghagynám az asztali böngészőknek (LAN, otthoni vagy céges wifi, ahol nincs korlát az adatmennyiségre) a nagy fájlméretek miatt.Ezekhez akkor hogyan lehetne jól belőni a számokat? Amiket példának mondtál, azokat lehet is használni? Mindjárt nézem a hálózati sebességeket.
Preset,download(kb/s),upload(kb/s),RTT(ms) GPRS,50,20,500 Regular 2G,250,50,300 Good 2G,450,150,150 Regular 3G,750,250,100 Good 3G, 1000,750,40 Regular 4G, 4000,3000,20 DSL 2000, 1000,5 WiFi 30000,150000,2kB-ban:
- erős 2G: 56 kB/s
- átlagos 3G: 94 kB/s
- erős 3G: 125 kB/s
- átlagos 4G: 500 kb/sEgy fontos kérdés ezen a ponton: Az oldal többi elemét is tölti, nyilván nem 1 szálon dolgozik. Viszont a sebességmérésnek csak akkor van értelme, ha a teljes sávszélesség az övé (mármint más alkalmazások is használnak, de legalább az oldalam más elemeinek betöltése ne lassítsa, amíg sebességet mér.)
Ezt melyik ponton tudom a legbiztosabban kivitelezni? a document onload nem jó, mert addigra már az első 4 elemet betöltötte. Ha előtte indítom, akkor párhuzamosan tölti a többi elemet is (css, js stb.).
Erre mi a jó megoldás, hol van a "jó mérési pont", ahol csak ez a szál futhat?Tegyük fel, hogy ez megvan (nincs, tanácsot kérnék ide is - de csak hogy a gondolatmenetet folytatni tudjam).
Egyszerre 4 képet tölt be az oldal - persze ha a user scroll-oz mint az őrült, akkor végtelen + 4-et. De nézzük azt, hogy egyszerre csak 4-et tölt be.
Ahogy néztem, egy átlagos, jó minőségű kép, amik a feed-ekben vannak általában 100 és 250 kB között vannak. Ezeket a képeket adnám a 2-es kategóriának.
Tehát ha 4 ilyen képet tölt egyszerre, és mind 250 kB, akkor 1 MB-ot kell betöltenie egyszerre (csak a képeket számolva).Na és itt elakadtam... Milyen számokat adjak meg a három kategória határétékeinek?
Mi számít elfogadható betöltési sebességnek?Ez ugye 4G-n 2 mp / betöltés (4 db kép). Ez rendben van, bőven belefér.
Erős 3G-n ez már 8 mp / 4 db kép. Tehát betölt az első adag, scrollozol lefel kicsit, és tölt a következő adag. 8 db képre ez már 16 mp. Túl sok, ez biztos.
Talán képenként 1 mp még belefér. 250 kB/s.Az 1)-es kategóriába akkor tartozna a 250 kB/s alatti sebesség.
A 2-es kategória lenne mondjuk akkor 250-500 kB/s között, így az átlagos méretű (250 kB) képekkel számolva 2-4 mp alatt töltene be egy-egy 4-es képcsoport.
Illetve valahogy ide kell szűrnöm az akár gyorsabb kapcsolattal, de mobilon netezőket, mert azért az adatcsomagot nem szeretném "leenni" róluk. Erre is biztosan van valami módszer, hogy kiszűrjem - keresek is majd.
Mobilon nyilván wifi-n is lehet netezni, és ott nem számít az adatmennyiség. Szóval nem mondhatom minden mobilról érkezőnek, hogy ti csak a 2)-es kategória képeit kapjátok. Bár gondolom, ez egy egyszerű IF-ág lesz (HA mobilról ÉS a sebessége a 2-es kategóriában)A 3)-as kategóriába pedig a nem mobil eszközről (hanem PC-ről) érkezők. Vagy HA mobilról ÉS a sebessége gyorsabb mint... na egyelőre ezt sem tudom, itt milyen sebességekre szűrjek.
Túl sok gondolat ez így egyszerre, leírom, aztán ha kifújtam magam, visszanézek majd.
Bocs, hogy ilyen hosszú lett.;TLDR - van API ami visszaadja, de nem támogatott minden környezetben (Mac, iOS, Firefox, IE). IP alapján lehet még esetleg vélelmezni:
Privát IP tartomány: wifi
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
Minden más (ISP és publikus): mobilnethttps://stackoverflow.com/questions/8598065/how-do-you-detect-3g-vs-wifi-connection-on-mobile-safari
-
martonx
veterán
Az teljesen mindegy, hogy a képek sajátok-e, és te tárolod-e őket
A link alapján le tudod szedni, át tudod méretezni, és vissza tudod adni a megfelelő méretben.
A böngészőnek küldött html-ben nem az lesz, hogy<a href="https://kulsodomain.com/ezegykulsokep.jpg">hanem az hogy<a href="https://azenoldalam.hu/kepatmeretező?width=460&heigh=230&source=https://kulsodomain.com/ezegykulsokep.jpg"> -
martonx
veterán
Sziasztok!
Arra gondoltam, hogy a kliens hálózati sebességétől teszem függővé, hogy milyen (vagy milyen minőségű) képeket küldök ki az eszközre (ezeket természetesen felülbírálhatja, ha szeretné).
Ha gyenge a kapcsolata (pl. 3G), akkor csak 1-2 ismétlődő "template" kép, cache-li, és nyilván ugyanazt tölte be újra és újra. Ha jobb kapcsolata van (4G pl.), akkor már jöhetnek mondjuk a 250kB alatti képek is. Ha pedig mondjuk LAN-on van, akkor akár az egészen nagy képek is.
Így lenne 3 kategória, csinálnék az oldal betöltésekor egy sebességtesztet, és ehhez mérten adnám a tartalmat.
A kérdés csak az, hogyan lehet legjobban ezt a sebességtesztet elvégezni. Amilyen megoldásokat találtam, azok úgy működnek, hogy van 1 fix fájl (kép), annak adott a mérete byte-ban, azt letölti a kliens, és ahhoz mérten, hogy mennyi idő alatt szedi le, abból számolja ki a hálózati sebességet.
Pl.: [link]Ez kisebb fájlokkal is működik? Mert mondjuk ha adott egy rossz lefedettségű 3G kapcsolat, nyilván nem fogom azzal kezdeni az oldal betöltését, hogy rádobok egy 5 MB-os fájlt, hogy megnézzem, mennyit bír.
Elég egy 100kB-os is? Valós (használható) eredményt ad?Vagy van erre jobb módszer, hogy megállapítsam a kliens hálózati sebességét?
Köszi!
Rosszul közelíted meg. Mindig éppen akkora képet adj vissza, amekkora kell, semmivel se nagyobbat. És igen, ehhez kelleni fog némi backend, amivel ezt megoldod, hogy mindig tökéletesre méretezett, optimálisan tömörített képet tudj szerezni.
Semmi értelme nincs tesztelgetni a kliens sávszélességét. -
sztanozs
veterán
Sziasztok!
Arra gondoltam, hogy a kliens hálózati sebességétől teszem függővé, hogy milyen (vagy milyen minőségű) képeket küldök ki az eszközre (ezeket természetesen felülbírálhatja, ha szeretné).
Ha gyenge a kapcsolata (pl. 3G), akkor csak 1-2 ismétlődő "template" kép, cache-li, és nyilván ugyanazt tölte be újra és újra. Ha jobb kapcsolata van (4G pl.), akkor már jöhetnek mondjuk a 250kB alatti képek is. Ha pedig mondjuk LAN-on van, akkor akár az egészen nagy képek is.
Így lenne 3 kategória, csinálnék az oldal betöltésekor egy sebességtesztet, és ehhez mérten adnám a tartalmat.
A kérdés csak az, hogyan lehet legjobban ezt a sebességtesztet elvégezni. Amilyen megoldásokat találtam, azok úgy működnek, hogy van 1 fix fájl (kép), annak adott a mérete byte-ban, azt letölti a kliens, és ahhoz mérten, hogy mennyi idő alatt szedi le, abból számolja ki a hálózati sebességet.
Pl.: [link]Ez kisebb fájlokkal is működik? Mert mondjuk ha adott egy rossz lefedettségű 3G kapcsolat, nyilván nem fogom azzal kezdeni az oldal betöltését, hogy rádobok egy 5 MB-os fájlt, hogy megnézzem, mennyit bír.
Elég egy 100kB-os is? Valós (használható) eredményt ad?Vagy van erre jobb módszer, hogy megállapítsam a kliens hálózati sebességét?
Köszi!
Szvsz célszerű három különböző méretű fájllal dolgozni, hogy melyik jön le az adott időn belül (pl 3 sec): 10 kB, 100 kB, 1 MB
Ez alapján be tudod lőni a sebességet. Ha valamelyik nem jön le a kért időn belül akkor az annál egyel kisebb sebességet választod (és a következővel meg sem próbálkozol).
De lehet más módszerrel is próbálkozni (pl websocket és fix méretű (random) payload és azt nézed meg, hogy adott idő alatt mennyi csomag jön át).
Új hozzászólás Aktív témák
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
- Eredeti játékok OFF topik
- BMW topik
- Gaming notebook topik
- A Linux megnégyszerezte magát a Steamen — a Microsoft ismét ígérget
- Sorozatok
- Arc Raiders
- Kerékpárosok, bringások ide!
- Fejhallgató erősítő és DAC topik
- Autós topik
- djculture: Az elvileg már senkinek nem kellő HDD-k ára is egekbe emelkedett 4 hónap alatt
- További aktív témák...
- DDR4 memóriák eladóak
- Hihetetlen Gaming PC brutális specifikációkkal! A dán Topdata.dk IT-cég által összerakva
- 2.5" 100% noti HDD-k Western Digital, Seagate 320Gb (3k) +1Tb (15k) van 1db SSHD is (15k)
- Lenovo P16s gen2 16" //Core i7 1360P // Nvidia RTX A500 4GB GDDR6 // 16Gb /512GB SSD/ gyári garancia
- Micron és Samsung 32GB ram 1 x 32GB 3200Mhz vagy 2 x 16GB 2666Mhz - több db elérhető
- LG UltraGear 27GS75Q-B Monitor! 2560x1440 / 200Hz / 1ms / G-Sync / G-Sync / FreeSync
- Vásárlunk iPhone 12/12 Mini/12 Pro/12 Pro Max
- Xbox Series S 1 TB + kontroller 6 hó garancia, számlával!
- M4 iMac 2021 24" - 16GB RAM, 512 GB SSD 27% ÁFÁS
- Apple iPhone 14 Pro 128GB Space Black Használt 100% akkumulátor
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest


(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.)
Remélhetőleg.
) .



- megpróbálom valamelyik informatikusunkat becserkészni ezügyben.




