lassú az eval

2008.11.24. 22:33 stack

Különböző mérési tesztek végzése közben arra a közhelyre jutottam, hogy az eval lassú, ám meglepődtem, hogy mennyire!? Például, ha egy egyszerű értékadást egymás után jó sokszor végrehajtjuk így is, úgy is, akkor közel ötször – hatszor (néhány alkalommal tizenötször) hosszabb futási időt kapunk eval használatával, mint nélküle: (Chrome-ban még durvább a különbség)

var start = new Date();
for (var i = 0; i < 100000; i++) { var a = 10; }
alert( new Date() - start );

var t = ['var start = new Date();',
'for (var i = 0; i < 100000; i++) { var a = 10; }',
'alert( new Date() - start );'];
eval( t.join('') );

Az egészben a probléma az, hogy sokszor használjuk az eval függvényt, leginkább azoknál az Ajax hívásoknál, ahol végrehajtandó scriptet kapunk eredményül.

Szólj hozzá!

Címkék: nem extjs eval benchmark kipróbálom

Date.parseDate

2008.11.21. 20:30 stack

Vajon a JavaScript kitalálói miért gondolták azt, hogy a hónapok nullától a napok és az évek egytől kezdődnek. Megmagyarázható, de akkor sem logikus, hogy a 2008.11.21. -et miért new Date(2008,10,21) alakban kell létrehozni?

Szerencsére ExtJS-ben ezzel már nem kell foglalkozni, nagyon szépen elkészítették a string2date fordítót, a fenti logikai buktatót sem építették bele. :)

var str = '2008-11-21';
// ExtJS-sel:
var date1 = Date.parseDate(str, "Y-m-d");
// ExtJS nélkül:
var t = str.split('-');
var date2 = new Date( t[0], t[1]-1, t[2] );

Szólj hozzá!

Címkék: date

field és label

2008.11.19. 21:51 stack

Jópofa ötlet volt ez a form layout. Teljesen felesleges lenne minden egyes input mező mellé létrehozni egy label objektumot.  Sokkal kényelmesebb, ha azt mondom, hogy az input mező egy tulajdonsága a címkéje és a konténer tulajdonsága, hogy hogyan jeleníti meg a beviteli mezők mellett (felett) a címkéket. Ám mégis kicsit szépséghibás, hogy a létrehozást segíti a rendszer, ám a további használat már nincsen megoldva… mosolyra deríti az embert, amikor az input mezőt el akarjuk tüntetni és a címkéje ott marad. Emellett szükségünk lehet futás közben a címke átírására is:

Ext.override(Ext.form.Field, {
    setFieldLabel: function(text) {
        this.fieldLabel = text;
        this.container.up('div.x-form-item')
            .child('label.x-form-item-label').update(text + ':');
    },
    hideWithLabel: function() {
        this.hide();
        this.container.up('div.x-form-item')
            .hide().setStyle('display','none');
    },
    showWithLabel: function() {
        this.show();
        this.container.up('div.x-form-item')
            .show().setStyle('display','block');
    }
});

Szólj hozzá!

Címkék: label override field

view.focusRow

2008.11.18. 20:06 stack

Ha egy gridhez hozzáadunk egy új sort, akkor alapértelmezetten odaugrik a néző. Ami általában nagyon hasznos. De előfordulhat olyan eset, amikor ez hátrányos. Opció nincs, amivel ezt ki lehetne kapcsolni, de megoldható, hogy átmenetileg kiiktassuk az ugrást:

var fn = view.focusRow;
view.focusRow = Ext.emptyFn;
store.add( records );
view.focusRow = fn;

Szólj hozzá!

Címkék: grid focus

vissza gomb

2008.11.17. 19:54 stack

Néha roppant idegesítő, ha az ember véletlenül lenyomja a visszatörlés gombot, miközben nem egy input mezőn áll. A böngésző úgy érzi, hogy a back gombot nyomtuk meg és emiatt az előző oldal töltődik be. Lehetséges, hogy ágyúval verébre effektus, de az Ext.History erre a problémára éppen megfelelőnek tűnik. Ha megnyomtuk a back gombot, akkor csináljunk úgy, mintha semmi sem történt volna. Mivel alkalmazásfejlesztéséről van szó, ezért ne is nagyon akarjanak a felhasználók a back gombbal visszalépni. (kitöröltem egy terméket, és a back gomb visszahozná azt?)

Eddig még nem használtam az ExtJS-ben a History-t. Lehetséges, hogy logikus a megvalósítás... de el nem tudom képzelni, hogy milyen hasznom származhat abból, hogy én hozom létre a segéd formot, benne a segéd inputmezővel, illetve a segéd iframe-mel. Arról már nem is beszélve, hogy ha nem IE alatt vagyok, akkor nem is kellene nekem iframe.

if( !Ext.get('history-form') ) {
    Ext.DomHelper.append( Ext.getBody(), {
        tag: 'form', id: 'history-form', cls: 'x-hidden', children:[
            {tag:'input', id: 'x-history-field', type:'hidden'},
            {tag:'iframe', id:'x-history-frame', type:'hidden'}
        ] }
    );
}
Ext.History.init();
Ext.History.on('change', Ext.History.forward );
Ext.History.add(' ');

1. a form létrehozása, 2. a history bekapcsolása 3. a change esemény létrehozása, visszalépés esetén lépjünk ismét előre, 4 végül adjunk a History-hoz egy üres hash-t.

Szólj hozzá!

Címkék: history back button

azonos azonosítók

2008.11.11. 09:05 stack

Hasznos lenne, ha az ExtJS egy új elem létrehozásakor ellenőrizné, hogy megfelelő azonosítót adtunk-e neki. Nevezhetnénk akár dummy checker-nek is, tekintettel arra, hogy ilyen ellenőrzéseket csinálhatna a felhasználó is, de ha ő egyszer nem csinálja, akkor jó lenne, ha legalább az Ext csinálna. :)

Egy furcsa jelenséggel találtam magam szembe, adott egy konténer, amelynek a layoutja border típusú, ám átméretezéskor a benne lévő elem mégsem követte annak méretét. A belső elem egy teljesen hétköznapi grid volt. Méret változással kapcsolatos események kezelését nem babráltam. Más elem nem volt az adott helyen.  És biztos ott, és biztos azt vizsgáltam. Hibakeresés közben már szinte mindent kitakarítottam a szóban forgó elemekből, csak az azonosítót nem... amik valami véletlen folytán ugyanazok voltak… és valóban:

new Ext.Window({
    width: 300, height: 300,
    bodyStyle:'background:red',
    layout: 'border',
    items: {
        id:'hello',
        region:'center',
        bodyStyle:'background:green',
        items: {id:'hello'}
    }
}).show();

JavaScript hibát nem kapok, csupán a végeredmény lesz egy kicsit furcsa.

Szólj hozzá!

Címkék: id napi szívás

IE és a listaelemek mouseout eseménye

2008.11.04. 10:26 stack

Ma is egy néhány perces feladatot sikerült jócskán elhúzni.
Egy rendkívül egyszerű legördülő menü és az IE6 kombinációjából volt a problémám:

$("div.menu > ul > li").hover(
    function(){ $('ul', this).show(); },
    function(){ $('ul', this).hide() }
);

Az ötlet ezeréves, a kód ezeréves, a probléma meg az új CSS-ből adódott, ha a belső listában a listának, illetve a listaelemeknek nincs háttere, akkor IE alatt a mouseout olyan esetben is lefut, amikor arra nem számít az ember...

Szólj hozzá!

Címkék: nem extjs napi szívás

Ext.urlEncode

2008.10.30. 08:58 stack

Valahogy mindig akkor hal le az extjs.com, amikor olyan bug-ba ütközök, amelyet valószínűleg már több száz másik ExtJS használó is megtalált, és a fórumban számtalan megoldást kínáltak a probléma orvoslására.
Az url-ek elkódolását nagyon olcsón oldották meg az ExtJS-ben.

var obj = {
    str:'Hello',
    obj: {
        foo: 'Bar',
        foobar: {
            szia:'világ!',
            hello:'world'
        }
    },
    szamok: ['egy', 'ketto', 'harom'],
    ures: []
}
console.log( Ext.urlEncode( obj) );
// str=Hello&szamok=egy&szamok=ketto&szamok=harom&ures

A tömböt rosszul, az objektumot sehogy, a stringet jól jelenítette meg, a várt eredmény ez lenne:

// str=Hello&obj[foo]=Bar&obj[foobar][szia]=vil%C3%A1g!&obj[foobar][hello]=world&szamok[]=egy&szamok[]=ketto&szamok[]=harom&ures[]=

Mivel nagyobb problémát okozott volna a szerver oldalon módosítani a kódot, kénytelen voltam az Ext.urlEncode -t felülírni:

Szólj hozzá!

Címkék: override urlencode

Több toolbar

2008.10.29. 09:45 stack

Szükségem volt arra, hogy egymás alatt két felső toolbar jelenjen meg, némi keresgéléssel megtaláltam a megoldást, ami egyszerűbb lett, mint gondoltam:

new Ext.Panel({
    renderTo: Ext.getBody(),
    tbar: [{text:'első'},  ' ','...'],
    tbar2: [{text:'második'},' ','...'],
    onRender:function() {
        Ext.Panel.prototype.onRender.apply(this, arguments);
        new Ext.Toolbar({ renderTo:this.tbar, items: this.tbar2 });
    }
});

Ám, nekem kicsivel rugalmasabb megoldás kellett, így a fenti onRender minimális átalakításával már tetszőleges toolbar adható hozzá:

Szólj hozzá!

Címkék: toolbar

késleltetés

2008.10.27. 11:00 stack

Amikor megismertem a JavaScriptet, akkor a késleltetést még nagyon csúnyán oldatták meg:

window.setTimeout('myFunction("szia", "világ");', 1000);

szerencsére ez a kis "csúnyaság" után elterjedt a

window.setTimeout(function() {myFunction("szia", "világ");}, 1000);

forma is. Programozás szempontjából sokkal elegánsabb egy névtelen függvény bevezetése, mint egy string végrahajtása, ám olvashatóság szempontjából mindenképpen problémás.  Szinte elveszik az utasítás a sok töltelék között.

ExtJs-ben a késleltetést úgy oldották meg, hogy a "függvény típust" egészítették ki a következő metódussal:

myFunction.defer(1000, this, ["szia", "világ"] );

Nincs mellébeszélés. Csak azt írjuk le, amit szeretnénk. :)

Szólj hozzá!

Címkék: function timer

ExtJS blog, mi ez?

Az ExtJS egy JavaScript keretrendszer, melyet a blog írója elfogultan a legjobbnak tart, és ez a blog olyan apróságok gyűjteménye, melyek ExtJS használata közben felmerültek, eszébe jutottak...

Címkék

ajax (4) alignto (1) állás (3) analytics (1) anchorto (1) android (4) animate (2) array (9) auto (1) back button (1) beautifier (1) beforeevent (1) benchmark (1) blur (1) budapest.js (1) button (1) canvas (1) capture (1) case sensitive (1) center (1) change (1) cikkajánló (1) class (2) closure compiler (1) collapse (1) combobox (3) comment (1) console.log (2) contextmenu (2) core (2) count (1) css (15) csv (1) dataview (1) date (4) datefield (3) datepicker (1) debug (1) doksi (1) dragdrop (1) easing (1) eclipse (1) editor (1) element (5) error (5) eval (2) event (1) fejtörő (1) field (2) fieldset (1) filter (1) firefox (4) firefox extension (2) focus (3) fonts (1) fun (1) function (1) google (2) google chrome (1) grayscale (1) grid (4) group contact (1) header (3) height (2) hidden (1) hirek (2) history (1) htaccess (1) html5 (2) htmleditor (2) https (1) icon (3) id (2) ie (2) ie6 (1) ie9 (1) iframe (3) image (2) indexof (1) javascript (1) jquery (2) jslint (2) jsmin (1) json (7) keymap (1) kipróbálom (2) könyvajánló (2) label (1) layout (1) lint (1) log (1) loop (1) magyar (2) mandelbrot (1) mask (1) math (1) maxlength (1) mistake (1) mysql (5) napi szívás (16) nem extjs (12) node (1) nth child (1) number (1) off (5) offline (1) operator (1) override (20) pagesize (1) paging (2) panel (2) php (7) picker (1) plugin (3) pozicionálás (2) preload (1) print (1) propertygrid (1) pseudo (3) readonly (2) record (1) regexp (1) replace (1) resizable (1) rotate (1) round (1) scale (1) sencha touch (2) server (1) shuffle (1) slider (1) sort (3) sortable (1) store (2) string (7) sum (1) tabchange (1) tabpanel (1) tab key (2) tdd (1) template (1) textarea (2) textfield (1) textitem (1) theme (2) throw (1) timer (1) timestamp (1) title (2) toggle (1) toolbar (6) tools (1) total count (1) transparent (1) tree (1) treenode (1) trigger (1) truncate (1) try (1) ucfirst (1) undefined (2) unique (1) unload (1) urlencode (1) utf8 (2) verzió (1) video (1) viewer (1) viewport (2) visible (2) vtype (1) window (2) xtype (1) zindex (2)

Extjs.blog.hu - RSS

Kérdés?

süti beállítások módosítása