- Honor 200 - kétszázért pont jó lenne
- Honor 200 Pro - mobilportré
- Keretmentesít a Galaxy S25 FE
- Karaktere biztos lesz az első Nothing fejhallgatónak
- Csíkszélességben verné az Exynos 2600 a Snapdragon 8 Elite 2-t
- One mobilszolgáltatások
- iPhone topik
- Redmi Note 13 Pro 5G - nem százas, kétszázas!
- Samsung Galaxy A54 - türelemjáték
- Samsung Galaxy S21 és S21+ - húszra akartak lapot húzni
-
Mobilarena
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
-
Karma
félisten
Az aszinkron működést nem tudod megkerülni, úgyhogy olyan getData függvényt, amit egyszerűen szinkron módon meghívsz és eredményeket ad vissza, lehetetlen írni. (Nem is feltétlen baj.)
Van egy pár lehetőséged, az egyik legegyszerűbb, ha adsz egy callback paramétert a getData függvényednek. Ez például egy olyan kétparaméteres függvény, aminek az első paramétere a futáskor történt hiba (lehet `null` is ha minden szép), a második pedig a tényleges adat.
A lényeg, hogy az indexedDB-s kódod az utolsó onsuccess handler végén meghívja ezt a függvényt, így tudod feldolgozni az eredményt.
Például:
this.getData = function(callback){
var open = indexedDB.open(database, 1);
open.onsuccess = function() {
// Start a new transaction
var db = open.result;
var tx = db.transaction(table, "readonly");
var request = tx.objectStore(table).getAll();
request.onsuccess = function() {
callback(null, request.result);
};
request.onerror = function() {
callback(request.errorCode);
};
// Close the db when the transaction is done
tx.oncomplete = function() {
db.close();
};
};
open.onerror = function() {
callback(open.errorCode);
}
};Máshol meg így hívod:
valami.getData(function(err, data) {
if (err) {
console.log("Error while reading data", err);
return;
}
console.log("Found data", data);
});Ha meg tisztább kódot akarsz, keress egy promise wrappert az IndexedDB-hez szerintem. Persze azt is meg kell tanulni használni először.
Amúgy sose használtam az IndexedDB-t, de a megérzésem azt mondja, hogy nem kéne minden lekérdezésnél nyitni-zárni.
-
Karma
félisten
válasz
sztanozs #6571 üzenetére
Elvileg az Electronnal gyakorlatban is jó eredményeket lehet elérni
-
Karma
félisten
Pedig minden benne van ebben a cikkben, ami kell hozzá. A drag and dropos példakód handleFileSelectjében egy fájllistát kapsz, amin végig tudsz menni ciklussal (mint a példakód), és nyiszálhatod őket szabadon.
Az előző kódrészlet meg azért nem működött, mert te böngészőben futó megoldást keresel (amit nem mondtál), tick pedig Node-hoz adott egy lehetséges megoldást.
-
-
Karma
félisten
válasz
#68216320 #6070 üzenetére
Welcome to 2010
A feladat egyszerre könnyű és szerteágazó.
Könnyű, mert alapvetően három lépésből áll a folyamat:
1) a törzsadatok kiajánlása egy JSON API-n, hogy JavaScripttel le tudd őket kérni a megjelenítéshez.
2) JS oldalon összeállítasz egy komplett modellt a konfigurált gépről, illetve megírod a validációkat ehhez a modellhez. Az 1. pontban jövő adatokból a felhasználó kattingatása alapján kitöltögeted a mezőket.
3) Mikor minden zöld, a modell adatait JSON-né konvertálod, és egy AJAX POST hívással átadod a PHP-nak feldolgozásra. (Természetesen ott is validálni kell.)Szerteágazó, mert meg lehet csinálni akár vanilla JS-sel is, jQuery-vel feltuningolt de még mindig lábbalhajtós JS-sel is, meg használhatsz valamilyen frameworköt is hozzá (a JS objektumok->HTML bindingra nagyon sok megoldás van, és szerintem megérné bevetni valamelyiket).
Példának meg a shopping cart egy remek keresőszó, a középső variánsra találtam is egy egész érdekes példát, de javaslom a Google további simogatását.
-
Karma
félisten
válasz
martonx #6062 üzenetére
Így van. Ha iframe-ben lenne az új tartalom, akkor is csak abban az esetben manipulálhatná a külső JS, ha ugyanarról a domainról jön.
vakondka: A te kezedben van a másik oldal? Ha igen, akkor URL-ben átpasszolhatnád az értéket, a céloldal meg kitöltheti onnan az értéket.
-
Karma
félisten
válasz
fordfairlane #6054 üzenetére
Nem hiszem, hogy ez lenne a feleslegesség mércéje.
(#6055): A this megőrzése például egy elég fontos különbség. A régi JS-hez képest lehet "nyelvidegen", de rengeteg más nyelvben több éve van hasonló konstrukció.
-
Karma
félisten
válasz
fordfairlane #6051 üzenetére
Ez még érvényes kritika is lehet (bár szerintem az arrow hasznosabb a kettőből, hogy a nyelv közeledjen a nagyokhoz); de mi köze a generátoroknak mindehhez? Az azért messze túlmutat az egyszerű szintatikai csinosításon.
-
Karma
félisten
Egyiknek sincs sok értelme igazából. Használj crontabot/feladatütemezőt és hívogasd azzal a PHP kódodat (pl. curllel). Mondjuk ha meg mindenáron JS-ből (böngészőből*?!) akarod hajtani a témát, akkor is használhatsz AJAX-ot.
*: Feltételeztem, hogy nem Node.js-ről van szó, mert akkor nem kérdeztél volna ilyet szerintem. De javíts ki, ha tévedek.
-
Karma
félisten
Ez a gondolat elég közel áll egy kilencvenes évekbeli horrorfilmhez, de úgy tűnik, másnak is volt már ilyen rémálma. Én azért inkább gyurmáznék a kérdésen addig, amíg nem jön ki az, hogy nincs erre szükséged...
-
Karma
félisten
válasz
Mbazsika #6010 üzenetére
Ezt a példát láttad? Az API meg a termék eléggé eltérő képességekkel rendelkezik, de azért hátha segít.
-
Karma
félisten
Elég jó kulcsszavakkal kerestél szerintem, nem tudom miért nem találtad meg a kulcsrakész megoldást ("Brute Force Protection" szakasz).
-
Karma
félisten
válasz
martonx #5932 üzenetére
Esetleg egy ilyen megközelítés?
-
Karma
félisten
válasz
Sk8erPeter #5897 üzenetére
Azért írtam az XAMPP-t, mert pár hozzászólással előbb ezt linkelte neki Zedz. A portable XAMPP kicsit lightosabb, mint a WebPI által felrakott bármi
, de egyébként tapasztalatnak mindenképp hasznos az IIS is.
-
Karma
félisten
válasz
deedetette #5894 üzenetére
A PHP-t alapesetben nem fordítod sehová. A szerveredbe beépülő PHP modul fordítja bytecode-ra és értelmezi. A HHVM egy kicsit máshogy megy de a lényegen nem változtat: ha van egy jól bekonfigurált szervered (az XAMPP ilyet ad), akkor csak berakod a kívánt helyre a forrásfájlt, és már hívható is.
Egyébként van külön PHP programozás tipik is, javaslom ott folytatni.
-
Karma
félisten
válasz
PumpkinSeed #5685 üzenetére
Remélem nem gondolod komolyan, hogy ezt a spagettit bárki visszafejti, és kapásból rámutat, az algoritmusod melyik ponton hibás, hogy fekete csíkokat kapsz az elején. Javaslom a favágó módszert, hátha kiderül, melyik függvény hibás.
A második anomália viszont egyszerű technikai jellegű: létrehozol egy 300x150-es canvast - default értékek, ha elfelejtenéd a width/height attribútumot beállítani rajta HTML-ben -, aztán szétnyújtod kódból állított mérettel
. Ennek az eredménye skálázás lesz.
Elkerülhető például, ha a canvast kódból hozod létre, pontosan beállítva a méreteket.
-
Karma
félisten
válasz
PumpkinSeed #5661 üzenetére
Az irány jó szerintem, bár a közvetlen színállítás helyett jobb lenne a bodyn classokat állítani, és a CSS-re hagyni ezeknek a "témáknak" a megvalósítását.
-
Karma
félisten
válasz
Sk8erPeter #5505 üzenetére
Találtam egy rövidebb verziót.
Ez a blokk átverhető a window.history.pushState-tel:if(document.location.href.match(/hirtv_kesleltetett/i) || document.location.href.match(/hirtv_live/i)) {
reloadBlocker = true;
}Például így: window.history.pushState({}, null, "hirtv_live").
Egy kicsit fejre áll tőle a böngésző, de a feltétel biztosan igaz lesz tőle
-
Karma
félisten
Nincs. Egyébként se mennél vele semmire.
De egyébként megnyitottam az oldalt és elsőre megtaláltam a tűt: a grid_site.js-ben a 811. sortól kezdődik az automatikus frissítés. A 839. sor az, ami ténylegesen újratölti az oldalt. Ha a reloadBlocker változót rá tudod venni, hogy true értéke legyen; vagy a korábban leírt módon a document.location.assign-t felülvágod egy üres függvénnyel, akkor nem fog tudni frissülni, elvileg.
Szerk.: Úgy látom SO-n, hogy a document.location.assign nem felülvágható
Na mindegy, ott kell varázsolni valamit, az a biztos. Vagy letiltani az oldalon a JavaScriptet.
-
Karma
félisten
Szerintem nem szükségszerű, hogy a rossz érték beállítása után azonnal olvassa is valahol, így a stacktrace-ből nem sok látszik. Mondjuk az is egy jó kérdés, miért vannak pőrén változók, amit többen is állítgathatnak?
Egy darabig filóztam, hogy az Object.observe-vel nem lehetne-e megoldani a dolgot, de sajnos ott is csak a változás tényéről jön értesítés, a kiváltó ok nem látható.
-
Karma
félisten
A JS-telen felhasználók lehet tényleg nagyon kevesen vannak, és valószínűleg tényleg meg lehet spórolni a támogatásukat... Egy-két elvetemültebb egyént ismerek én is csak, az meg simán mérési hiba, főleg mobilon.
Viszont a böngészők közötti eltérések még mindig valós probléma. Nem a JavaScript vonatkozásában szerencsére, arra nagyon jók a shimek, de CSS-ben vicces helyzetek tudnak előállni például a bugtenger Android 4.0-án, vagy iOS 6-on... Egyébként igen, a frameworkök megvédenek sok gyakori pofontól, de nem mindenhatóak - amint el akarsz térni, vagy hozzá akarsz tenni valami olyan elemet, ami nincs benne az általuk kitalált eszköztárban, máris ott vagy, hogy mindenen le kell ellenőrizned.
-
Karma
félisten
A kontextus meg a helyzeted pontosabb ismerete nélkül (pl. a kódbázis minősége) nehéz testreszabott választ adni, de amit most leírtál, a mai gyakorlatban elég népszerű Single Page Application (~ webes vastag kliens) stratégia. (Egy kulcsszónak használhatod az SPA-t.)
Ennek van előnye és hátránya egyaránt, hogy néhányat soroljak:
+ Jobb érzékelt sebesség/felhasználói élményt nyújt az első betöltés után.
+ Kényszerűen tisztább az architektúra, jobban újrafelhasználható (pl. natív mobilalkalmazások, új UI...) a monolit projekt kettévágása miatt(*).
+ A részek önálló életciklussal bírnak, tehát több csapat könnyebben dolgozhat a részeken; külön tesztelhető és élesíthető minden elem.
+ A backendhez és a frontendhez is vannak specializált könyvtárak, ahelyett hogy egy eszközzel próbálnád egy n-tier alkalmazás minden aspektusát lefedni. (igen, még mindig nem szeretem a PHP-t)- JavaScript nélkül (pl. NoScript felhasználók) az egész történet halott, úgyhogy egy igazán univerzális megoldáshoz nem dobhatod ki a Drupal által generált önjáró, "ódivatú" oldalt.
- A böngészők közötti eltérések sose szűnnek meg. (Safari is the new IE)
- Nagyon könnyű tévútra menni, és ennek következtében (abszolút és UX-es értelemben is) lassú, működésében hibás, neadjisten biztonságilag kockázatos kódot írni!
- Tanulni kell. Egy tiszta JS alkalmazás ég és föld ahhoz a szinthez képest, amikor egy sablonból generált HTML oldal kis szakaszait jQueryvel ugráltatja az ember. Az azzal kapcsolatos tapasztalatok inkább veszélyesek, mint hasznosak.(*): Ehhez igazából nem kell SPA, csak egy jó környezet meg önfegyelem. Például a legtöbb értelmes MVC megvalósításban teljesen független az üzleti logika a HTML generálástól (megjelenítéstől).
Személy szerint Drupalt soha nem használtam, a Foundationt is csak kerülgettem (inkább Bootstrapeztem); de az elgondolás nemes, és ha a szerveroldalad képes az adatait strukturált formában kiadni, szerintem mindenképpen megér egy próbát. Sajnos nem tudom, hol lehetne jól elindulni nulláról, bár az Angular 1.4-hez az ng-book elég bíztató. Valaki segítsen ki!
-
Karma
félisten
-
Karma
félisten
válasz
PumpkinSeed #5426 üzenetére
Köszi, próbálkozom
Egyébként szoftverfejlesztő vagyok, jelenleg szabadúszom (egy nagy Angular projekten dolgozom főleg most), azelőtt Android/WP/iOS fejlesztőként dolgoztam, azelőtt salátában sokmindent (BI, Java SE alapon hatalmas rendszerek foltozása, SIM programozás), azelőtt meg Symbian fejlesztő voltam. Keresem a magasabb rendű rendezőelveket a tervezés/fejlesztés mögött (ld. Martin Fowler munkásságát, számomra példakép), a sok lexikális dolog meg egyszerűen rámragad. Kivéve a PHP-t, azzal taszítjuk egymást
-
Karma
félisten
"Rögtön a létrehozás után egy ajax kéréssel értéket is adok ennek a változónak."
Az aszinkronitás erősen kulcsfontosságú kérdés JavaScriptben, úgyhogy amellett, hogy az előbb linkelt példakódból összeollózód magadnak a probléma megoldását, javaslom minél előbb dobd el a hibás gondolkodást. Hamar hozzá lehet szokni a jövő idővel való számoláshoz, a promise-ok meg elég jól kezelhetőek.
Persze ES7-tel sokkal szebb lesz.
-
Karma
félisten
válasz
inf3rno #5389 üzenetére
Én inkább angularral mennék/mentem neki, mert bár az is 125 KB (vö. D3 150 KB), ezért a méretért cserébe a teljes feladatot, no meg az esetleges hálózati kommunikációt, meg bármi mást ami egy teljes alkalmazáshoz kell, meg lehet csinálni könnyen vele.
Akkor hűltem el nagyon, amikor próbáltam D3 + NVD3 + angular direktívákkal összerakni háromféle chartot, 500 KB-nyi lib olyan chartokért, amik közelében sincsenek a designer igényeinek... Ezért írtam meg inkább kézzel.
-
Karma
félisten
válasz
Carasc0 #5387 üzenetére
Hát írd át akkor úgy, hogy jó legyen
A fiddle 18. és 25. sora számítja ki a zöld téglalap felső sarkának koordinátáját (gY) és a téglalap magasságát (gH) a teljes chart magasságának (height), a fél skála (range, azaz ha 100, akkor a chart -100 - 100-ig terjed) valamint az aktuális százalékérték (value) függvényében.
Ezt a számítást megírni nem webfejlesztés
Maradt egy felesleges rész az előzőben, úgyhogy ezt a verziót ajánlom kiindulási alapnak. Egyébként ha akarsz lekerekítést, az SVG clip path funkciója lesz a barátod.
-
Karma
félisten
válasz
martonx #5385 üzenetére
Megcsináltam minimálban.
Egyben demostrálandó, hogy egy kész megoldás kontextus és magyarázat nélkül szerintem elég nehezen felhasználható.
-
Karma
félisten
válasz
inf3rno #5379 üzenetére
A D3 egy brutál nagy lib egy ilyen egyszerű feladathoz. Mostanában elég sokat csináltam egyedi chartokat egy Angular alapú projektben (közvetlenül SVG-t állítok elő template-ből), és teljes nyugalommal jelentem ki, hogy az adat hatására frissülő szintező összesen 20 sor kódból elkészíthető animáció híján
Mondjuk tiszta lappal indulva szerintem az egy hét bőven kevés.
-
Karma
félisten
válasz
PumpkinSeed #5348 üzenetére
Szerintem mindenképp megérné bővíteni, az SSD is létfontosságú, de nem csodafegyver. Ha swappelni kell, az még az SSD elérési idejeivel is lassabb, mint ha nem kéne
-
Karma
félisten
válasz
inf3rno #5331 üzenetére
A WinJS alkalmazáshoz lehet más nyelven írt WinRT komponenseket csatolni, én lehet inkább átvinném a problémát a C# világba. A BLE kezelés lépéseit egyébként ez a blog leírja - még az is lehet, hogy át lehet ültetni JS-be soronként.
Ha szerencséd van, a kütyü az összes fontos paramétert kiajánlja GATT attribútumokként, amiket tudsz olvasni vagy írni. Ha nincs szerencséd, és pl. a FitBithez hasonlóan egy titkosított blobként tárolnak mindent, akkor elég esélytelen a feladat.
Szerk.: Most látom, hogy WP-s blogot linkeltem be. Az elv meg a használt osztályok ettől még hasonlóak. Morzsák meg MSDN-en is vannak.
-
Karma
félisten
válasz
ltpalermo #5312 üzenetére
Nos. Az biztos, hogy amit Winddirectionként kivettél, annak nyoma sincs a saját adatodban. Neked is javaslom, hogy az adatot másold be egy online JSON parserbe, amivel utána könnyen meg tudod nézni a különböző útvonalakat és struktúrákat.
Ezzel több szerencséd lesz:
var windDir = httpdata.current_observation.wind_dir;
Aztán a végtelen if-else tenger helyett sokkal tisztább, ha lehetséges értékeket kigyűjtöd előre egy objektumba, és feldolgozáskor csak megpróbálod megkeresni benne a megfelelő kulcs-érték párt.
// valahol a szkript elején
var windDirectionLookup = {
'északi': 'É',
'déli': 'D',
'délkeleti': 'DK',
... (a nyolc égtájat leírni házi feladat) ...
};
// ... feldolgozás ...
var windDir = httpdata.current_observation.wind_dir;
setGlobal('%Wwinddir', windDirectionLookup[windDir] || '-');Az utolsó sorban látható kifejezés megpróbálja kivenni a megfelelő rövidítést a [] operátorral. Ha nem sikerül, mert mondjuk olyan szöveg jön, ami nincs az objektumban, akkor egy kötőjel lesz az eredmény.
-
Karma
félisten
válasz
ltpalermo #5310 üzenetére
De, az string, úgyhogy nem kell sehova konvertálnod. Mobilról nem tudom tüzetesebben megnézni, de nem lehet, hogy csak olyan esetbe futottál, ami nincs benne az if-else tengeredben?
Majd ha hazaértem és más nem ugrik rá közben, mutatok egy tisztább megoldást lookup table-lel.
-
Karma
félisten
válasz
slice14 #5293 üzenetére
Szerintem ez a félregexes megoldás nem annyira szerencsés. Mondjuk hogy helyes-e, azt ki tudod próbálni JSFiddle-ön vagy a Chrome konzoljában (F12) - első blikkre nekem nem tűnik annak, de ez nem jelent semmit
Így szerintem tisztább és olvashatóbb lenne:
if (Elorejelzes1td2.indexOf('legmagasabb') === -1) {
setGlobal('%Elorejelzes1td'," ");
}
else {
setGlobal('%Elorejelzes1td',Elorejelzes1td2);
}Vagy egy sorban:
setGlobal('%Elorejelzes1td', Elorejelzes1td2.indexOf('legmagasabb') === -1 ? " " : Elorejelzes1td2);
-
Karma
félisten
Néha. Igazából nem sokat szoktam foglalkozni vele, az angular-fullstack Yeoman generátorral szoktam indulni és csak minimálisan piszkálom az általa belőtt Expresst.
Amúgy tényleg olyan, mint a Python (vagy a YAML), mert az indentálás számít. Nekem ezzel amúgy nincs bajom, sőt, de mások szoktak viszolyogni
-
Karma
félisten
válasz
Mr Dini #5268 üzenetére
A Weather.current_observation.temp_c egy szám, nem string, így nincs is neki split metódusa. Felejtsd már el végre, vedd úgy, hogy nincs is ilyen a nyelvben
Úgy látom, hogy a fok egészrészét próbálod meghatározni, erre használd inkább a toFixed metódust. Ez még kerekít is egy kicsit.
Szóval:
var Jelenlegifok = Weather.current_observation.temp_c;
var Jelenlegihofok = Jelenlegifok.toFixed(0); -
Karma
félisten
-
Karma
félisten
válasz
PumpkinSeed #5185 üzenetére
Pedig működik az: [link] (Kicsit módosítottam a példádon, mert a jsFiddle nem szereti a document.write-ot. Mondjuk megértem.)
Én a fájl elejére szoktam mindig kiírni a strict módot, nem baj az, ha mindenhol meg van kötve a kezem.
-
Karma
félisten
válasz
Speeedfire #5179 üzenetére
A Crosswalk pont, hogy csak Androidra elérhető
(Na jó, elvileg Tizenre is.)
-
Karma
félisten
válasz
Speeedfire #5177 üzenetére
Androidon próbáld meg a Crosswalkot használni, hátha segít a gyári böngésző szintjét visszahozni. Mondjuk ettől még lehet, hogy valami elszúrás van mögötte, például nehéz jó görgetést írni manuálisan...
Én az Ionic Frameworkkel szoktam mindennek nekiszaladni, ott már ezeket az eseménykezeléseket szépen összehozták.
-
Karma
félisten
válasz
Speeedfire #5049 üzenetére
Helyzetfüggő (nekem mondjuk arra kellett, hogy egy távoli DB-t szinkronizáljak), de a PouchDB nekem bevált.
-
Karma
félisten
válasz
PumpkinSeed #4754 üzenetére
Igazából ha belegondolsz, a játék különböző kimeneteinek táblázata nem definiál viselkedést, nem kell logikai szerkezetekkel (if/else) leírnod. Sőt, mivel csak adat, jobban jársz ha ehhez méltóan tárolod - például egymásba ágyazott objektumokban - és egyszerű lookuppal keresed meg a megfelelő eredményt.
-
Karma
félisten
válasz
PumpkinSeed #4752 üzenetére
Elírtad a szöveget a 33. sorban.
...sőt úgy tűnik, hogy a lehetséges kombinációk egyharmadát kezelted le jól, egy harmad hiányzik (döntetlenek) és ami van helyette, az nem stimmel.
-
Karma
félisten
válasz
fordfairlane #4583 üzenetére
Hogy konkretizáljam, e célból a Microsoft elég sok VM-et elérhetővé tett. De például a RemoteIE szolgáltatással még virtuális gép se kell.
-
Karma
félisten
válasz
honda 1993 #4294 üzenetére
Ugye nem csak belehányod a kódot a HTML-be, hanem egy script taget raksz köré? Elmondásod alapján ez biztosan hiányzik.
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>
<body>
<script>
console.log('Hello world!'); /* <-- ehelyett a saját kódodat rakd */
</script>
</body>
</html>De egyébként ha csak JS kísérletezést tartasz, akkor a JSFiddle a barátod lesz.
-
Karma
félisten
válasz
kemkriszt98 #4266 üzenetére
Nananananananana Batman!
Csak a megfelelő kulcsszavakra kell keresned Google-ben, és láthatod, hogy elég népszerű a Blender és a Three.js library összekötése, amivel pont azt össze tudod hozni WebGL alapon, amit szeretnél. Például itt van egy tutorial.
-
Karma
félisten
Megnéztem a kódot, szerintem annyi híja van, hogy az innerText | textContent eredményét körbe kell venned egy parseInt hívással. Ez a függvény a szöveg elején lévő számot dolgozza fel, minden más maszlagot figyelmen kívül hagy.
Tehát:
var seed = parseInt(tttrtd[7].innerText || tttrtd[7].textContent);
var dls = parseInt(tttrtd[6].innerText || tttrtd[6].textContent);És így ha a szöveg "5 letöltő", akkor az eredmény 5 lesz.
-
Karma
félisten
válasz
[pod]Diablo #4195 üzenetére
Nekem Chrome-ban se jelenik meg semmilyen térkép, hol kéne egyáltalán lennie?
-
-
Karma
félisten
Nem csak a Brackets, hanem például a TileMill térképszerkesztő is tisztán Node.js alkalmazás. Ez utóbbi is open source, meg lehet nézni hogy mire épít.
Én egyébként a DeskShellről és a node-webkitről hallottam eddig.
(#4106) Sk8erPeter: Tényleg nagyon jó cikk, köszi
Egyébként az ECMAScript 6 terjedéséről mit lehet tudni? Azt olvastam, hogy a Node a 0.11.x-es ágon már támogatja, de stabilizálódni még nem akar... Pedig a generátorok nagyon odavernek.
Szívesen használnám már gyakorlatban például a co-t.
-
Karma
félisten
Szoktam még egyébként betenni plusz egy modult mindenhova, az underscore-t, amivel a tömb és objektumműveletek igencsak leegyszerűsíthetőek. A példádban például kezelhetőbbé teheti az eredményeket, ha a cheerio map, vagy az eredeti megoldásod helyett csak a számodra hasznos információt gyűjtöd ki a listába.
Ennyi változtatással:
var _ = require('underscore');
...
requestP('https://news.ycombinator.com')
.then(function (html) {
var $ = cheerio.load(html);return _.map($('span.comhead'), function (element) {
var link = $(element).prev();
return { title: link.text(), url: link.attr('href') };
});
})
.then(function (articles) {
console.log(articles);
})
.catch(console.error);A kimenet sokkal barátságosabb:
[ { title: 'Greed and the Wright Brothers',
url: 'http://www.nytimes.com/2014/04/19/opinion/nocera-greed-and-the-wright-brothers.html' },
{ title: 'Reactive UIs with React and Bacon',
url: 'http://joshbassett.info/2014/reactive-uis-with-react-and-bacon/' },
{ title: 'HMRC \'plans to share tax data with private firms\'',
url: 'http://www.bbc.co.uk/news/uk-27086401' }, ...] -
Karma
félisten
Nem véletlenül írtam privátot, hogy kifejtem bővebben
No de (hahaha), akkor következzen egy egyszerű példa a te feladatodra. Egy plusz modul kell hozzá, a when. Ott kezdődik a dolog, hogy a requestből készíteni kell egy olyan változatot, ami callback függvény helyett egy ígérettel tér vissza.
(Az ígéret egy olyan objektum, ami majd valamikor a jövőben fog kiértékelődni, vagy sikeresen, vagy nem. Mindkét ágra fel lehet iratkozni külön, és ha láncba fűzi őket az ember, akkor úgy viselkedik, mint a rendes függvényhívások - az eredmények lépésről lépésre átpasszolódnak, a hiba meg az egészet megszakítja.)
Szóval a request függvényt be kell foglalni (ezt csinálja a requestP függvény), utána mehet a lényeg. Bátorkodtam kicsit egyszerűsíteni a kigyűjtésen, ha már van a cheerionak is map függvénye.
var when = require('when'),
cheerio = require('cheerio'),
request = require('request');
function requestP(url) {
return when.promise(function (resolve, reject) {
request(url, function (err, res, body) {
if (err) {
return reject(err);
} else if (res.statusCode !== 200) {
err = new Error("Unexpected status code: " + res.statusCode);
err.res = res;
return reject(err);
}
resolve(body);
});
});
}
requestP('https://news.ycombinator.com')
.then(function (html) {
var $ = cheerio.load(html);
return $('span.comhead').map(function (i, element) {
return $(element).prev();
});
})
.then(function (articles) {
console.log(articles);
})
.catch(console.error); -
Karma
félisten
Azért bonyolultabb ennél a helyzet, mert a request szigorúan aszinkron működik, azt mondani a Node-nak hogy "most fagyjál le amíg megjön a válasz" nem lehet.
Ha csak egy valamit akarsz csinálni, kirakhatod a callback függvényt egy külön, külső függvénybe, és név szerint adhatod oda a requestnek. Ezzel el lehet lavírozni, de tisztább, ha vagy az async, vagy a promise-alapú modulok (Q, when) valamelyikét berakod és láncot fűzöl a jövőbeli hívásokból.
Amit linkeltem forrás a whent használja erre.
-
Karma
félisten
Persze, csak rakd be a végső kiírást a feldolgozás végére.
var request = require('request');
var cheerio = require('cheerio');
var szoveg = new Array();
request('https://news.ycombinator.com', function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
$('span.comhead').each(function(i, element){
var a = $(this).prev();
szoveg.push(a);
});
}
console.log(szoveg); // <--- lentről, ide
}); -
-
Karma
félisten
válasz
MrSealRD #4061 üzenetére
Egyetértek martonxszel abban, hogy a jQuery nem illik a sorba – az csak az alapja lehet egyrészt a JS-sel felturbózott weboldalaknak, másrészt bonyolultabb libek alatt hálózati/DOM manipulációs rétegnek használható, de önmagában kevés.
Az Ext.JS-nek korábbi verziójával dolgoztam, hát az erősen kitekert volt. Hozzá lehetett szokni, de azért...
A felsoroltakból az Angular tanulmányozását javasolnám, de bevenném még a Backbone.js-t is. Ezzel is van konkrét tapasztalatom, gyorsan tanulható és be is vált.Elvben a Knockout is igen erős szerszám a UI összeállításához.
CSS fronton meg (ez mégiscsak egy külön témakör) a Twitter Bootstrap szerintem mindenképp megér két misét.
-
Karma
félisten
válasz
trisztan94 #4042 üzenetére
Mi? Van WP8.1 SDK RC?
-
Karma
félisten
Huh, most nézem, hogy a közepe kicsit zanzás lett. Mobilon írtam, és nem vettem észre
Szóval az első bekezdés vége ez akart lenni:
Platformonként változik, hogy milyen csatornán keresztül tud a natív kód a JS felé szólni. WP-n mint láthattuk az InvokeScript metódus jó erre; Androidon és klasszikusan iOS-en(*) a "javascript:"-es sémára navigálás működött (ezzel példáloztam korábban).
A szkriptek visszafelé is kommunikálhatnak egyébként, WP-n egy globális függvényt hívhat meg a JS; iOS-en az aktuális URL változását lehet figyelni; Androidon meg a legerősebb, mert közvetlenül ki tud hívni Java metódusokra – persze csak amiket a natív alkalmazás előre kiajánl a JS bridge-nek.
(*): iOS7-en bejött a JavaScriptCore, ami elméletileg közvetlen összeköttetés a JS és Obj-C világ között. De erről nem tudok semmit.
-
Karma
félisten
Alapvetően jól képzelted el, erről van szó: adott egy többé-kevésbé komplex webalkalmazás, lokálisan vagy online megnyitva, amit egy natív mobilalkalmazás futtat egy beágyazott böngészőben. Platformonként változik, hogy milyen csatornán keresztül (ld. az előbbi InvokeScript WP-n, navigációt Androidon és iOS-en), de kommunikálhat a szkript is kifelé (ez pl. Androidon a legerősebb, mert közvetlenül ki tud hívni Java metódusokra).
Lehet hackelni is, mint az előző kérdésvonulatban, de ha az ember nulláról épít hibridet, jobban jár ha megtervezi magának az interfészt előre
Én egy olyan alkalmazásban használtam ilyen architektúrát, ahol a backenden generált tetszőleges tartalmú kérdőíveket (mini webalkalmazásokat) lehet generálni, a kliensek letöltik ezeket, és utána a felhasználók offline kitölthetik újra meg újra. A JS interfész ott jön a képbe, hogy a kitöltés eredményét ezen keresztül szivárog át a Java kódhoz, ami a tárolást és feltöltést kezeli.
-
Karma
félisten
-
Karma
félisten
válasz
leximester #4028 üzenetére
Mondjuk stringből Urit csinálni nem nagy kaland, ellenben ja, amit írtam a "javascript:" előtag nélkül az InvokeScripttel tényleg jobb.
-
Karma
félisten
válasz
leximester #4025 üzenetére
Ja most látom, ez már túl lett lépve, bocsi
De azért nem törlöm ki.---
Az a helyzet, hogy a WP WebBrowser felől csak olyan JavaScript dolgokat tudsz meghívni, amik globálisan elérhetőek. A valami függvényed egy globális függvény, így kapásból elérhető; viszont a kérdéses InputManageres történet valószínűleg el van fedve az ilyen behívások elől.
Ez most hack, de például csinálhatnál az oldalad végénél egy globális példányt ebből, és azon meghívhatod a metódust.
<script type="text/javascript">
var globalInputManager = new KeyboardInputManager();
</script>És utána az appodban nyomsz egy ilyet:
webBrowser.Navigate("javascript:globalInputManager.restart()");
Akkor talán mennie kéne.
---
Na visszatérve az új problémára, az egyszerűbbik megoldás az inputmanager meghackelése lenne (ha az event undefined, akkor ne akarjon preventDefaultot hívni), illetve C# oldalon is lehet hákolni.
webBrowser.Navigate("javascript:globalInputManager.restart(document.createEvent('hack'))");
-
Karma
félisten
Ez a három szakasz a lényeg:
var manufacturers = _.groupBy(inputdata, function (product) {
return product.Gyarto;
});Azaz magyarra fordítva az underscore groupBy függvényt: "csoportosítsd az inputdata tömb elemeit a Gyarto property értéke alapján". Ezután a manufacturers egy olyan objektum, amiben a kulcsok a gyártók, az értékek pedig az oda tartozó termékek listája.
var manufacturerPrefixLengths = _.map(manufacturers, function (products, manufacturer) {
return {
manufacturer: manufacturer,
prefix: _.min(products.map(function (product) {
return product.Tipus.sameUntil(manufacturer);
}))
};
});Itt van az összehasonlítás meghívva. A map függvény veszi egy lista vagy objektum elemeit, ráhív egy függvényt egyesével mindre, az eredményeket pedig egy új listába fűzi össze. Más szóval transzformálja a listát.
Magyarul: "Minden gyártó-terméklista párt képezz le egy olyan objektumra, ami tartalmazza a gyártó nevét (manufacturer kulccsal), és az egyezések minimumát (prefix kulccsal)." A min függvény visszaadja egy lista minimumát.
A terméklistából prefixhosszlistát meg egy belső map képez, ami minden terméket leképez a gyártó nevével vett egyező szakasz hosszára.
var result = _.object(_.map(manufacturerPrefixLengths, function(x){return [x.manufacturer, x.prefix]}));
Ez az utolsó hívás pedig annyit tesz, hogy az előző lépésben generált listát, amiben a {manufacturer, prefix} objektumok voltak, egy valódi objektumra alakítja át.
-
Karma
félisten
A teljes változatot a ctrlq Online Code Beautifierrel, a vágottat viszont nem ette meg, arra a JSFiddle TidyUp parancsát hívtam meg.
-
Karma
félisten
Mert ezt így el tudod olvasni?
Valahogy így kellett volna kezdeni: [link]Viszont így is még elég nagy falat elsőre megemészteni, inkább pár kötelező kör:
- A böngésződben a Console-t nézted, nem lett ott hibaüzenet amikor a nyelvváltást próbálgattad?
- Nézted, hogy a böngésző jó nyelvet ad-e a navigator.language alatt?
- Cookie-kat töröltél, mielőtt nekiálltál átírni? (Hátha befolyásolja a régebbi változat.) -
Karma
félisten
Legközelebb lőjetek le hamarabb, ha elkezdek baromságokat írogatni
Az előző rant a gyártó meghatározásról irreleváns, mert a "DB"-ben megvan. A feladat egy kis adattranszformálás: csoportosítani a termékeket a gyártó szerint, majd gyártónként megkeresni az egyező szövegek minimumát, és ebből összeállítani egy objektumot, vagy valamit.
Ez az underscore.js segítségével pofonegyszerű.
Össze is dobtam JSFiddle-ön.
Bátorkodtam annyit változtatni, hogy a bemenetet JSON-re átkonvertáltam regexekkel, és kis csalással csempésztem be az inputdata változóba.
A kimeneten látszik, hogy pl. a Rockstar Energy termékekben a közös rész a "Rockstar ". A 28 Blacknél meg semmi a Schwarze Dose miatt.
-
Karma
félisten
De végülis megoldható, ha sorbarendezed az összes nevet, és ahogy végigmész rajtuk ciklusban, figyeled hogy az egyező szakasz szóhatáron ér-e véget (ugyanaz a gyártó), vagy az első szó közben (új gyártó kezdődik).
Kell egy objektum ahova gyűjtöd az eredményt ( gyártó -> termék[] ), meg az utoljára feldolgozott elem, és mehet.
Mondjuk az a para, hogy a Rockstar Energy Blue és Rockstar Energy Red stringekből az jön ki, hogy a gyártó "Rockstar Energy"
Fujj de utálom az ilyet...
-
Karma
félisten
Hát, ez egy remek indikátora annak, hogy az adatforrásod nem fain. Nem utólag kéne kitalálnod, hogy egy fulltext mezőnek melyik része a gyártó, és hol kezdődik a termék...
Legalábbis semmiképp se a JS kódnak, hanem valami köztes résznek amivel a JS kommunikál.
Nade persze azzal kell főzni, ami van. Nekem is volt már ilyen bemenetem (autótípusok, pl. FIAT BRAVA xxxx yyyy... és ebből a FIAT-ot kellett leválogatnom). Végülis ez ugyanaz, de én shortcutot találtam hozzá: az első szót leveszem, a kéttagú neveket meg kontansként eltettem és kivételként kezelem. A hasznaltauto.hu jó forrás volt.
Új hozzászólás Aktív témák
Hirdetés
- Épített vízhűtés (nem kompakt) topic
- Milyen légkondit a lakásba?
- Gyúrósok ide!
- Intel Core i3 / i5 / i7 / i9 10xxx "Comet Lake" és i3 / i5 / i7 / i9 11xxx "Rocket Lake" (LGA1200)
- PlayStation 5
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Milyen TV-t vegyek?
- Honor 200 - kétszázért pont jó lenne
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Építő/felújító topik
- További aktív témák...
- OLCSÓ MONITOROK
- Bomba ár! MacBook AIR 13" 2018 - i5-8210Y I 16GB I 512SSD I OS X Sonoma I Cam I Gari!
- BESZÁMÍTÁS! HP ZBook 15 G6 munkaállomás - i7 9850H 16GB DDR4 RAM 512GB SSD Quadro T2000 4GB WIN10
- Lenovo Thinkpad P1 gen1, gen2, P52s FHD, 4K oled touch
- AKCIÓ! GIGABYTE AORUS MASTER RX 6800 XT 16GB videokártya garanciával hibátlan működéssel
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest