Hirdetés

Keresés

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

  • Karma
    félisten

    En ezt valahogy igy oldanam meg. Kicsit objektumorientaltabb.

    class DataSourceIndexedDB extends EventEmitter {

    get MESSAGES() {
    return {
    CONNECTION_ERROR: 'error',
    DATABASE_OPENED: 'db-opened'
    }
    }

    constructor(databaseName) {
    this._dbName = databaseName;
    this._database = null;
    }

    openDatabase() {
    const request = indexedDB.open(this._dbName, 1);
    request.onerror = this.onConnectionError.bind(this);
    request.onsuccess = this.onConnectionSuccess.bind(this);
    }

    onConnectionError(event) {
    this.emit(this.MESSAGES.CONNECTION_ERROR, {
    code: event.target.errorCode
    });
    }

    onConnectionSuccess(event) {
    this._database = event.target.result;
    this.emit(this.MESSAGES.DATABASE_OPENED);
    }

    getObjectStore(storeName, mode) {
    const tx = this._database.transaction(storeName, mode);
    return tx.objectStore(storeName);
    }
    }

    const database = 'xyz';
    const table = 'xyz';
    const indexedDB = new DataSourceIndexedDB(database);

    // might be automated in constructor
    indexedDB.openDatabase();

    indexedDB.on(indexedDB.MESSAGES.DATABASE_OPENED, () => {
    const store = indexedDB.getObjectStore(table, 'readwrite');
    const request = store.getAll();

    request.onsuccess = (event) => {
    const data = event.target.result;
    // do smtg with data
    };

    request.onerror = (event) => {
    // error handling
    }
    });

    Szerintem ez nem ugyanaz a nyelv, mint amit tboy93 használ (valami ős JS egy legacy, jQuery-alapú projektben).

  • Karma
    félisten

    Sziasztok! IndexedDb a téma, hogyan adhatom vissza a getData() metódussal a táblában található elemeket?

    Az async működést nem igazán vágom :(

    this.getData = function(){
    var open = indexedDB.open(database, 1);
    var data;
    open.onsuccess = function() {
    // Start a new transaction
    var db = open.result;
    var tx = db.transaction(table, "readwrite");
    var store = tx.objectStore(table);

    // Query the data
    var getAllData = store.getAll();

    getAllData.onsuccess = function() {
    data = getAllData.result;
    };

    // Close the db when the transaction is done
    tx.oncomplete = function() {
    db.close();
    };
    };
    return data;
    };

    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

    Mert nincs képzelőerőd. :P

    Próbáld ki és meglátod, milyen szép csillag-os hálózatot rajzol, a csillagok az IP c-mekhez tartozó domain nevek, azok vannak összekötve vonalakkal, és az egészet szimmetrikusan elrendezi a képernyőn. Akkor látványos, amikor már száz felett vannak az IP címek és keresztbe-kasul vannak összekötések, szépen, lassan "kicsomózza" őket és kiteríti a képernyőre, mint egy subaszőnyeget. Ráadásul az egészet lágyan, harmonikusan, finom mozdulatokkal, mintha szellő fújdogálna a réten. :K

    Mindezt egyébként a D3 library csinálja, amire ez az addon is épül.

  • Karma
    félisten

    Ez most egy elméleti vagy gyakorlati kérdés? Mert elméletileg biztos megoldható :D

    Elvileg az Electronnal gyakorlatban is jó eredményeket lehet elérni :D

  • Karma
    félisten

    Viszont ez igen. ;) https://www.html5rocks.com/en/tutorials/file/dndfiles/
    Már csak át kéne vhogy írni, hogy több fájlból olvassa be az adott részeket. Na ez nem megy. :F

    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

    Nem nagyon tudok válaszolni a kérdésedre, de sikerült ugy megoldani, hogy a php beolvassa a text file-t, és annak a változóját ahdja át a javascriptnek.

    Ezzel amúgy megválaszoltad, böngészős JS lett volna. A fő hogy megoldódott.

  • Karma
    félisten

    Sziasztok,

    nincs valakinek egy egyszerű megoldása arra, hogy változóba olvassak egy txt file tartalmát? Eddig amit találtam a neten, nem nagyon működött.

    Böngészőben vagy Node-dal?

  • Karma
    félisten

    Crossbrowsingra mutatnak itt egy példát, amiben ha az iframe forrását bármi más url-re átírom, amely új oldalban van H1 elem (vagy pl. átírom a kódot IMG elemre, mert a képeket szeretném kinyerni), akkor nem működik. Esetleg az az ASP kiterjesztés kavarhat be? :F :F :F

    http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_document_importnode

    Semmi köze ahhoz, hogy ASP renderelte az oldalt. Leegyszerűsítve arról van szó, hogy adatvédelmi okokból egy oldal nem férhet hozzá egy frame (iframe, object, stb.) tartalmához, ha a protokoll és a domain nem egyezik meg – és ez így van rendjén.

  • Karma
    félisten

    Úgy nézem, résben sikerült.

    $('#t2').on("click", function (e) {
    alert("KATT!");
    });

    helyett

    $('body').on('click', '#box1 a', function() {
    alert("KATT!");
    });

    Viszont újratölti az oldalt, gondolom a href miatt. Esetleg valami mással kiválthatom?

    Meg tudod akadályozni a navigációt, ha így módosítod a kódodat:

    $('body').on('click', '#box1 a', function(e) {
    e.preventDefault();
    alert("KATT!");
    });

  • Karma
    félisten

    Sziasztok. Segítséget szeretnék kérni abban, hogy egy eddig PHP-val megoldott termékösszerakót JS-el tudjak megcsinálni.

    Az eredet probléma leírása itt található, ide most nem másolnám be.

    Gyakorlatilag az volna a feladat, hogy oldaltöltés nélkül több elemből tudjak egy "gyűjtőbe" pakolni párat, miközben folyamatosan ellenörzöm, hogy mindegyik típusból van-e már benne. Ha igen, ezeket kattintásra át kéne adnom egy PHP-nak. Illetve természetesen az összegyűjtött termékeket ki is tudjam venni a gyűjteményből. Amolyan webshop-szerű kosárba/kosárból megoldás szerintem ez is.

    Mivel még nem csináltam ilyesmit JS-ben, a szintem nagyon alacsony, ha esetleg volna olyan forráskód, amiből szemezgethetnék és egy alap működő modellt készíthetnék, annak nagyon örülnék. Köszönöm.
    Eddig úgy tűnik megúsztam a feladatokat JS nélkül, de most már nem tudom kikerülni :)

    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

    Szerintem ez így nem tud működni, legalábbis én nagyon nem lennék nyugodt, ha az egyik ablakban lévő JavaScriptek csak úgy átnyúlkálhatnának a többi ablakba, és ott azt csinálnának, amit jólesik nekik.

    Í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

    A generátorokat nagyjából értem vagy érteni vélem, hogy mire jók, de én spec egyik munkám során sem éreztem a hiányukat.

    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

    Mire jó alternatív szintaxist bevezetni függvény létrehozására? Mire jó bevezetni alternatív szintaxist prototípus objektum létrehozására?

    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

    Ööööööööö
    Ez elég durván ágyúval lenne verébre...

    Nincs rá szükségem, mert amúgy most meg van oldva, csak elég paraszt módon, és sokkal jobb is lenne, ha szépen ketyegne a javascriptes interval-om, ami végrehajtaná a php dolgokat.

    A másik lehetőség közvetlen shell script hívása lenne js-ből, ami megint nem egyszerű :S Vagy csak nem találtam.

    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

    Hello,

    Hülye kérdés. JS-ből tudok egyszerű módon php scriptet futtatni?
    Van egy időzítésem, amibe jó lenne beágyazni egy php kódot, így egyszerűbb lenne a dolgom. Natúr Javascript, elég is ennyi amúgy, Jquery kb. felesleges lenne.

    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

    Sziasztok!

    Tudna valaki segíteni, hogy a Maps API-nál mit kell beállítani, hogy a tervezett útvonalat lehessen módosítgatni (ahogy manuális módban lehet, az egérrel megfogva az útvonal egy pontját és áthúzva egy másik útra).
    Példám.

    Előre is köszi a segítséget!

    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

    Köszi,

    Hát ezt egy kicsit későn láttam meg, közben előálltam egy béta verzióval saját kútfőből, de le fogom cserélni az általad linkelt elegánsabb megoldásra.

    Azért, mert tudom, hogy így illik, a megoldás:

    const { AuthError, LoginError } = require('blabla');
    const THRESHOLD_OF_TRIES = 3; // 3 tries until drop
    const DEFAULT_TIMEOUT = 300000; // 5mins in milliseconds
    const cache = {};

    module.exports = function * rateLimiter(next) {

    const user = this.request.body.email;

    if (cache[user] != null && cache[user].tries >= THRESHOLD_OF_TRIES && Date.now() < cache[user].dropUntil) {
    this.throw(423); // Locked for 5 mins
    }
    else if (cache[user] != null && cache[user].tries >= THRESHOLD_OF_TRIES && Date.now() > cache[user].dropUntil) {
    delete cache[user];
    }

    try {
    yield next;
    }
    catch (err) {
    if (err instanceof AuthError || err instanceof LoginError) {
    if (!cache[user]) {
    cache[user] = {
    tries: 1,
    dropUntil: null
    };
    }
    else {
    cache[user].tries++;
    if (cache[user].tries >= THRESHOLD_OF_TRIES) {
    cache[user].dropUntil = Date.now() + DEFAULT_TIMEOUT;
    }
    }
    this.throw(err);
    }
    console.error(err);
    }

    };

    Egyáltalán nem biztos, hogy az általam linkelt jobb vagy hatékonyabb :) Csak hogy kész.

    Amúgy ilyet még nem is láttam, generátor alapú middleware?
    Milyen frameworköt használsz?

  • Karma
    félisten

    Inkább utóbbi, de kliens oldalon semmit sem elég lekezelni. Közben rájöttem, hogy tényleg kevertem kicsit a szezont a fazonnal, vagy legalábbis két külön dologról van szó.

    1: throttling, hány request mehet egyidejűleg - böngészőnek van beépített defaultja -> nem érdekel most engem
    2: ddos - ne lehessen floodolni a szervert -> ehhez tűzfal vagy proxyszerver kell, van rá out-of-the-box megoldás -> nem érdekel most
    3: "rate limiter" - a user megpróbál belépni, nem megy, megpróbál mégegyszer, nem megy, harmadik próba előtt már várnia kelljen 5 másodpercet -> ez kell nekem

    Valószínűleg nincs erre kész megoldás, meg csinálni magamnak, de nem tűnik vészesnek, így, hogy már rendbe tettem a fejemben a dolgokat :D És ha hiszitek ha nem, az, hogy leírtam már sokat segített, hogy tisztuljon a kép :P

    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

    Ki mennyire vágja a gulp-ot? Én használgatom, de most lenne egy bonyolultabb felállás. Adott egy ilyen mappa struktúra:

    css
    | site - ebben vannak az oldal alap scss-ei, ezekből rendben generálok is egy compile-olt css-t
    site.css
    | themes - ebben a mappában vannak az alap megjelenésen felüli domainenként használt scss-ek
    | theme1
    theme1.scss
    site.css - ez a site mappában lévő site.scss + az itt lévő theme1.scss-ből állna elő
    | theme2
    theme2.scss
    site.css - ez a site mappában lévő site.scss + az itt lévő theme2.scss-ből állna elő

    A lényeg, hogy ugyanaz a site több domainnel is elérhető lenne, és minden domain a saját témájával jelenne meg. Mindegyik oldal egy darab site.css-t használna, ebbe a site.css-be lenne beleforgatva a site mappában található lényeg, plusz az adott téma mappában lévő theme.css.

    Ezt hogy lehetne gulppal szépen kivitelezni? Fapados módszert persze tudom, annyi taskot csináljak ahány témám van, és taskonként adjam meg, hogy mit honnan hova szedjen össze. Valami szebb, általánosabb megoldást keresnék, hogy ha felveszek X új témát, ne kelljen X gulp taskot is készíteni hozzájuk.

  • Karma
    félisten

    "ha van egy jól bekonfigurált szervered (az XAMPP ilyet ad)"
    Az IIS is ilyet ad. :) A Microsoft Web Platform Installer segítségével ráadásul pár next-next klatty után ez is pont ugyanolyan felhasználóbarát módon telepíthető, mint a többi kapcsolódó termék. (Pl. rákattint az ember, hogy telepíteni akarja a Drupalt/WordPresst (amit aztán leszedhet), és ez behúzza a függőségeket.) Igazából nem is vágom, miért nem marketingeli ezt kicsit jobban a májkroszoft.
    Amire figyelni kell, hogy .htaccess helyett Web.config fájl kell, megfelelő alternatív tagekkel...
    (Ezeket Te nyilván tudod, nem is neked szól, inkább a kollégának, meg általánosságban.)

    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

    És azt hogy lehet lefordítani?

    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

    Köszi :(

    És annak mi lehet az oka, hogy miért nem "változtatja" meg a függvény az object-ben a pdf fájl nevét?
    Már attributumot meg tudok változtatni, a data-t nem.

    <!DOCTYPE html>
    <html lang="hu">
    <head>
    <title></title>
    <meta charset="utf-8">
    <script language="JavaScript" type="text/javascript">
    function valt_szmsz(){
    document.getElementById("fajl_ki").setAttribute('data', szmsz.pdf');
    }
    </script>
    </head>
    <body>
    <input type="button" value="SzMSz" onClick="valt_szmsz()">
    <object width="500" height="800" id="fajl_ki" type="application/pdf" data="hazirend.pdf"></object>
    </br>
    </body>
    </html>

    Az okát nem tudom, gondolom valami implementációs következmény. Stack Overflow-n meg azt írjàk, hogy próbáld meg láthatatlanná tenni az objectet, mielőtt átírod az attribútumot, és jelenítsd meg újra.

  • Karma
    félisten

    hali,
    html topicba már írtam, de nem nagyon pörög az a topik, hátha itt tud valaki segíteni.
    Egy html oldalra létrehozott google térképet hogyan lehet nem északhelyesen beilleszteni? Azaz elforgatva jelenjen meg.

    Nem lehet.

  • Karma
    félisten

    Van egy képgeneráló programom, ami rendelkezik anomáliákkal. Itt megtalálható.

    1. Miért van az, hogy a bal oldalon és fent fekete foltok jelennek meg teljesen random?

    2. az mousemove eseményre az egér koordinátáin lévő pontokra új színt generál. Viszont ennek így köze nincs az egér koordinátáihoz, mert inkább olyan mintha a koordinátákat megszorozná 2-vel és fent a bal saroktól indulva teljesen máshoz generálná újra a színeket.

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

    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

    Szép találat, türelmes voltál. :D Végül is ez esetben meg lehetne tenni, hogy a fájtl letölti, átírja ennek megfelelően, és az adott kérésre ezt az új tartalmat szolgálja ki saját extensionnel, DE ennek igen komoly hátránya, hogy "bedrótozza" a korábbi kódot, és a fájl frissülése nála nem lesz érvényes.
    Azt nézem, hogy van egy ilyen rész a kódban:

    setTimeout(function() {
    $('iframe').each(function() {
    var src = $(this).attr('src');
    if(src.match(/youtube\.com/i) || src.match(/video\.mno\.hu/i)) {
    reloadBlocker = true;
    }
    });

    if(!reloadBlocker) {
    document.location.assign(document.location.href);
    }
    }, reloadTime);

    (fúj)
    Ezek szerint ha saját extensionből csak beágyaz egy elrejtett YouTube-os iframe-et (lényeg, hogy az src attribútum a youtube-ra mutasson, nyilván az egész oldalt nem érdemes beágyazni :D), akkor a reloadBlocker változó értéke true lesz, és a document.location.assign(document.location.href); sor nem fog lefutni. :D Borzasztó ronda megoldás mindenképp, de legalább nem fog 20 perc múlva (most ez van a reloadTime-ban) újrafrissülni az oldal...

    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 :D

  • Karma
    félisten

    Amúgy az F12-es debugger cuccok közt nincs olyan, ami mutatja hogy egy számlálóból mennyi van vissza? (egyébként Firefoxot használok)

    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

    Beteszel egy breakpointot a valtozora amiben mar a rossz ertek szerepel, majd a stack trace-ben elkezdesz visszafele kattintgatni.

    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

    Manapság már nem sok olyan eset lehet, amikor az adott usernek nincs JS a böngészőjében. Szóval ha mondjuk az egyszerű felhasználóknak készül az oldal, akkor miért ne lenne bekapcsolva a JS?

    Kíváncsiságból kérdem, hogy a böngészők közötti eltérés még mindig valid probléma így 2015-ben? Manapság már mindenhez van lib, framework, ezek gondolom cross-browser megoldásokkal vannak ellátva.

    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

    Sziasztok!

    A következőben szeretnék tőletek egy kis iránymutatást kérni.
    Egy olyan "weboldalra" lenne szükség, amit 99%-ban mobilról vagy tabletről használnának. Nálunk jelenleg, válogatás nélkül, mindent drupallal oldanak meg, amit Zurb Foundation-el alakítok mobil készre. Általában ennyi elég is, de jelen esetben úgy érzem, hogy nem a legjobb megoldás.
    Véleményem szerint remek választás lenne a Foundation for Apps keretrendszer használata és a drupal csak a backend részét töltené be, ami JSON adatokat küld, tehát utóbbi tényleg csak tartalomkezelésre lenne használva, míg előbbinek csak meg kell jelenítenie azt.

    A gondom az, hogy eddig nem dolgoztam még ilyen formában sem javascriptel, sem JSON adattal. Nem tudom, hogy hogyan lehetne a kettőt összehozni.

    Egyrészt nektek erről mi a véleményetek, másrészről pedig találkoztatok-e ilyen vagy ilyesmi párosítással? Én sajnos elbuktam a google teszten és nem is tudom, hogy merre induljak, hogy ez működjön, így ha jó az ötlet, akkor szükségem lenne egy pár kulcsszóra, vagy jó tutorialra, amin el tudnék indulni. :R

    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

    Ha már szóba került az Angular, gondolom figyelemmel követted a 2.0 által hozott új fícsöröket. Esetleg van már véleményed az új verzióról? Illetve kíváncsiságképp kérdem, Emberben fejlesztettél már?

    Sajnos mindkét felére nem a válaszom. Az Angular 2.0-ba még nem kezdtem belefolyni (majd ha kikristályosodik talán, de az 1.4 jól kézhez áll), az Ember pedig sose érdekelt. Ha valami új, akkor az izomorf történetekből néznék meg egyet, a Reactot vagy a Meteort.

  • Karma
    félisten

    Mindig is érdekelt, és elnézést ha tolakvó vagyok, hogy te mit dolgozol, hogy ilyen tapasztalatod van, mert az összes programozás topikban jelen vagy, és a legnagyobb szakértelemmel válaszolod meg a kérdéseket.

    Köszi, próbálkozom :B

    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 :DDD

  • Karma
    félisten

    Hat, hogy oszinte legyek sokkal jobb ;)

    Meg van 1-2 aprosag amit mashogy csinalnek. Peldaul arra nem lehet alapozni, hogy a hordozo kornyezet majd rendelkezik JSON parserrel ezert ha van lehetoseg jQuery-t hasznalni akkor javaslom.

    Es akkor:

    function getData(fileName) {

    var rawData = readFile(),
    parsedData;

    try {
    parsedData = $.parseJSON(rawData);
    }
    catch (ex) {
    console.error(PARSE_DATA_ERR, ex);
    }

    return parsedData || {};

    }

    Ha nincs lehetoseg jQuery-t hasznalni akkor pedig biztos ami tuti ellenorizzetek le, hogy van-e JSON object mint ahogy a jQ is csinalja:

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
    return window.JSON.parse( data );
    }

    Teljesen felesleges az ellenőrzés szerintem, mert a Taskeren belül (na meg Androidon, hiszen ott nincs IE6) biztosan elérhető lesz a JSON globál, minden másra meg ott vannak a polyfillek.

  • Karma
    félisten

    Sziasztok!

    A következőn töröm a fejem:

    Van egy függvényem, aminek a return értéke legyen mondjuk a username változó. Ezt a user nevet én a fv. elején már létrehozom, érték nélkül. Rögtön a létrehozás után egy ajax kéréssel értéket is adok ennek a változónak. A problémám az lenne, hogy a return előbb adja vissza az undefined értéket, mint ahogy az ajax be tudná állítani azt.

    Maga az AJAX jQuery útján történik, így egy lehetséges megoldás az async: false beállítása. Csak ekkor a main-thread foglalt lesz, ezért már a böngésző is sír a konzolban. Esetleg tudtok valami megoldást erre?

    Példakód.

    "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

    A kódból egy kukkot nem értek! De hiába a link. Mindegyik szintező alulról indul. Nekem olyan kell ami középről a 0.-ról indul. Nagyon bonyolult ez nekem. :(

    Tessék. Privátban segíthetek beollózni a célhelyre, mert azért azt se eszik olyan forrón :U, bár gondolom már nincsenek illúzióid erről. De a topikot nem akarom terhelni ezzel.

  • Karma
    félisten

    A d3 csak arra kell, hogy data binding legyen az SVG-vel, és így tudjon realtime frissíteni pl websocket-en ékező szenzor adatok alapján. Ha ez nem szempont, és mondjuk egy szerver oldali script állítja elő az SVG-t, akkor valóban nincs rá szükség (de kétlem, hogy nodejs-ről lenne szó). Persze lehet manuálisan is data binding-ot csinálni, ha neked ahhoz van kedved, nem fog vissza senki.

    +1, maga a business logic egy szimpla egyenes arányosság, nem kihívás, ahogy a többi része sem.

    @Carasc0

    Szó sincs több napról, néhány óra az egész. Amit linkeltem, abban meg csak ugyanúgy át kell állítani, mint Karmájéban, hogy mettől meddig veszed a skálát.

    É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

    Értem! Hogy ha még a haladóknak is több napos meló, akkor értelemszerűen megértem hogy senki nem vállalja. Senki idejét nem szeretném rabolni vele. Akkor marad az alternatív megoldás keresése. Maximum nem lesz olyan amit elképzeltem s nem lesz olyan szép, de a célnak megfelel.

    Köszönöm azért a választ. ;)

    @Karma: hűha... :R Éreztem hogy a rajzom nem volt teljesen egyértelmű a fene vigye el. Elnézést előre is érte. Valóban középről indul a dolog, de ugye az ábra azt jelzi hogy félig van. Konyhanyelven mondva a zöld csík középről induljon ki. Tehát a mérő az teljesen szürke alaphelyzetben és ha beírok egy értéket akkor annak megfelelően mozdul el. Gyakorlatilag majdnem jó. :R Mega hála. :D

    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

    Ez az a tipikus meló, ami végeredményét tekintve, ahogy karma is mondta nem vészes megvalósítani, de ahhoz meg pont eléggé összetett, hogy az ember rászánjon több napot.

    Én azért bízok benne, hogy hátha egy-két időmilliomos egyetemista rámozdul és összerakja neked.

    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

    Nézz körül d3.js és svg témakörben. Vannak hasonlók: [link]. Egyébként a progress bar az teljesen más, mint amit te akarsz. Nulláról max 1 hét alatt összehozod, ha nagyon lassan tanulsz. Ingyen általában csak akkor dolgozunk, ha saját magunknak csinálunk valamit (én legalábbis így vagyok vele).

    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

    Egyébként most nem USB perifériáról van szó, hanem integrált bluetooth-ról. A régi verziós bt megy is, csak a 4.0 nem, legalábbis nem ismeri fel az eszközt. Windows-ban már sikerült párosítani, de az is csak sokadikra ment, úgyhogy nem tudom, hogy a kapcsolódással van e a gond, vagy a bt smart nem működik. Valószínűbb, hogy inkább az utóbbi, és vagy a vmware vagy az android-x86 nem támogatja a bt smart-ot. Próbáltam release logokban utánakeresni, de google semmit nem dobott róla, a vmware fórum regisztrációnál meg csak a személyi számomat nem kérdezik meg...

    Az integrált BT-d is 99%, hogy belül USB porton csatlakozik az alaplapodhoz. :U

  • Karma
    félisten

    Közben felszórtam a laptopomra vmware-t player-t. Úgy gondoltam, hogy a rövidebb utat választom, és felteszek rá egy androidot, ahhoz vannak programok, és úgy nem kell GATT-al bohóckodni. Feltettem egy android-x86-4.4-rc2-t elsőnek, hát befagyott az induló képernyőnél, azt mondják ez ismert hiba 4.2 óta. Feltettem így egy 4.0-t, azon viszont nincs net, és a bluetooth-nál sem látom a bt smart eszközömet, csak a régi bt-os mobilomat. Biztos, hogy lehetséges vmware-el bluetooth smart-ot megosztani az emulált rendszerrel?

    A lehető legrosszabb megközelítést választottad szerintem. Az Android szinte teljesen biztos, hogy nem fogja a random USB-s BT eszközödet támogatni.

  • Karma
    félisten

    Nekem SSD van alatta, NodeJS-el próbáltam és pár letöltött modul volt még amit egyszerre kellett berántania indításkor, de ezen kívül más nem ment alatta. Nem tudom miért, de nagyon zabálta a memóriát. Így maradt a Sublime vagy NetBeans. Valaki használta már a GitHub Atom-ját? Még azt próbálgatom most, de tudásilag szinte a Sublime buta szintjén van. Nem tudom, hogy bővítsek-e memóriát, ugyanis itt van az SSD.

    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

    WinJs-el és Bluetooth-al van valakinek tapasztalata? Szeretném lekérni az adatokat pulzusmérőről, de nem igazán tudom, hogy milyen irányba induljak. Van egy csomó hardver id, amikből néhány szabvány, mások gondolom nem, de hogy ebből én hogy kapok majd adatokat, arról lövésem sincs. Tudom rtfm, de nem lehetne egy kicsit meggyorsítani a folyamatot? :DDD

    Maga az eszköz egyébként Mio Link, gondolom nem open az api-ja, de windows-hoz sajna nem szórtak össze semmit a srácok, bt4-es androidos eszközöm meg még nincsen, úgyhogy gondoltam teszek egy próbát, hátha ki tudok csikarni belőle valamit. Mérni mér, villognak a színes ledek rajta, elvileg ha jól be tudnám állítani, akkor az én edzettségi szintemnek megfelelően tolná a szivárványos színeit a pulzus zónákról, nem valami átlaghoz viszonyítva. Meg jó lenne látni a konkrét számokat is legalább egy crossfit edzésen, ha már futáshoz nem tudom a hátamra szíjazni. :D

    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

    Ezzel csak az a baj, hogy a szükséges split-eknél probléma lehet.

    Vagy csak én nem értem...

    Nincs benne semmilyen probléma. A settings objektumba már a feldolgozott értékeket kell raknod.

  • Karma
    félisten

    köszönöm, meló után ki is próbálom.
    esetleg még az első kérdésemre rá tudnál nézni?

    Az első kérdéseddel csak az a baj, hogy nincs benne kérdés. Ha leírod, mit szeretnél kapni a végén, akkor talán tudunk segíteni kibogozni. Egyébként nincs benne nagy kanyar, az csak egy tömb.

  • Karma
    félisten

    az nagyon jó lenne, napok óta ezzel küzdök ha van egy kis időm, már kezd bosszantó lenni kicsit
    az nem tudom most megnézni h mik a lehetséges értékek, a gépemen van elmentve, de este megnézem h nem ez-e a baj

    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

    idézőjelekkel sem működik, ugyh lehet h nem string.
    string-é konvertálni így tudom? String(Winddirection);
    mert ezt próbáltam és így sem megy

    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

    Köszi, de inkább split-eltem. Mert nem tiszta a leírás..

    A legegyszerűbb eset ennyi (valami az a változó, amiben cserélgetni akarsz):

    valami = valami.replace('mit', 'mire');

  • Karma
    félisten

    Sziasztok.

    Azt szeretném megkérdezni hogy ez a js részlet helyes-e?

    Elorejelzes1td = Weather.forecast.txt_forecast.forecastday[0].fcttext_metric;
    Elorejelzes1td2 = Elorejelzes1td; if (Elorejelzes1td2 != /"+'legmagasabb'+"/) {
    setGlobal('%Elorejelzes1td'," ");
    }
    else { setGlobal('%Elorejelzes1td',Elorejelzes1td2);

    Az lenne a cél, hogy ha tartalmazza a legmagasabb szót az Elorejelzes1td, akkor kiírja a tartalmát. De ha nem, akkor rakjon be egy szóközt.

    Bocsi ha nem jó helyre írok, de js. Akkor is ha tasker.

    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

    Azért ide írtam, mert olyasmit olvastam, hogy a javascript nincs bekapcsolva és azért nem megy, de lehet, h félreértettem vmit. Nem vagyok szakember, csak átlag user.
    Lényeg, hogy mikor feltelepítem a java-t és újraindítom a böngészőt és a honlapot fel kellene dobnia egy ablakot amin a java futattását kell engedélyezni. Na idáig el sem jut, nem dob fel semmit.

    Semmi köze a JavaScripthez, de amúgy a Java prog topikban se lenne jobb helyen. Az egyik újabb Chrome letiltotta az NPAPI plugineket (azaz a Javat főleg), és ezt a Chromem mélyében kell engedélyezni újra.

    Olvasd el ezt.

  • Karma
    félisten

    Ránéztem, és valamiért egyből a python jutott az eszembe. Ha azt mondod nem rossz, akkor lehet kap egy esélyt. :)) ExpressJS-t használsz te is?

    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

    Sziasztok,

    ExpressJS-nél látom, hogy az alap template engine a Jade. Dolgozott már ezzel valaki közületek? :) Használható, vagy megérdemli a cserét? :DDD

    Én szoktam, személy szerint szeretem, mert nagyon tömör és mégis jól olvasható.

  • Karma
    félisten

    :R megint! Nem győzök hajlongani! (Már kitörik a hátam :D)

    Bocs, de mint írtam totál noob vagyok ilyen témában. Nem ismerem a parancsokat. :B Az én tudományom csak abból áll, h az általatok írt példákban lévő adatokat replacelem... :DDD

    Ps: kerekíteni tudok úgy is, hogy .5-nél felfele kerekítsen ha jól értem?

    A toFixed(0) automatikusan így csinálja.

  • Karma
    félisten

    Üdv!

    Na, megint elakadtam/unk. :(

    ezek a sorok furcsák:

    var Jelenlegifok = Weather.current_observation.temp_c;
    var Jelenlegihofok = Jelenlegifok.split('.');

    Az az érdekes, hogy a fenti kódban az 1 sor lefut, mert ha berakom globalba, látom a változó értékét, de a 2. sor már nem fut le. :( És az utána lévő többi dolog sem fut le vmiért. (Mintha a var Jelenlegifok = Weather.current_observation.temp_c; után nem is lenne semmi.

    A fentebb linkelt jsonban van az adat. (asszem ott pont nincs tizedesjegy, de amúgy így néz ki pl: 15.6 a temp_c) Általában mindig van tizedesjegy amúgy, legalábbis a teszt fájlomban van.

    Ja és itt a mostani teljes kód.

    Bármilyen ötletet/tippet szívesen fogadok! :R

    P.s.:Biztos van hiba a kódban, mert 1 tök amatőr vagyok 2 mobilról írtuk, ezért lehet benne elgépelés. :B

    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

    Megoldottam! :C

    Mostmár csak az érdekel, h a speciális karakterek elé mit kell rakni, h szövegrészként és ne másként kezelje.

    Ugyanúgy \-rel kell escape-elni.

    Viszont splittel darabolás helyett szerintem megpróbálhatnád a környezettel feldolgoztatni a JSON-t, és a kapott objektumban navigálni.

    var Weather = JSON.parse(readFile(...));
    setGlobal('%Napfelkel1', Weather.sun_phase.sunrise.hour);

  • Karma
    félisten

    Ez a "use strict"; ugye? Utána nézek, mert megadtam közvetlen a kivételkezelésben is, meg az objektum felett is, de semmi változás.

    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

    Ez az Ionic nagyon jól néz ki, mindenképp átírom erre a projektet. Pozitív, hogy van vízszintes grid is benne.

    Lehet kipróbálom majd a Crosswalk-ot is, de egyelőre csak android-ra akarom kipróbálni.

    A linkelt projekten már húztam kicsit sebességben, optimalizálgattam, illetve a FastClick is sokat segített, hogy használhatóbb legyen.

    Köszi a linkeket. :R

    A Crosswalk pont, hogy csak Androidra elérhető ;) (Na jó, elvileg Tizenre is.)

  • Karma
    félisten

    Igazából a toch eseményeknél érzek kisebb lassulást, de cpu igényt nem igazán értem. De holnap akkor megpróbálom remote debug-al. Mit érdemes figyelni? :U
    Amúgy ez a fapad verziója, nem teljes még, illetve kisebb felbontáson a player rész el van csúszva. Ami fura, hogy a telefonomra (540*960) kezdtem el csinálni, de telefonon teljesen más a méret (mintha kisebb lenne).

    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

    Kliens oldali db-re tudnátok ajánlani valamit? Látom van egy pár, de nem ismerem őket.

    Helyzetfüggő (nekem mondjuk arra kellett, hogy egy távoli DB-t szinkronizáljak), de a PouchDB nekem bevált.

  • Karma
    félisten

    Sziasztok,
    Node-on futó API-t szeretnék létrehozni. Ezzel nem is lenne probléma, ott akadok el, hogy authentikáció után nem tudom megtartani az usert. Van valami PHP Session szerű megoldás? Nem szeretnék cookieban jelszót tárolni, még enkriptálva sem.

    Olvastam szép megoldásokat, hogy a jelszó soha (authentikáció után) ne legyen elküldve, helyette egy publikus kulcs, értékként pedig valamilyen azonosító. Kliens oldalon az adatok halmazából (beleértve a jelszavat) checksumot készíteni, majd mindent (jelszó kivételével) elküldeni (post/get/etc). Szerver oldalon a fogadott adatokból és a tényleges jelszóból egy új checksum, ha a kettő egyezik, akkor mehet a response.
    Ez szép, okos és praktikus, de még mindig nem tudom hogy tároljam kliens oldalon a jelszót úgy, hogy azt egy általános iskolás srác ne tudja kiszedni.

    Bármi útbaigazítást köszönök előre is (akár kulcsszó, cikk, prezi)

    Szerintem a JWT megér egy kis utánaolvasást.

  • Karma
    félisten

    Nem biztos, már linkeltek példát ennek ellenkezőjéről. :)

    Aki nem tudja, mi a különbség a Java és a JavaScript között, annak az ECMAScript garantáltan nem mond semmit.

  • Karma
    félisten

    Szerintem a topik címét kellene módosítani JavaScript/ECMAScript topikra, az ES megnevezés jelenléte eléggé jó szűrő lenne.

    A kép valóban félrement, kivettem oldalról. Viszont szerintem felesleges az ECMAScript/ES név a topik címébe, a JS elég egyértelmű és közkeletűbb.

  • Karma
    félisten

    Sziasztok!

    Adott egy honlap (jquerry alapon), ami attól függően, hogy direkt hivatkozással nyitom-e meg, vagy például Google-ön keresztül, más "felbontást" ad.

    Mellékelek 2 képet, hogy jobban értsétek :) Mi lehet a hiba? :S

    Kép1 - jó - direkt módon beírva

    Kép2 - google kattintás

    Nagy felbontásnál is zavaró tud lenni az orbitálisan nagy betűméret, kisebb monitorokon rettenetes.

    Hol lehet a hiba? :S

    Előre is köszi!

    Csak a biztonság kedvéért, nem lehet, hogy a böngésződ mentette le, hogy az egyik címet nagyítva jelenítse meg? Egy Ctrl + 0 lenyomást megér a próba.

  • Karma
    félisten

    Eléggé összevissza van már, megpróbálom kilogikázni, hogy hogyan lenne a legjobb.

    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.

    Itt írtam rá egy példát.

  • Karma
    félisten

    Lenne egy kérdésem, mit rontok el? Kő, papír, ollós játék. De valamiért indokolatlanul ilyeneket kapok:

    Computer choice: paper
    Your choice: paper
    scissors wins

    Hát ezt hogy sikerült összehoznia? Remélem minden fent van a kód érthetősége érdekében.

    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

    Általában ami chrome alatt fut az fut FF alatt is.

    Egyre inkább nem.

    De se nekem, se munkatársamnak nincs ie-je (mac, linux).

    Virtuális gépek?

    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

    Sziasztok!

    Ablakhoz igazítási problémám lenne.

    Van egy dobozom beviteli mezőkkel.

    Ez a doboz egy .js kóddal van az ablak aljához igazítva, és x pixellel eltolva az ablak jobb oldalától.

    Ha egy számítógépen nyitom meg, akkor teljesen jó, viszont a probléma a különböző mobileszközökön jön elő.

    Amikor a mobileszközön bele "koppintok" a beviteli mezőbe, akkor ugye mobileszköztől függetlenül egy billentyűzet jelenik meg, amivel lehet írni a beviteli mezőbe.

    A probléma: ahogy ez a billentyű megjelenik a képen, akkor ezt a fentebb említett dobozt a billentyű eltolja, de nem szorosan a a billentyű tetején jelenik meg (ahogy szeretném).

    Pl.: Iphone-on kicsivel felette, ami még elmegy, de mondjuk egy galaxy tab 3 tableten nem megy a billentyű fölé, hanem fedésben van a beviteli mező a billentyűvel, ami problémás, mert nem látni, hogy mit írunk bele.

    Lehet valamivel úgy rögzíteni ezt, hogy szorosan a billentyű tetejére rögzüljön? :U

    Van valami különleges oka, hogy JavaScriptet használsz a position: fixed; bottom: 0; right: valamennyi; CSS kódrészlet helyett az oldal aljára igazításra? Az szerintem a problémádat is megoldaná.

  • Karma
    félisten

    hali teljesen kezdo vagyok.

    hiaba majmolom a tutorialokat,nem jovok ra hogy mi a baj.

    azt sem tudom hogy hova irjam a javascript kodot, ( probaltam html-be Ágyazni ) de nem mukodott.

    beirtam a bongeszobe hogy

    localhost/gyakorlas/index.html es nem tortenik semmi,csak azt irja ki amit en a kodba irtam bele.

    de nem vegzi el a muveletet.

    szoval az a problema hogy fogalmam sincs hogy mit hova irjak,vagy hogy jo e az hogy html be Ágyazom a javascript kodot.

    sajnos az ismerosom aki ehez ert is valamennyire, legalabb annyira idiota modon es erthetetlenul magyarazza amit kerdezek,es nem is a kerdesemre valaszol . szoval teljesen ossze vagyok zavarodva.

    please help me
    :R

    notepad ++ progit hasznalok

    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

    Nanananana... javíts ki ha tévedek de itt a kocka divekből áll... én viszont 3d-s modell alatt konkrétabban egy 3d-s modellt értek :P Tehát leülök mondjuk a blender elé és alkotok valamit... :)

    Megjegyzem nagyon jó vagyok már a színes téglalapok modellezésében :P

    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

    stackoverflow, más semmi

    +végtelen, és kiegészíteném annyival, hogy a StackExchange-en az összes többi portálon is lehet találni érdekes morzsákat kb. bármiről, úgyhogy megéri követni legalább a "Hot Network Questions" szekciót jobb szélen :)

  • Karma
    félisten

    Élő példa, hogy mire jó még:

    Találós kérdés, mit ír ki ez a program, anélkül, hogy kipróbálnád?!

    <div id="container">Katt ide</div>
    ########################################
    var cont = document.querySelector('#container');

    function test() {
    for (var i = 1; i < 6; ++i) {
    cont.addEventListener('click', function () {
    console.log(i);
    });
    }

    i = 10;
    }
    test();

    Becsapós kérdés, mert amíg nem kattintasz rá a divre, semmit ;]

  • Karma
    félisten

    Üdv. Van egy scriptem, amivel Chrome és Tampermoney kiegészítővel tudok mindenféle extrát tenni különböző oldalakra.
    Van pl ez a script.
    A gondom az, hogy egy másik oldalra szeretném átülteni. Kb már mindennel megvagyok, csak az a baj, hogy az egyik oszlopban szöveg is van, így azt nekem nem tudja kiemelni, mivel hiába írom be hogy 100-tól felfele mutassa, nem tudja értelmezni azt hogy " 123 letöltő"

    Gondolom az elejére a scriptnek kellene írni hogy vágja le az oszlop végén lévő ..."letöltő" részt, hogy csak az első, számkaraktereket vegye figyelembe, de én annyira nem értek hozzá :)

    Nem tudom jó helyre írtam-e ezt, ha nem akkor bocsi.

    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

    Üdv. Van egy scriptem, amivel Chrome és Tampermoney kiegészítővel tudok mindenféle extrát tenni különböző oldalakra.
    Van pl ez a script.
    A gondom az, hogy egy másik oldalra szeretném átülteni. Kb már mindennel megvagyok, csak az a baj, hogy az egyik oszlopban szöveg is van, így azt nekem nem tudja kiemelni, mivel hiába írom be hogy 100-tól felfele mutassa, nem tudja értelmezni azt hogy " 123 letöltő"

    Gondolom az elejére a scriptnek kellene írni hogy vágja le az oszlop végén lévő ..."letöltő" részt, hogy csak az első, számkaraktereket vegye figyelembe, de én annyira nem értek hozzá :)

    Nem tudom jó helyre írtam-e ezt, ha nem akkor bocsi.

    A linked nem igazán sikerült, amit betettél csak a te böngésződben működik. Szerintem másold ki a szkriptet pastebinre, és azt linkeld be ide.

    Így látatlanban nem sokat lehet vele kezdeni.

  • Karma
    félisten

    Udv!

    Most ezen az oldalon dolgozom es lenne egy olyan problemam hogy valamiert a google map api nem jelenik meg ie-be es ff-be.Esetleg valaki tud erre mondani nekem valami megoldast?

    Elore is koszonom a valaszt!

    ui:. Köszi Sk8erPeter a sliderért

    Nekem Chrome-ban se jelenik meg semmilyen térkép, hol kéne egyáltalán lennie?

  • Karma
    félisten

    Lehet marad az , hogy a js-be írok több sor az azonosítókkal úgyis csak számok.

    De miért van az, hogy kiválasztok 1-et, betölt aminek kell, kiválasztok mondjuk ugyan abból akkor már 2 szer tölt be és ahogy nyomkodom egyre többször fut le a js-ben az adott kódrészlet.

    Kód híján annyit tudok mondani, hogy valószínűleg betöltéskor .click vagy .change (v. hasonló) hívással folyamatosan újabb és újabb eseménykezelőket aggatsz szerencsétlen HTML elementekre.

    Ha központilag használnád az .on-t, nem lenne ilyen baj.

  • Karma
    félisten

    Fősulin van egy beadandó feladatom, és első körben egy weboldalt akartam írni erre a célra. Viszont találkoztam a Brackets kódszerkesztővel és kiderült, hogy ez is a webes nyelveket használva lett létrehozva. Szóval mint érdekesség lehet csinálnék valamit beadandónak, csak nem tudom például melyik SDK-t lenne érdemes használni. Olvasgatok épp most is a dolgok után, de egy kis iránymutatás jól jönne. :)

    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

    Nem véletlenül írtam privátot, hogy kifejtem bővebben :P

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

    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

    Erre a láncfűzésre tudsz írni egy egyszerű példát?
    Amit linkeltél abban annyi minden van, hogy nem tudom belőle kihámozni :B

    Nem véletlenül írtam privátot, hogy kifejtem bővebben :P

    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

    Anélkül is meg lehet csinálni, hogy a requesten belülre helyeznénk?
    Ha igen, azt hogy csinálnád?

    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

    sziasztok,

    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();
    console.log(a.text());
    szoveg.push(a);
    });
    }
    });

    console.log(szoveg);

    adott a fenti minta kód, a weboldalról scrapelt címeket tenné egy tömbbe.

    Valaki tudna nekem abban segíteni hogy hogyan kéne átírnom, hogy a tömb kiírása előtt megvárja a request befejeződését?

    visszaolvastam, tudom, már sokszor felmerült a kérdés, de nem sikerült sehogy sem megoldanom a problémát

    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

    programkód, de tuti valamelyik [i]-től kergült meg..

    Egyébként az eredeti kérdésre visszatérve pár szóra: nem értem az ellenhurrogást, hiszen a this bepasszolása az eseménykezelőnek igencsak alapvető dolog a legtöbb JS könyvtárban. Adta magát, hogy VanillaJS-sel is meg lehet oldani :)

  • Karma
    félisten

    Story mode on :D

    Adott a feladat, vannak egy generált oldalon gombok, a fajta gombból is >= 0 darab, b fajta gombból is >=0 de általában több darab. Ezen kívül még van pár elem amire listenert kell kötni mert azok is csinálnak valamit. Maga az action nagyon egyszerű, a és b gombok esetén is csak el kell navigálni egy adott url-re, de az url-ben változnak a query paraméterek. Ugye ebben semmi nehéz sincs, meg is csináltam gyorsan, kb ilyeneket írtam:

    var aButtons = document.getElementsByClassName('a'),
    bButtons = document.getElementsByClassName('b'),
    cButton = document.getElementById('c'),
    dDropdown = document.getElementById('d');

    for(var i = 0; i < aButtons.length; ++i){
    aButtons[i].addEventListener('click', function(){
    var queryParam = this.getAttribute("data-myImportantValue");
    window.document.location.href = 'localhost:myport/myservice/..stb/myFun&query=' + queryParam;
    return false;
    });
    }

    .. bButtons-re is..
    ...cButton-re is stb..

    Mivel gyorsan megvolt, gondoltam akkor megpróbálom szebben megírni, arra gondoltam, hogy például az szebb lenne, meg memória (bár itt annyira mindegy...) szempontjából is jobb lenne, ha a function() { ... } helyett lenne egy eventHandler függvényem amit az összesben tudnék használni. És az lenne még jó, gondoltam, ha a 'localhost:myport/myservice/..stb/myFun' részt, mivel myFun minden esetben más aButton-ök esetén myFunc, bButton-ok esetén myFunc2 stb... ha ezt megadhatnám a handler paraméterében, valamint arra gondoltam, hogy a queryParamétereket &query= is egy paraméterben adnám át a handler függvénynek.

    Azt nem tudtam, hogy ezt így nem lehet, sőt, igazából lehet.

    Megnéztem az addActionListener Chrome beli implementációját, máshol is tuti így van, ott van egy listeners tömb, amibe a listener függvény objektumokat teszik. Ezáltal később lehet mondani removeListenert amikor csak simán kiveszik a listener függvényobj-ot a tömbből. Ezért ha ezt írom, az nem jó.

    addEventListener('click', eventHandler(param1, param2));

    Mert ebben az esetben a () miatt rögtön meg is hívom a függvényt ami ugye nem jó, a tömbbe se tudja a böngésző így betenni stb...

    Mentem tovább, mi lenne, ha a paramétereket bindolnám az objekthez, így nem kéne a függvényt rögtön meghívni, a böngésző el tudná tárolni a listeners tömbben:

    addEventListener('click', eventHandler.bind(thisArg, param1, param2));

    Ez jobb, itt a két paraméter a függvényhez lett bindolva, ezeket elérem egy ilyen fügvénnyel utána:

    function eventHandler(param1, param2) { }

    De ezzel meg az a gond, hogy a thisArg-nak nem tudtam átadni se az event-et, se a this-t. Tehát az eventListener-ben utána nem érem el a aButtons objektet, szóval ez se jó így.

    Na és valahol itt írtam be a topikba, hogy hátha valahogy meg lehet úgy csinálni, hogy az eventHandler függvénynek átadom a aButtons(i) referenciát mint thisArg, valamint a saját paramétereimet, és akkor írhattam volna ilyeneket:

    for(var i = 0; i < aButtons.length; ++i){
    aButtons[i].addEventListener('click', eventHandler(this, 'localhost:myport/myservice/..stb/myFun', {
    someId: "data-myImportantValue",
    somOtherId: "data-otherImportantId"
    }));
    }

    for(var i = 0; i < bButtons.length; ++i){
    bButtons[i].addEventListener('click', eventHandler(this, 'localhost:myport/myservice/..stb/myFun2', {
    someStuff: "akarmi"
    }));
    }

    function eventHandler(baseUrl, queryParams) {
    var queryString = processParams(queryParams);
    // queryString:
    // &someId=<this.getAttribute("data-myImportantValue")>&someOtherId=<this.getAttribute("data-otherImportantId")>
    window.document.location.href = baseUrl + queryString;
    }

    Szóval semmi komoly, csak szebben/jobban/máshogy akartam megcsinálni, ennyi :)

    Megj: PH random italic tageket tesz a hsz-be, wtf? Nem győzöm törölni őket :D

    Hát de ez mi? Nem tudom kitörölni a hsz-ből a dőlt bekezdéseket, mert visszteszi őket :/ Itt van amit nem sikerül szépen formáznom: pastebin

    Karma: de, pont ezt, de a sokBtns eszembe se jutott ^^ :R

    Monospace vagy Programkód formázást használtál?
    Az előbbi szeret megkergülni a [ i ] kombótól.

  • Karma
    félisten

    De ez még mindig nem az amit szeretnék :/

    [link] Lehet, hogy nem is lehet azt megcsinálni ... :( Csak mert ez az utóbbi sem egy szép megoldás.. annyival jobb, hogy nem halmozom az anonim függvényeket.

    Minden esetre, már ez is jobb mintha helyben kezelném le az eseményt, szóval half-win, de azért érdekelne, hogy az alpfeltevést meg lehet-e valósítani :)

    Lehet hogy valamit félreértek, de nem ezt próbálod elérni?

  • Karma
    félisten

    Köszi mindkettőtöknek.
    A kérdés óta kicsit belemászta a google rengetegébe... Hát van itt egy-két dolog amit meg kell nézni...
    Itt nálunk az a legnagyobb félelem, hogy ha az ügyfél kitalálja, hogy "jó, jó ez a táblázat, de kéne ide még egy gomb, meg oda egy címke..." stb. Akkor lehetőleg tudjunk kezdeni valamit az igényekkel.

    Most jutott eszembe, hogy van még egy pont. AJAX hívás a szerver felé...web service kiszolgálja. Na igen, de itt milyen objektumok fognak utazni?! Hogy lehet egy Java objektumot áttuszkolni, hogy a kliens oldali (akármi) is megértse?

    Úgy, hogy a Java szerveroldal vagy XML-be, vagy JSON-ba (ez utóbbi preferált!) szerializálja az adatokat. Akármilyen is szerveroldal kézi gányolattól a legdurvább enterprise gépszörnyig, valószínűleg könnyen be lehet tenni vagy kapcsolni ezt.

  • Karma
    félisten

    Azért van ez, mert egyiket sem ismerem. Nem tudom melyik mi fán terem...A választás pedig nem a felhasználás, hanem a tanulási idő lerövidítése miatt kell...

    A cél webes vékony kliens készítése. A fókusz a HTML5,JS,CSS2/3 technológiákon van. Ehhez kellene egy olyan "tool" ami támogatja ezt és nem kitekert elméletek mentén valósítottak meg benne dolgokat.

    Vállalatirányítási rendszer kliensoldala lesz rá építve....Eddig a kulcs buktatót a custom control-ok készítésében látjuk...

    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

    Winjs-re gondolsz?

    Az mar nagyon regota van, csinaltam is vele appot. Html+js+css.

    Mar a 8.1 rc-ben is benne volt.

    Mi? Van WP8.1 SDK RC? :Y

  • Karma
    félisten

    Elvileg mintha a WP 8.1 is megkapná a windows 8-as világ natív html támogatását, azaz js-el pont ugyanolyan szintű natív kódok lesznek írhatóak (na jó, minimális túlzással), mind a C# + Xaml kombóval.

    Nagyon várom már, sajnos a köznépnek meg a közfejlesztőnek még elég messze van a megjelenése :( Az is jó lenne, ha WinRT komponenseket C#-ban is lehetne írni, ahogy desktopon, és akkor JS-ből is lehetne hívogatni :)

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

    Huh, most nézem, hogy a közepe kicsit zanzás lett. Mobilon írtam, és nem vettem észre :P

    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

    Erről esetleg tudnál írni 1-2 sort, hogy hogy kell elképzelni? Van egy böngészőben futó alkalmazás, mint most a 2048, és az én C#/Java/akármi kódom közbe tud szólni, meg tudja hívni az alkalmazás egyes függvényeit?

    Én eddig sajnos csak egy !JS nyelvben csináltam olyat, hogy natív javascript kódot futtattam, így nincs ebben nagy tapasztalatom :/

    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

    És miért szórakozol C#-al ahelyett, hogy ki-chekcoutolnád a projektet, és amennyiben szabad, továbbfejlesztenéd magadnak az eddigi kódot? Főleg, hogy annyival nem tudod megoldani a fejlesztést, hogy meghívogatsz pár függvényt és kész. Vannak belső állapotai a függvényeknek amin az egész alkalmazás áll, vagy bukik. Azzal is törődni kell.

    trisztan: nem az ő kódjában van az preventDefault.

    Igazából nem ennyire drámai a helyzet. Rengeteg 2048 wrapper van már most is a Store-ban, ami nem csinál többet, mint WebBrowserben futtatja a játékot, és így behívogatva ad egy-két extra menüpontot...

    Meg azért nem mellesleg a hibrid alkalmazások így működnek általában.

  • Karma
    félisten

    Sajnos ez nem jó:
    webBrowser.Navigate("javascript:globalInputManager.restart()");
    string helyett System.Uri-t vár. Én ezzel próbáltam eddig meghívni: webBrowser.InvokeScript("valami");

    #Jim-Y : Az általad írt kód sem működik.

    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

    Szerkesztettem már az előző hozzászólásom csak jött egy áramszünet...

    Szóval, az szépen megy hogy javascriptből hívjak meg C#-s függvényt stb, vissza fele is megy, amennyiben ilyen a függvény a js-ben:
    function valami() {
    alert("masvalami");
    }

    Ahogy sikerült kivennem a kódból, a keyboard_input_manager.js-ben lévő

    KeyboardInputManager.prototype.restart = function (event) {

    event.preventDefault();
    this.emit("restart");
    };

    függvény felelős az újraindításért. Ezt szeretném c-ből meghívni. És ha ezzel megcsinálom a fentebb említett módszert, akkor nem működik. Remélem így már érthető a gondom.

    Ja most látom, ez már túl lett lépve, bocsi :B
    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

    Érthető :R

    Egy dolgot mondj még meg, kérlek: miért lehet az, hogy hiába másolom be a kódot karakterről karakterre, és még a JSON objektumot is hozzá igazítom. hogy pont olyan legyen, mint nálad (és ami amúgy valid), nem hajlandó működni. JSFiddle-ön is működik.

    Két dolgot csináltam vele összesen:
    - belefoglaltam egy functionbe
    - a function első sorában megadtam neki a változót, ami tartalmazza a JSON objektumot.

    A return product.Tipus.sameUntil(manufacturer); sornál viszont a Chrome konzolja Uncaught TypeErrror: cannot call method 'sameUntil' of undefined hibát dob. :F

    Tegyél ez a sor elé egy olyat, hogy "console.log(product)", és kiderül, miért undefined a product.Tipus.

    Egyébként ennyiből nem tudom megmondani...

  • Karma
    félisten

    Ó, ez így nagyon jó :) Át is tudtam alakítani az XML-t JSON objektummá a HTML-en belül egy rejtett div-ben AJAX-szal, majd a div tartalmából létrehoztam a változót. Még egy kicsit tisztább is lett az adathalmaz.

    Viszont amire nem jövök rá, hogy hogy indul be ez az egész összehasonlító folyamat :B

    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

    Mivel szedted így rendbe a kódot?

    Console-ban van hibaüzenet, de pont ugyanazok ment a nem "piszkált" változattal. Így én nem tettem hozzá újabbat.
    Ha rossz nyelvet is ad vissza a böngésző, a manuális állításnál akkor is minden nyelv esetén a beállított nyelvűnek azonosítja a böngésző az oldalt (kivétel a magyar).
    Kipróbáltam telefonról, és németre átcsapva a nyelvet, szintén a default angol verziót nyitja be, ami nem is lenne gáz, mert ha csak az azonosítás lenne a gond átállítanám a default nyelvet magyarra. De az oldal nyelve továbbra is angol a böngésző(k) szerint.
    Igen, minden próbálkozásnál gyalulom az előzményeket, cookie-kat, jelszavakat, űrlapelemeket.

    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

    Elnézést :R

    Ha jól értem így kellene?

    Mert ezt így el tudod olvasni? :P
    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

    Sziasztok.

    Egy program web felületéhez szeretném hozzáadni a magyar nyelvet. A sztringek fordítása folyamatban, működik is szépen de...
    Adott egy script ami (ha jól értelmezem) megnézi az user oprendszerének nyelvi beállítását, és ha talál hozzá nyelvi fájlt, akkor automatikusan arra állítja be a weblap nyelvét, ha nem talál, akkor angol az alapértelmezett. Ehhez a scripthez hozzá is adtam a magyart (a scriptben lévő egyéb nyelvek alapján HTML ISO kódokat használva), így, ha a legördülőből kiválasztom, akkor dolgozik is szépen magyarul, de automatikusan nem állítja be. Valamint, ha beállítom mondjuk németre, akkor a HTML oldal nyelve is német lesz például a Chrome felismeri, hogy német és felajánlja a fordítást (ez minden nyelv esetén működik), de ha az általam hozzáadott magyart választom akkor az oldal nyelve angol lesz. Rálesne esetleg valaki, hogy hol lehet a gubanc?

    <script type="text/javascript" language="javascript">var g_nUserPlacement;var g_bOverrideUserPlacement=false;var g_nUserType;var aLangArray=OnSetLanguageDefault();var g_bLoggedIn=false;var g_nSessionOkay=0;var g_nSessNoLicRemoteAdmin=905;var g_sUserSessionId="";var LanguageCombo=CreateComboBox(aLangArray[0],aLangArray[1],["$ENGLISH$","$GERMAN$","$ITALIAN$","$FRENCH$","$SPANISH$","$PORTUGUESE$","$SERBIAN$","$SWEDISH$","$FINISH$","$NORWEGIAN$","$RUSSIAN$","$DANISH$","$SIMPLIFIED_CHINESE$","$TRADITIONAL_CHINESE$","$JAPANESE$","$HUNGARIAN$"],["en,US","de,DE","it,IT","fr,FR","es,ES","pt,PT","sr,SR","se,SE","fi,FI","no,NO","ru,RU","dk,DK","zh,CN","zh,TW","jp,JP","hu,HU"],"Language","Language",SetLangCookie,undefined,false,200,22,undefined);var nLangComboCnt=LanguageCombo.getItemCount();var PopUpLangCombo=LanguageCombo.getPopupTemplate();PopUpLangCombo.setStyle("height",((16*nLangComboCnt)+((AW.ie)?3:0))+"px");var g_sLang;function OnSetLanguageDefault(){var sBrowserLanguage=navigator.language?navigator.language:navigator.userLanguage;var sLangVal=readCookie('SULang');var aLanguage;var bLangBrowserSet=false;var sDefaultAdminLang="%LOGIN_PAGE_DEFAULT_LANGUAGE%";if((GetURLParameter("Language")!="")&&(GetURLParameter("Language")!="undefined"))sLangVal=GetURLParameter("Language");if(sLangVal==null||sLangVal==undefined||sLangVal==""){if(sDefaultAdminLang!="")sLangVal=sDefaultAdminLang;else sLangVal=sBrowserLanguage.replace("-",",");bLangBrowserSet=true;}if(sLangVal==null||sLangVal==undefined){sLangVal="";bLangBrowserSet=false;}switch(sLangVal.toLowerCase()){case"de,de":case"de":sText="$GERMAN$";sLangVal="de,DE";break;case"it,it":case"it":sText="$ITALIAN$";sLangVal="it,IT";break;case"fr,fr":case"fr":sText="$FRENCH$";sLangVal="fr,FR";break;case"es,es":case"es":sText="$SPANISH$";sLangVal="es,ES";break;case"pt,pt":case"pt":sText="$PORTUGUESE$";sLangVal="pt,PT";break;case"sr,sr":case"sr":case"sr,rs":case"sr,cs":sText="$SERBIAN$";sLangVal="sr,SR";break;case"se,se":case"se":sText="$SWEDISH$";sLangVal="se,SE";break;case"fi,fi":case"fi":sText="$FINISH$";sLangVal="fi,FI";break;case"no,no":case"no":sText="$NORWEGIAN$";sLangVal="no,NO";break;case"ru,ru":case"ru":sText="$RUSSIAN$";sLangVal="ru,RU";break;case"dk,dk":case"dk":sText="$DANISH$";sLangVal="dk,DK";break;case"jp,jp":case"ja,jp":case"jp":case"ja":sText="$JAPANESE$";sLangVal="jp,JP";break;case"zh,cn":sText="$SIMPLIFIED_CHINESE$";sLangVal="zh,CN";break;case"zh,tw":sText="$TRADITIONAL_CHINESE$";sLangVal="zh,TW";break;case"hu,hu":case"hu":sText="$HUNGARIAN$";sLangVal="hu,HU";break;default:sText="$ENGLISH$";sLangVal="en,US";bLangBrowserSet=false;break;}createCookie("SULang",sLangVal,60);aLanguage=[sText,sLangVal];if(bLangBrowserSet){g_sLang=sLangVal;setTimeout("OnReloadPage()");}else return(aLanguage);}function OnLogIn(bAutoLogin){LoadingDialog(false);ShowDialog("LoggingInDialog");var sLoginCmd="%FILE%Login.xml?Command=Login";var LogInRequest=CreatePostRequest(sLoginCmd);var sUserName,sPassWord,sLanguage;if(bAutoLogin){sUserName=decodeURIComponent(GetURLParameter("user"));if(GetURLParameter("password")!="")sPassWord=decodeURIComponent(GetURLParameter("password"));else sPassWord="fvjv@unknown.com";}else{if(!g_bIsLocalAdmin)sUserName=document.login.user.value;else sUserName="";sPassWord=document.login.pword.value;}sLanguage=LanguageCombo.getControlValue();LogInRequest.setParameter("user",sUserName);LogInRequest.setParameter("pword",sPassWord);LogInRequest.setParameter("language",sLanguage);LogInRequest.setRequestHeader("X-User-Agent",navigator.userAgent);LogInRequest.setAsync(true);LogInRequest.request();LogInRequest.response=function(XMLDoc){var nResult=GetXMLValueInt(XMLDoc,"result");var sResultText=GetXMLValue(XMLDoc,"ResultText");var sWelcomeMsg=GetXMLValue(XMLDoc,"welcomemsg");var bAllowFVJVLogin=(GetXMLValue(XMLDoc,"allowFVJV")=="1")?true:false;if(bAllowFVJVLogin)g_nUserPlacement=GetXMLValue(XMLDoc,"userplacement");else g_nUserPlacement=0;if(GetURLParameter("placement")!=""){g_nUserPlacement=parseInt(GetURLParameter("placement"));g_bOverrideUserPlacement=true;if((isNaN(g_nUserPlacement))||(g_nUserPlacement<0)||(g_nUserPlacement>3))g_nUserPlacement=2;}var bRequireEmailChange=(GetXMLValue(XMLDoc,"requireemailchange")=="1")?true:false;var bUserCanSetEmail=(GetXMLValue(XMLDoc,"usercansetemail")=="1")?true:false;var sUserEmail=GetXMLValue(XMLDoc,"useremail");g_nUserType=GetXMLValue(XMLDoc,"usertype");g_sUserSessionId=GetXMLValue(XMLDoc,"sessionid");if(nResult!=g_nSessionOkay&&nResult!=g_nSessNoLicRemoteAdmin){HideDialog("LoggingInDialog");if(nResult==202){if(bRequireEmailChange&&bUserCanSetEmail)OnShowSetEmailDialog(sUserEmail,function(){ChangePasswordDialog(true);},true);else ChangePasswordDialog(true);}else AlertDialog(GetResultText(nResult,"$LOGIN_FAIL_STR$",sResultText));}else{g_bLoggedIn=true;if(sWelcomeMsg!=""&&sWelcomeMsg!=undefined&&nResult!=g_nSessNoLicRemoteAdmin){HideDialog("LoggingInDialog");if(bRequireEmailChange&&bUserCanSetEmail){OnShowSetEmailDialog(sUserEmail,function(){WelcomeDialog(sWelcomeMsg.replace(new RegExp("\\n","g"),"<br>"),OnLoginOK);},true);}else WelcomeDialog(sWelcomeMsg.replace(new RegExp("\\n","g"),"<br>"),OnLoginOK);}else{if(bRequireEmailChange&&bUserCanSetEmail){OnShowSetEmailDialog(sUserEmail,function(){OnLoginOK(false,nResult);},true);}else OnLoginOK(false,nResult);}}};}function OnLoginOK(bReplace,nResult){var sPlacement="";var bAskUserBypass=true;createCookie("Session",g_sUserSessionId,1);if(bReplace==undefined)bReplace=true;if(g_bIsiPad)g_nUserPlacement=0;if((parseInt(g_nUserType)!=0)&&(nResult!=g_nSessNoLicRemoteAdmin)&&(!g_bOverrideUserPlacement))sPlacement="%LOGIN%";else{switch(parseInt(g_nUserPlacement)){case 0:sPlacement="%FILE%ListDir.htm";break;case 1:bAskUserBypass=false;g_bFVJVLicense=true;location.href="%COMMON_FILE%FVJVLoggedIn.htm";break;case 2:g_bFVJVLicense=true;if(bReplace)ReplaceDialog("WelcomeDialog","AskUserPlacementDialog");else ReplaceDialog("LoggingInDialog","AskUserPlacementDialog");PlacementOKButton.element().focus();bAskUserBypass=false;break;case 3:bAskUserBypass=false;location.href="%FILE%Share/Console.htm";break;}}if(bAskUserBypass){if(bReplace)ReplaceDialog("WelcomeDialog","LoggingInDialog");if(GetURLParameter("user")!="")sPlacement=sPlacement+GetBWCLoadParameters();window.location=sPlacement;}}function OnLoggedOut(){g_bLoggedIn=false;}function OnReloadPage(){var sReloadURL="%LOGIN%";if(g_bIsLocalAdmin)sReloadURL="%LOGIN%&LocalAdmin=1";if(GetURLParameter("user")!=""){sReloadURL=sReloadURL+"&user="+GetURLParameter("user");sReloadURL=sReloadURL+GetBWCLoadParameters();}if(GetURLParameter("password")!="")sReloadURL=sReloadURL+"&password="+GetURLParameter("password");if(readCookie("Language")==""&&g_sLang!=undefined)sReloadURL=sReloadURL+"&Language="+g_sLang;window.location.href=sReloadURL;}function SetLangCookie(){LoadingDialog(true);sLangValue=LanguageCombo.getItemValue(LanguageCombo.getSelectedItems());createCookie("SULang",sLangValue,60);if(!g_bIsLocalAdmin)createCookie("SUUserId",encodeURI(document.login.user.value),60);if(RememberMeCheckBox.getControlValue())createCookie("SURememberMe","true",60);else createCookie("SURememberMe","false",60);g_sLang=sLangValue;setTimeout("OnReloadPage()");}function RecommendIEUpgrade(){if(parseInt(readCookie('IERec'))!=1)AlertDialog('<p>$RECOMMEND_IE_UPGRADE_1$</p>$RECOMMEND_IE_UPGRADE_2$',true);createCookie("IERec",1,60);}if(g_bBrowserOk){document.getElementById("JavaWarning").style.display="none";document.getElementById("FormLayer").style.display="block";}else{document.getElementById("JavaWarningText").style.display="none";document.getElementById("JavaWarningReload").style.display="none";document.getElementById("BrowserWarningText").style.display="block";}if(!g_bIsLocalAdmin){document.getElementById("UserNameID").style.visibility="visible";if(g_bAllowRemember){document.getElementById("RememberUserID").style.visibility="visible";}var LoginIDInput=CreateInputField(g_UserName,"UserNameInput","user",undefined,200,20,false,OnValidate);}CreatePasswordField("","PasswordInput","pword",undefined,200,20,false,OnValidate);var g_sBrowserLanguageCheck=readCookie("SULang").replace("-",",");var objLoginButton=CreatePushButton("$LOGIN$","LoginButton",OnValidate);if(g_sBrowserLanguageCheck.toLowerCase()=="it,it")objLoginButton.setStyle("width","65px");else if(g_sBrowserLanguageCheck.toLowerCase()=="fr,fr")objLoginButton.setStyle("width","70px");var bRememberMe=false;if(readCookie('SURememberMe')=="true"&&g_bAllowRemember)bRememberMe=true;var RememberMeCheckBox=CreateCheckBox("$REMEMBER_USER$","remember","remember",bRememberMe,undefined,true);if(AW.gecko)RememberMeCheckBox.setStyle("height","12px");objLoginButton.onKeyEnter=function(){OnValidate();};if(document.getElementById("SULoginLogo"))LoadCustomImage(g_bDisableBranding,g_bHasCustomLogo);if(%SHOW_THEMES%&&document.getElementById("SULoginLogo"))LoadUserTheme();else SetActiveStyleSheet("system");if(parseInt(%ALLOW_PASSWORD_RECOVERY%)!=1){document.getElementById("PasswordRecoverImg").style.display="none";document.getElementById("PasswordRecoverTxt").style.display="none";$('#LoginTaskBar').css("display","none");$('.Bottom-Logos').addClass("Bottom-Logos-No-Toolbar");}else{$('#LoginTaskBar').css("display","block");$('.Bottom-Logos').removeClass("Bottom-Logos-No-Toolbar");}if(document.getElementById("CustomHTTPLoginText").innerHTML!=""){document.getElementById("CustomHTTPLoginText").innerHTML+="<hr style='height:1px;'>";document.getElementById("CustomHTTPLoginText").style.display="block";}if(%SHOW_LANGUAGE%)document.getElementById("LangContainer").style.display="block";LoadErrorMessage("ErrMsg","logout","$LOGGED_OUT_MSG$");if(document.getElementById("Login-Wrapper")){var nOffsetLogin=0;var nLoginWrapperheight=(document.getElementById("Login-Wrapper").style.pixelHeight)?document.getElementById("Login-Wrapper").style.pixelHeight:document.getElementById("Login-Wrapper").offsetHeight;document.getElementById("Login-Wrapper").style.height=(nLoginWrapperheight)+"px";document.getElementById("Login-Wrapper").style.marginTop="-"+((nLoginWrapperheight/2)-nOffsetLogin)+"px";}if(g_bIsiPad&&LoginIDInput!=undefined)LoginIDInput.getContent("box/text").element().setAttribute('autocapitalize','off');</script>

    Ez így nem nagyon adja :U Minimum tedd fel PasteBinre, de még jobb lenne, ha ezen felül csak a releváns részt tennéd be, nem az egész script blokkot. Meg különben is legalább egy pretty printet nyomhattál volna rá.

  • 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" :U

    Fujj de utálom az ilyet...

    Legközelebb lőjetek le hamarabb, ha elkezdek baromságokat írogatni :DDD

    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

    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.

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

    Fujj de utálom az ilyet...

  • Karma
    félisten

    A másodiknak az a lényege, hogy az egy gyártótól származó italok márkanevei egységesen legyenek kiemelve (igen, ez a jQuery topikban lévő adatbázishoz kapcsolódik). Konkrétabban:

    Gyártó:
    Rockstar Energy
    Italok:
    Rockstar Energy Drink
    Rockstar Punched Guava
    Rockstar Recovery Limonade

    Azt szeretném, hogy az elsőnél ne legyen kiemelve az Energy is, hanem egységesen csak a Rockstar mindnél.

    Ezt a jQuery által lekérdezett ID-k alapján szerintem vissza lehetne keresni, csak ötletem sincs, hogyan kéne. A local- vagy sessionStorage talán segíthet, mondjuk hogy ha eltérő gyártó kerül oda, mint az felgyűlt, akkor hozza csak létre a bejegyzéseket a HTML táblában, és utána a localStorage-et üríti.

    Jim-Y:
    Köszi a kódot, az első biztosan jó lesz, mert mindig ugyanúgy kezdődik a két string. A másodikkal játszadozok picit.

    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