Autologin script pro FF pomocí Greasemonkey – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Autologin script pro FF pomocí Greasemonkey – JavaScript, AJAX, jQuery – Fórum – Programujte.comAutologin script pro FF pomocí Greasemonkey – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

Petr Fojtík0
Věrný člen
10. 7. 2007   #1
-
0
-

Mapy na Atlase http://amapy.atlas.cz umožňují (za současného používání řady dalších užitečných operací mapového systému)
i možnost vkládání(+editace) vlastních objektů (značky,popisy,...).
A tady při každém přístupu (nebo dojde-li k samoodhlášení) následuje otravné:
[A] Přihlásit se [B] Vyplnit dvojici polí email/heslo [C] Odeslat .....pěkně ručně!
Nejedná se o klasický formulář (takže k autofillu browser použít nelze), takže usiluji o eliminaci kroků [B][C] pomocí JS.
API využívá moderní objektový JS + framework MooTools; celá (poněkud rozsáhlá ale systematicky sestavená)
JS knihovna v souboru amap4.js se načte do paměti jen jednou - při prvním přístupu na stránky amapy.
Takže poté lze modifikovat metodu (objektu Smartnames) provádějící [C]=odeslání přihlašovacích údajů:
Původní metoda:
Smartnames.onLogin = function(e){
if(e.type=="keypress"&&e.key!="enter"){return;}
var mail=this.loginemail.value.trim();
var pass=this.loginpass.value;
this.logininfo.innerHTML="";
if(mail.length==0||mail.indexOf("@")<1){
this.logininfo.innerHTML="Zadejte V\xe1\u0161 email ...";return;}
if(pass.length<6){
this.logininfo.innerHTML="Heslo mus\xed b\xfdt alespo\u0148 6 znak\u016f dlouh\xe9 ...";return;}
this.login(mail,pass);
}

Po úpravě a vytvoření záložkové aplikace (bookmarkletu), umožňující spuštění (a tedy i modifikaci kódu) v čase, kdy je kompletně načten:

javascript:void( Smartnames.onLogin=function(e){this.logininfo.innerHTML="";this.login("aska@tiscali.cz","pswxxxx");} )

To je maximum kterého jsem dosáhl a teď bych chtěl využít ve Firefoxu add-on Greasemonkey,
který má umět spustit skript na určené stránce zcela automaticky;
Jenže (když jsem použil kód z bookmarkletu) tak nefungoval (protože se spustil před načtením stránky???)
Šlo by nějak nastavit, aby se spustil až po načtení ??? [zatím nemám GM prostudován do detailů]
Obvykle se používá window.onload; ale v dokumentaci AMAPI se uvádí že:

Inicializace map může proběhnout tradičně pomocí load události elementu body. Na ní však nelze spoléhat.
Jediný nedotažený obrázek a událost load nebude vyvolána.Proto AMapy API vyhazuje událost domready.
Příklad:
<script type="text/javascript">
var Page = { load: function() {var mainMap = new AMap("mainMap"); mainMap.loadMaps()} } // načteni mapy
window.addEvent('domready', Page.load.bind(Page));
</script>

Inicializace - původní:
var Page={

load:function(){
document.title="Mapa \u010cesk\xe9 republiky a Evropy | Atlas.cz";
this.map=new AtlasMap("mainmap",{});
this.initControls();
this.map.tryLoadFromUrl();
$("showbubblehelp").addEvent("click",this.showBubbleHelp.bind(this));
Garbage.addClass(this);
},
showBubbleHelp:function(){
if(this.helpIsOpen){
this.map.bubble.close();
this.helpIsOpen=false;
return;
}
this.helpIsOpen=true;
var c=this.map.getGeoCenter();
var img=new Element("img").setStyles("width:562px; height: 322px;").setProperty("src","design/napoveda2.png");
this.map.showBubble(c,img,{maxSize:new ASize(606,410),maximizable:true,moveToShowAll:false});
var b=this.map.bubble;
if(b.minimalized){b.onMaxminClick();
b.maxMinBtn.style.display="none";}
},
initControls:function(){
[MainMenu,SearchForm,SearchNearby,ResultsSidebar,PoiManager,BubbleManager].each(function(bar){bar.init(this.map);},this);
}
};
window.addEvent("domready",Page.load.bind(Page));

Doufám, že to nějak půjde....
Pokud někdo "umí" MooTools a byl by ochoten, přidám relevantní kód sidebaru (=HTML)+ kompl.object Smartnames(=JS)

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
10. 7. 2007   #2
-
0
-

Hm, nechce sa mi to studovat, je to na mna dlhe... Mozes skusit firebug (firefox ext.) www.getfirebug.com, ten ma (aj) console, ktora umoznuje spustat javascript rucne aj po nacitani stranky. Aj ked to tvoj problem nevyriesi (automaticke spustanie), budes aspon vediet, kde je problem...

ked tak pozeram na tu fciu onLogin, zda sa ze je volana az potom ako sa zobrazi nejaky vkladaci objekt a zadanie sa potvrdi. Mal by si skor najst fciu, ktora vola samotny objekt s vstupnymi polami vytvara a tu prepisat tak, aby ta automaticky prihlasila...--volala fciu Smartnames.login()

k firebugovej console - funguje to cca takto: nacitaj stranku, otvor console, napis do nej js code, a spusti...

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
10. 7. 2007   #3
-
0
-

Firebug mám velmi rád, je stejně dobrý na CSS jako na DOM a ladění skriptů, problém je že JS kód AMAPI (výchozí - tedy ten, který Firebug považuje za "source" je zkomprimován = po načtení se spustí,dekomprimuje do jediného (>200kB velkého) řetězce O, a jako poslední se provede eval(O) . Takže přestože mám v proměnné O uložen text definic všech proměnných, funkcí atd.(můžu ho studovat), nevím jak by se daly nastavovat BP nebo krokovat funkce.
No a s tím jsem moc neuspěl - skutečně nevím jak jedním kliknutím na tlačítko <přihlásit se> provést akci Smartnames.login("aska@tiscali.cz","pswxxxx").
Proto to prozatímní řešení na 2 kliky.

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
11. 7. 2007   #4
-
0
-

firebug tam ma aj "Profile", zapnes ho, potom vypnes a vypise ti vsetky fcie ktore sa medzi tym volali. tak to skus tak, ze zapnes, klikni na tlacitko ktore vyvola ten login a potom vypni. a uz len hladaj... Co sa tyka takychto jednoriadkovych kodov, skus napr.: http://elfz.laacz.lv/beautify/?

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
11. 7. 2007   #5
-
0
-

Pokud by GreaseMonkey nedovedl spustit skript až po načtení stránky, mohu použít časovač
[setInterval s opakovaným testováním existence modifikovaného objektu] [nebo "natvrdo" dát 2sec]

// Greasemonkey user script ===> TATO VERZE FUNGUJE !!!  

// --------------------------------------------------------------------
// ==UserScript==
// @name MAPY autologin
// @namespace tag:ikar@quick.cz,2007-07-10:mapy_autologin
// @description example script to onload on mapy.cz
// @include http://amapy.atlas.cz
// @include http://amapy.atlas.cz/*
// ==/UserScript==
setTimeout("Smartnames.onLogin=function(e){this.login(\"aska@qik.cz\",\"psw\");}",2000)

Bohužel nevím proč mi totéž vloženo do funkce (při rozsáhlejším modifikačním kódu bude vhodná) NEFUNGUJE !!!


// ==/UserScript==
function modifikuj(){
alert("ANI TENTO ALERT SE NESPUSTÍ");
if(Smartnames) Smartnames.onLogin=function(e){this.login("aska@qik.cz","psw");}
}
setTimeout("modifikuj()",2000)

Co s tím?

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
11. 7. 2007   #6
-
0
-

a aku chybu hlasi? Predpokladam ze fcia modifikuj() je definovana v scope nejakej spustacej fcie toho GreaseMonkey. setTimeout so stringovym parametrom vola prikaz iba vo window scope, takze ju nevie najst.

skus to len predanim referencie:

function modifikuj()

{
alert("ANI TENTO ALERT SE NESPUSTÍ");
if(Smartnames) Smartnames.onLogin=function(e){this.login("aska@qik.cz","psw");}
}
setTimeout(modifikuj,2000); // bez uvodzoviek a zatvoriek - iba referencia


alebo este lepsie - rovno anonymnou funkciou:


setTimeout(function(){
alert("ANI TENTO ALERT SE NESPUSTÍ");
if(Smartnames) Smartnames.onLogin=function(e){this.login("aska@qik.cz","psw");}
},2000)

Nahlásit jako SPAM
IP: ...–
Prog.
Prog.0
Věrný člen
11. 7. 2007   #7
-
0
-

Tak som tu Greasemonkey nainštaloval, je to celkom pekne :-)

spravil som takýto pokus:

<html>

<head>
<script type="text/javascript">

alert('1. page is loading...');
window.onload = function() { alert('2. page is loaded.'); }

</script>
</head>
<body></body>
</html>


a cez Greasemonkey pripojil script:
// ==UserScript==

// @name pokus
// @namespace pokus
// @description pokus
// @include http://localhost/pokus.htm
// ==/UserScript==
alert('3. Greasemonkey-user script');


[podtrzene]výsledkom boli alerty v tomto poradí:[/podtrzene]
1. page is loading...
3. Greasemonkey-user script
2. page is loaded.

Z toho vyplýva, že gm script sa volá tesne pred window.onload. Skúsil som napísať script, ktorý dolní alebo prepíše window.onload o ďalšou funkciou, ale došlo k chybe - pravdepodobne firefox zakázal prístup k window.onload počas vykonávania tohto user-scriptu:

// @name           pokus

// @namespace pokus
// @description pokus
// @include http://localhost/pokus.htm
// ==/UserScript==
window.onload = function() { alert('prepisal som povodny onload'); }
... toto vrati chybu:

Component is not available



Takze posledny pokus:
// ==UserScript==

// @name pokus
// @namespace pokus
// @description pokus
// @include http://localhost/pokus.htm
// ==/UserScript==

setTimeout(function(){
alert('toto je uz ok');
},2000)

teraz sa alert zavolá až nakoniec, až po window.onload, (resp. počas neho). Aj keby bol interval nastavený na 1ms. Sranda je, že ten interval sa začína rátať odkedy sa volá window.onload, čiže ak nekliknem na [OK] v tom vyskočenom alerte (ktoré vytvorí window.onload), tak po 2000ms vyskočí další alert, a budú naraz zobrazené dva :-)))

Tebe by to problém robit nemalo, toto riešenie by malo byť OK:
// Greasemonkey user script

// --------------------------------------------------------------------
// ==UserScript==
// @name MAPY autologin
// @namespace tag:ikar@quick.cz,2007-07-10:mapy_autologin
// @description example script to onload on mapy.cz
// @include http://amapy.atlas.cz
// @include http://amapy.atlas.cz/*
// ==/UserScript==
setTimeout(function(){

Smartnames.onLogin=function(e)
{
this.login("aska@qik.cz","psw");
}

},1);

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
11. 7. 2007   #8
-
0
-

Je to, jak jsem se bál. Zatímco mi běží vlákno setTimeout a načte se stránka, jakékoliv proměnné - tedy i funkce ve skriptu jsou vymazány z paměti.
Nevadí, v tom případě můžu mít všechen kód v samostatném souboru a do setTimeout nacpu "jednořádkovou" sekvenci příkazů, které ho vloží do stránky a spustí.
..............hele..Kdyby tohle forum dělalo pravidelný REFRESH tak bych si ráčil všimnout poněkud dříve, že přibyly novinky kterými je záhodno se zabývat.
Rozhodně ti dékuju za povzbuzení.

Nahlásit jako SPAM
IP: ...–
Petr Fojtík0
Věrný člen
11. 7. 2007   #9
-
0
-

Asi se budeš divit, ale - všechny selhaly:

setTimeout(function(){Smartnames.onLogin=function(e){this.login("ask@qik.cz","psw");}},4000);  

setTimeout(function(){ modifikuj() },4000); .....čas je dostatečný >2x
setTimeout(modifikuj,4000);
Pokud jsem přidal ošetřující podmínku: if(Smartnames) Smartnames.onLogin=func.......
tak Firebug ve své consoli oznámil: Smartnames is not defined

Takže jediné co funguje je:
setTimeout(function(){ alert('toto je naozaj pekné,ale čo s tým'); },2000)


setTimeout("if(Smartnames)Smartnames.onLogin=function(e){this.login(\"ask@tis.cz\",\"HeSlo\");}",2000)

Moc to nechápu, proměnná Smartnames je přece objekt v globalním scopu - tohle je definice ze skriptu:
[knihovní funkce najdeš na http://docs.mootools.net/ v docs,demos,code]
var Smartnames={

init:function(map){
if(Smartnames.inited){return;}
Smartnames.inited=true;
this.map=map;
this.sidebar=$("smartnamesidebar");
var imgs=this.sidebar.getElements(".icons div");
this.icons=this.sidebar.getElement(".icons");
for(var i=0,l=imgs.length;i<l;i++){
var img=imgs[i];img.fixPng();
var img=imgs[i];img.setCursor("m");
this.dragger=new Drag.Move(img,{
onBeforeStart:this.onIconDragBefore.pass(img,this),
onStart:this.onIconDragStart.pass(img,this),
onComplete:this.onIconDragComplete.pass(img,this)
});
}
this.images=imgs;
this.bound={"mousemove":this.map.saveMousePos.bind(this.map)};
this.mysmartnamesform=this.sidebar.getElement(".mysmartnames");
this.protectform=this.sidebar.getElement(".protectform");
this.loginform=this.sidebar.getElement(".loginform");
this.savedform=this.sidebar.getElement(".savedform");
this.smartnamedetail=this.sidebar.getElement(".smartnamedetail");
this.forms=[this.mysmartnamesform,this.protectform,this.loginform,this.savedform,this.smartnamedetail];
this.loginbtn=this.sidebar.getElement(".loginbtn").addListener("click",this.onLogin.bind(this)).addSpirit();
this.loginemail=this.sidebar.getElement(".loginemail").addEvent("keypress",this.onLogin.bindWithEvent(this));
this.loginpass=this.sidebar.getElement(".loginpass").addEvent("keypress",this.onLogin.bindWithEvent(this));
this.logininfo=this.sidebar.getElement(".logininfo");
this.protectbtn=this.sidebar.getElement(".protectbtn").addListener("click",this.onProtect.bind(this)).addSpirit();
this.showprotectbtn=this.sidebar.getElement(".showprotectbtn").addListener("click",this.onShowProtect.bind(this)).addSpirit();
this.email=this.sidebar.getElement(".email").addEvent("keypress",this.onLogin.bindWithEvent(this));
this.pass1=this.sidebar.getElement(".pass1").addEvent("keypress",this.onProtect.bindWithEvent(this));
this.pass2=this.sidebar.getElement(".pass2").addEvent("keypress",this.onProtect.bindWithEvent(this));
this.savebtn=this.sidebar.getElement(".savebutton").addListener("click",this.onSave.bind(this)).addSpirit();
this.smartname=this.sidebar.getElement(".smartname");
this.descr=this.sidebar.getElement(".description");
this.saveinfo=this.sidebar.getElement(".saveinfo");
this.logintoggler=this.sidebar.getElement(".logintoggler").addEvent("click",this.toggleLoginForm.bind(this)).disableSelection();
this.smartnameUrl=$("smartnameUrl");
this.mysmartnamesform.addEvent("click",this.onListingClick.bindWithEvent(this));
this.map.addEvent("onResizeEnd",this.handleResize.bind(this));
AMapAjax.request("smartname","",this.onAjaxInit.bind(this),true);
Garbage.addClass(this);},

handleResize: function(){this.setContentHeight();},
setContentHeight: function(){var f=this.mysmartnamesform; var s=f.style; s.height="auto";
if((f.getTop()+f.offsetHeight)>(window.getHeight()-25)){
s.height=(window.getHeight()-15-f.getTop())+"px";}
},
onAjaxInit: function(resp){this.isAuthenticated=resp.IsAuthenticated;
if(this.isAuthenticated){this.logintoggler.innerHTML="odhl\xe1sit";
this.showUsersSmartnames(resp.UserSmartNames);}
else
{this.logintoggler.innerHTML="p\u0159ihl\xe1sit se";}
},
hideForms: function(){this.forms.each(function(form){form.style.display="none";},this);},
toggleLoginForm: function(){if(this.isAuthenticated){
AMapAjax.request("smartname","action=signout",this.onLogout.bind(this),true);}
else {this.hideForms(); this.loginform.setStyle("display","block");}
},
onLogout: function(){
this.isAuthenticated=false;
this.logintoggler.innerHTML="p\u0159ihl\xe1sit se";
this.hideForms();
this.loginemail.value="";
this.loginpass.value="";
this.logininfo.innerHTML="";
this.dispose();},

onLogin: function(e){
if(e.type=="keypress"&&e.key!="enter"){return;}
var mail=this.loginemail.value.trim();
var pass=this.loginpass.value;
this.logininfo.innerHTML="";
if(mail.length==0||mail.indexOf("@")<1){
this.logininfo.innerHTML="Zadejte V\xe1\u0161 email ...";return;}
if(pass.length<6){
this.logininfo.innerHTML="Heslo mus\xed b\xfdt alespo\u0148 6 znak\u016f dlouh\xe9 ...";return;}
this.login(mail,pass);
},
login: function(mail,pass){
AMapAjax.request("smartname","action=login&email="+mail+"&pass="+pass,this.loginFinished.bind(this),true);
},
loginFinished: function(resp){
this.isAuthenticated=resp.IsAuthenticated;
if(this.isAuthenticated){
this.loginform.setStyle("display","none");
this.logintoggler.innerHTML="odhl\xe1sit";
this.showUsersSmartnames(resp.UserSmartNames);
}
else{
this.loginform.setStyle("display","block");
this.mysmartnamesform.setStyle("display","none");
this.logintoggler.innerHTML="p\u0159ihl\xe1sit se";
}
if(resp.InfoMessage){
this.loginform.getElement(".logininfo").innerHTML=resp.InfoMessage;}
}, .....atd.
----------------------------------------------------------------------------------------------------------------------------------
A tohle boční panel v HTML (jen části týkající se přihlášení):
Smartnames.logintoggler <---> TLAČÍTKO: <span> Přihlásit se </span>

=================================================================================================================================
<div id='sidebar'>
<div id='sidebartoggle' title="Schovat"> </div>
<div id='sidebarcontent'>
<div style="display: none" id='smartnamesidebar'>

<span class='logintoggler'>přihlásit se</span>

<div class='sidebarbox loginform'>
<h2>Přihlašte se</h2>
<div class='content'>
<p>Vyplňte svou e-mailovou adresu a heslo, pod kterým jsou všechny vaše vytvořené značky uloženy. </p>
<fieldset>
<label> E-mail </label> <input name='email' class='loginemail' maxlength='100' type='text' />
<label> Heslo </label> <input name='pass' class='loginpass' type='password' />
</fieldset>
<span class="logininfo error"> </span>
<div class='footer'>
<div class="button loginbtn"> Odeslat </div>
</div>
</div>
</div>
=================================================================================================================================

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
12. 7. 2007   #10
-
0
-

Hm, skus este toto:

function start(sn)

{
sn.onLogin=function(e) { sn.login("aska@qik.cz","psw"); }
}
setTimeout("start(Smartnames)",1);



A keď nepojde, tak toto ti možno pomôže vyhnúť sa písaniu toho stringového kódu:
function start()

{
// kod
}
setTimeout(start.toSource(),1);

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
12. 7. 2007   #11
-
0
-

Zkusím....
Nefunguje.
Zkusil jsem s GM skriptem pro http://amapy.atlas.cz tyto testy:

function NULA(){

alert("Sláva NULA");
}
function JEDNA(one){
if(one)alert("Sláva JEDNA [true]");
else alert("Sláva JEDNA [false]");
}
setTimeout(NULA.toSource(),6000); // nic se neděje
setTimeout("NULA()",6000); // NULA is not defined
setTimeout("JEDNA(1)",6000); // JEDNA is not defined
setTimeout("JEDNA(Smartnames)",6000); // JEDNA is not defined

Asi existuje jediný způsob, jak definovat globální proměnnou:


/*------------- nefungují --------------*/
self.pet=5;
window.sest=6;
eval("sedm=7");
eval("var osm=8;");
dej=new Function("return Smartnames");
/*------------- funguje ----------------*/
setTimeout("var dva=2",0);

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
13. 7. 2007   #12
-
0
-

Jou, tak som nakukol do greasemonkey.js, veľa som z toho nepochopil (ff extensny som ešte neštudoval), ale ono to asi funguje tak, že sa tam vytvára nejaký ďalší objekt, v ktorom existuje vlastné window (safeWindow) ktoré nemá prístup k Javascriptovým objektom. Referencia k originálnemu window objektu sa zachováva cez unsafeWindow, a keď som to skúsil, tak to išlo:

Skús to takto:

// Greasemonkey user script

// --------------------------------------------------------------------
// ==UserScript==
// @name MAPY autologin
// @namespace tag:ikar@quick.cz,2007-07-10:mapy_autologin
// @description example script to onload on mapy.cz
// @include http://amapy.atlas.cz
// @include http://amapy.atlas.cz/*
// ==/UserScript==

unsafeWindow.Smartnames.onLogin = function(e)
{

}

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
14. 7. 2007   #13
-
0
-

Díky.
Když mi FIREdeBUGer poslal chybové hlášení, tak jsem často viděl odkaz na místo, kde ERROR vznikl : v souboru greasemonkey.js
A tam jsem zahlédl objekt SandBox; název mi sice napověděl, že jde jde bezpečnostní blokádu a možné vysvětlení výsledků naší snahy,
ale k porozumění bych musel prostudovat na mě dost komplexní a složitý kód.
Ale v budoucnu to zkusím (nejlíp nejprve něco analogického, ale okomentovaného!). petr


Nahlásit jako SPAM
IP: ...–
14. 7. 2007   #14
-
0
-

Musite si uvedomit dve veci - kdyz pracujete s GM, tak existuji DVE roviny skriptu, mez nimiz je jen omezena prostupnost. 1. rovinou je samtny GM skript - ten ma urcite moznosti, jak ovlivnit samotny kod (a tedy i JS skript) stranky. Druhou rovinou je samotny JS kod stranky. Typickym prikladem jeto tvoje zjisteni s tou promennou - kdyz das neco do setTimeOutu, tak se to projevi az na te druhe rovine. Stejnym zpusobem myslim funguje document.write - ten pokud si dobre pamatuju, tak nic zas tak moc nevypisuje, ale zadava JS prikazy, takze by melo fungovat i document.write("var promenna=hodnota;").

PS: Berte to s rezervou, s GM jsem delal naposled nekdy pred rokem. To jsem to ale mival v malicku :D

Nahlásit jako SPAM
IP: ...–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Petr Fojtík0
Věrný člen
15. 7. 2007   #15
-
0
-

Bojím se že document.write(cokoliv) aplikován na nahraný dokument provede document.open() ....a je po stránce.
Taky mě napadlo vpravit přímo do cílové stránky http://amapy.atlas.cz skript metodou kterou mám ověřenou
(je určena k vykonání až poté co je stránka kompletně načtená, externí skript se vloží do stránky pomocí append a automaticky dojde k jeho spuštění !!!):

      setTimeout(

"s=document.createElement(\"script\");"
+ "s.src=\"file:///c:/jsexam/forAMAPI.js\";"
+ "document.head.appendChild(s)"
,3000);

--------------------- forAMAPI.js -----------------------------------
alert("TO JE ALERT");
Smartnames.onLogin=function(e){this.login("aska@tis.cz","xxxx");}
--------------------------------------------------------------------

Co byste řekli? Skript se stal součástí stránky, ale nijak se nespustil. Proč....?

Nahlásit jako SPAM
IP: ...–
15. 7. 2007   #16
-
0
-

Ted jsem se podival do sveho strasiho skriptu a resil jesem to pres ten setTimeOut. V zasade to cypadalo nejak takhle:



var jsCode=''+
'var lastDiv;'+
'var toggleTreeVis=function (objname){'+
'obj=document.getElementById(objname);'+
'if(obj.style.display=="none"){'+
'obj.style.display="block";'+
'createCookie(charName+"-TreeState-"+objname,"block",999);'+
.
.
.
'list_woods=addNode(targetObjectName,"The Distant Woods","woods.php","1");'+
'list_island=addNode(targetObjectName,"The Mysterious Island","island.php","1");'+
'list_lair=addNode(targetObjectName,"The Lair of NS","lair.php","1");'+

'butLocsAtkSkill=document.getElementById("butLocsAtkSkill");'+
'butLocsAtkSkill.onclick=switchAtkMode;'+


'return false;'+
'}; ';

setTimeout(jsCode,1);


Nahlásit jako SPAM
IP: ...–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Petr Fojtík0
Věrný člen
15. 7. 2007   #17
-
0
-

<To PROG.>
Zkusil jsem zjistit rozdíl při použití oboru objektu unsafeWindow a globálního objektu stránky.
Načetl jsem AMAPY s tímto GMscriptem:

// ==UserScript==

// @name AMAPY testy
// @namespace tag:ikar1@quick.cz,2007-07-15:amapy_testy
// @description obor unsafeWindow KONTRA rozšířené chování function/MOOTOOLS
// @include http://amapy.atlas.cz
// @include http://amapy.atlas.cz/*
//
//____________________Vytvořím 2 zdánlivě totožné funkce: fnA , fnB ______________________________________
// a)
unsafeWindow.fnA=function(){alert("function fnA() definovaná v unsafeWindow"); }
// b)
proved = "fnB=function(){alert(\"function fnB() definovaná v globalním oboru načtené stránky\");}" ;
setTimeout(proved,0);

// (téhož dosáhnu provedením výrazu:
// fnB=function(){alert("function fnB() definovaná v globalním oboru načtené stránky"); }
// v consoli Firebugu)

Pak jsem ve Firebugu zavolal: fnA() / fnB() => obě vypsaly svůj alert
Zdrojové kódy jsem už ani nemusel ověřovat [OK] : fnA.toString() / fnB.toString()
Podstatný rozdíl ukázal výpis vlastností/metod objektů: (a) fnA (b) fnB
[Na to je ideální <Script>>WATCH-line]
a) unsafeWindow používá normální=nemodifikovaný objekt Function
console.log(fnA)
>> ["prototype"]
b) framework MooTools má modifikované=rozšířené nativní třídy, i třídu Function:
console.log(fnB)
>> ["prototype", "create", "pass", "attempt", "bind", "bindAsEventListener", "delay", "periodical", "bindWithEvent"]

Tím se vysvětluje, proč použití GMscriptu s:
unsafeWindow.Smartnames.onLogin = function(e){this.login("aska@tis.cz","xxxx");}
během procesu přihlášení vypíše <ERROR:> this.onLogin.bind is not a function

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
16. 7. 2007   #18
-
0
-

Skús spustiť vo firebugu (po načítaní tej stránky) takýto kód (po jednom riadku):

for(i in Function) console.log(i);

for(i in Object) console.log(i);
...ak niečo vypíše, znamená to že máš pravdu a objekty sú rozšírené (niekde vo výpise by malo byť aj bind)

Ale, nepovedal by som, že ide o problém rozšírenia objektu Function... skôr myslím, že ten objekt onLogin je definovaný nejako takto:
var onLogin = function()

{
// ...
}
onLogin.bind = function()
{
// ...
}


Keď prepíšeš onLogin, zmažeš aj všetky metódy tohto objektu...


Potom by to mohlo ísť asi takto:

var new_onlogin = function()

{
// nova onlogin funkcia...
this.login("aska@tis.cz","xxxx");
}

for(m in unsafeWindow.Smartnames.onLogin)
{
new_onlogin[m] = unsafeWindow.Smartnames.onLogin[m];
}
unsafeWindow.Smartnames.onLogin = new_onlogin;

Nahlásit jako SPAM
IP: ...–
Prog.
Prog.0
Věrný člen
16. 7. 2007   #19
-
0
-

Aha, už som si to lepšie prečítal a už si to aj testoval, takže objekty sú rozšírené,... No, aj tak, môžeš skúsiť to riešenie z posledného postu... Alebo skús nájsť bod, kde sa tá funkcia onLogin volá, resp. kde sa volá onLogin.bind() a tam to upraviť... (firebug-profile určite pomôže;)

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
16. 7. 2007   #20
-
0
-

Jak vysvětlíš toto:
1.Vybereme jméno neexistujícího objektu/funkce třeba: cotuhle
2.Provedeme: cotuhle=function(){ }
3.Vypíšeme vlastnosti: for(i in cotuhle) console.log(i)
4.Dostaneme:
prototype
create
pass
attempt
bind
bindAsEventListener
delay
periodical
bindWithEvent

Tohle function (bez kódu mooTools) nedělá.
A pokud bych "přepsal=zničil" náš (nebo cizí) existující objekt novou funkcí ?
Zkusme to na nějaké metodě objektu Smartnames (prozměnu té odhlašovací):

stara=Smartnames.onLogout;


Smartnames.onLogout=function(){alert("Změna SOURCE funkce")};

porovnej=function(property){
test= "stara."+property+"==Smartnames.onLogout."+property;
return test + " <=> " + eval(test);
}
for(i in stara) console.log(porovnej(i));
Jediné, co se změnilo, je vlastnost prototype (???):
stara.prototype==Smartnames.onLogout.prototype <=> false
stara.create==Smartnames.onLogout.create <=> true
stara.pass==Smartnames.onLogout.pass <=> true
stara.attempt==Smartnames.onLogout.attempt <=> true
stara.bind==Smartnames.onLogout.bind <=> true
stara.bindAsEventListener==Smartnames.onLogout.bindAsEventListener <=> true
stara.delay==Smartnames.onLogout.delay <=> true
stara.periodical==Smartnames.onLogout.periodical <=> true
stara.bindWithEvent==Smartnames.onLogout.bindWithEvent <=> true

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
16. 7. 2007   #21
-
0
-

Hm, zachovalo sa to úplne správne :-)

Ak v javascripte napíšeš var a = function() {}; nejde len o obyčajnú funkciu, ale o vytvorenie nového objektu (v JavaScripte je objekt všetko). A každný objekt má svoj vlastný [podtrzene]prototyp[/podtrzene]. (čo je tiež objekt)

Teraz máš dva [podtrzene]rôzne[/podtrzene] objekty:
1. stara = Smartnames.onLogout
2. nova = Smartnames.onLogout=function(){alert("Změna SOURCE funkce")};

Sú to dva rôzne objekty - každý z nich má teda vlastný prototyp. Oba sú ale tvorené pomocou Function, takže preberajú aj jej vlastnosti.

Deje sa vlastne toto:

Function.prototype.spolocný_objekt = {}; 

// toto je viditelne pre všetky objekty vytvorené pomovou function xxx(...) {...},
// var xxx = function(...) {...}, alebo var xxx = new Function(... , ...);


var stara = onLogout = function() { /* toto je povodna fcia */ }
var nova = function() { /* toto druha fcia, teda druhy objekt */ }


[podtrzene]teraz platí:[/podtrzene]

stara.prototype != nova.prototype

// porovnavaju sa dva rozne objekty, rovnako ako keby si mal kod:
var a = new Object(), b = new Object(); // => a != b;
/* alebo este jednoduchsie: */ {} != {}

stara.spolocny_objekt === nova.spolocny_objekt
// tu sa porovnava ten isty objekt sám so sebou, rovnako ako keby si mal:
var a = new Object(); a === a;



BTW: Kôli takým zmrdom, ktorý vo svojich frameworkoch prepisujú a dopĺňajú zakladné objekty (Object, Array, Function, ..) získal javascript také zlé meno, aké má. Takéto "vylepšenia" skôr spôsobujú len problémy tým, čo sa pokúšajú nad ich frameworkom ničo dorobiť...

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
16. 7. 2007   #22
-
0
-

Pustil jsem si video - 15minutové zasvěcení do Firebugu od Joe Hewitta http://www.digitalmediaminute.com/screencast/firebug-js/
=> vynikající; akorát tam profiler vůbec nebyl (počítám že to byla starší verze).
Ještě jsem s Profilerem nedělal, ale bojím se, že stejně jako debugger mi s komprimovaným zdrojákem neposlouží
......
Zkusím se mrknout, jestli by se nedala stránka provozovat (eventualně s úpravou adresace v HTML kódu) jako lokální soubor, kde bych mohl použít rozbalený skript.
Ale moc tomu nevěřím, vzhledem k možnosti že budu donucen najít a přepsat nějakou adresu (nebo její sestavení) někde mezi 300.000 znaky JS kódu.
...... :-(
Bohužel, odesílá to POST request na local: file:///C:/JSexam/amapy/ajax.aspx?a=smartname
[Při správné funkci má proběhnout: POST http://amapy.atlas.cz/ajax.aspx?a=smartname (281ms) ]
Ale díky tomu, že jde použít rozbalený skript, tak budu po úpravě zdrojáku mít řádky s jednotlivými příkazy.
A to už je jiný kafe (debug, profile, popř. příkazy pro consoli vkládané přímo do skriptu)

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
17. 7. 2007   #23
-
0
-

Njn, to videjko je kapik staršie, ale fajn...

Jednoduchy princip toho "Profile":

Chceš napr. zistiť, čo sa deje na tejto stranke(fore), ked kliknes na [B] (tlacitko tucne pismo):
1. prepnes sa do Console, klikneš na Profile. Nabehne: "The profiler is running. Click 'Profile' again to see its report."
2. klikneš na tlačítko [B] na stránke, potom znova klikneš na profile (tým ho vypneš) V console sa ti objavi tabulka volaných funkcií, s počtami a časmi vykonávania a s poziciou, kde sú definované... ak klikneš , fcia sa ti zobrazí.

Problém je v tom, že to máš na jednom riadku... To firebug zatiaľ nevie riešiť. Odporúčam si kód prebehnúť s elfz.laacz.lv/beautify/, potom hľadať iba podľa názvu konkrétnu fciu a študovať kód...

Neviem ako tá stránka funguje, ale ak sa ten prihlasovací formulár vyvoláva nejakým kliknutím na nejaký objekt, tlačítko, onclick eventom, tak si môžeš funkciou "Inspect" ten objekt nájsť a uvidíš aspoň ten event a čo volá...

Nahlásit jako SPAM
IP: ...–
Prog.
Petr Fojtík0
Věrný člen
17. 7. 2007   #24
-
0
-

[podtrzene]Rád bych věděl jestli by jiný (=TVŮJ) texťak uspěl s korektním zvýrazněním syntaxe rozbaleného amap4.js.[/podtrzene]
[jak tak studuju kód skriptu a taky ho upravuju, aby byl čitelný.... zjistil jsem, že do konce zdrojáku zbývá 90kB úsek (z 293kB) textu a ten se v mém TextPADu již nezobrazí barevně zvýrazněnou JS syntaxí]
Domnívám se, že analyzátor tohoto editoru nezvládne matoucí reg.exp.literál v tomto místě.
Zde kód s tímto literálem (kursivu již vidím jednobarevně):

Element.extend({

isDescendantOf:
function(el){
var p=this;
while(p!=null){if(p==el||(p.className&&p.className.indexOf(el)!=-1)||(p.tagName&&p.tagName==el)){return true;}p=p.parentNode;}
return false;
},
fixPng:
function(path){
if(!window.ie6){return this;}
if(this.$tmp_pngFixed){return this;}
this.$tmp._pngFixed=true;
var _74a=this.getStyle("background-image");
if((!_74a||_74a=="none")&&!path){return this;}
if(_74a.match
(/^url[("']+(.*\.png)[)"']+$/i)||path){var s=RegExp.$1;var _74c=this.style;_74c.backgroundImage="none";if(path){s=path;}_74c.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+s+"',sizingMethod='image')";}return this;},setPngBg:function(src,_74e,_74f){if(!window.ie6){this.style.background="url("+src+") no-repeat 0 0";return this;}var _750=document.createElement("img");_750.src=src;var fix=(function(src,_753,_754,el){el.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"',sizingMethod='"+(_754||"image")+"')";_753.onload=null;}).pass([src,_750,_74e,this]);if(_750.complete){fix();}else{_750.onload=fix;}return this;},disableSelection:function(){if(window.ActiveXObject){this.onselectstart=function(){return false;};}this.style.MozUserSelect="none";return this;},addSpirit:function(){if(this.$tmp._sFx){return this;}this.$tmp._sFx=new Fx.Style(this,"opacity",{wait:false,duration:130});this.addEvents({"click":this.$tmp._sFx.set.pass(1,this.$tmp._sFx),"mouseover":this.$tmp._sFx.start.pass(0.65,this.$tmp._sFx),"mouseout":this.$tmp._sFx.start.pass(1,this.$tmp._sFx)});this.disableSelection();return this;},setCursor:function(c){switch(c){case"d":c="default";break;case"p":c="pointer";break;case"r":c="move";break;case"m":c="url(http://amapy.atlas.cz/api/gfx/handmove.cur),move";break;case"a":c="url(http://amapy.atlas.cz/api/gfx/handmoving.cur),move";break;}this.style.cursor=c;return this;}});


Nahlásit jako SPAM
IP: ...–
Petr Fojtík0
Věrný člen
17. 7. 2007   #25
-
0
-

My Great Free Online Beautifier for JavaScript => My Great Thanks To You.
Je to nádhera, tohle jsem potřeboval a hledal.Dík

Tohle onen chybující kód po zformátování Beautifierem:



Element.extend( {
isDescendantOf: function(el) {
var p = this;
while (p != null) {
if (p == el || (p.className && p.className.indexOf(el) !=- 1) || (p.tagName && p.tagName == el)) {
return true;
}
p = p.parentNode;
}
return false;
},
fixPng: function(path) {
if ( ! window.ie6) {
return this;
}
if (this.$tmp_pngFixed) {
return this;
}
this.$tmp._pngFixed = true;
var _74a = this.getStyle("background-image");
if (( ! _74a || _74a == "none") &&! path) {
return this;
}
if (_74a.match(/^url[("']+(.*\.png)[)"']+$/i) || path) {
var s = RegExp.$1;
var _74c = this.style;
_74c.backgroundImage = "none";
if (path) {
s = path;
}
_74c.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + s + "',sizingMethod='image')";
}
return this;
},
setPngBg: function(src, _74e, _74f) {
if ( ! window.ie6) {
this.style.background = "url(" + src + ") no-repeat 0 0";
return this;
}
var _750 = document.createElement("img");
_750.src = src;
var fix = (function(src, _753, _754, el) {
el.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='" + (_754 || "image") + "')";
_753.onload = null;
}).pass([src, _750, _74e, this]);
if (_750.complete) {
fix();
} else {
_750.onload = fix;
}
return this;
},
disableSelection: function() {
if (window.ActiveXObject) {
this.onselectstart = function() {
return false;
};
}
this.style.MozUserSelect = "none";
return this;
},
addSpirit: function() {
if (this.$tmp._sFx) {
return this;
}
this.$tmp._sFx = new Fx.Style(this, "opacity", {
wait: false,
duration: 130
});
this.addEvents( {
"click": this.$tmp._sFx.set.pass(1, this.$tmp._sFx),
"mouseover": this.$tmp._sFx.start.pass(0.65, this.$tmp._sFx),
"mouseout": this.$tmp._sFx.start.pass(1, this.$tmp._sFx)
});
this.disableSelection();
return this;
},
setCursor: function(c) {
switch(c) {
case "d": c = "default";
break;
case "p": c = "pointer";
break;
case "r": c = "move";
break;
case "m": c = "url(http://amapy.atlas.cz/api/gfx/handmove.cur),move";
break;
case "a": c = "url(http://amapy.atlas.cz/api/gfx/handmoving.cur),move";
break;
}
this.style.cursor = c;
return this;
}
});

V TextPADu sice stále jednobarevný ale podstatně čitelnější

Nahlásit jako SPAM
IP: ...–
Petr Fojtík0
Věrný člen
18. 7. 2007   #26
-
0
-

[podtrzene]Ještě jednou FUNKCE = OBJEKTY[/podtrzene]
Co se týče různých zápisů definice funkcí, ve většině případů použití se chovají totožně.
Ale je dobré vědět, že určité rozdíly existují, ty co znám jsem zahrnul do ukázky:

        a();  /* OK    */  

b1(); /* selže */
b2(); /* selže */
////////////////////////////////////////////////////////
/*A*/ function a(){
return;
}
/*B1*/ b1=function(){
return;
}
/*B2*/ var b2=function(){}
return;
}
////////////////////////////////////////////////////////
alert(a.toString()) //>> function a(){
//>> return;
//>> }
alert(b1.toString()) //>> function(){
//>> return;
//>> }
alert(b2.toString()) //>> function(){
//>> return;
//>> }
alert(a.toSource()) //>> function a(){return;}
alert(b1.toSource()) //>> (function(){return;})
alert(b2.toSource()) //>> (function(){return;})

/**** toString je implementačně závislá (např. v IE jsou zobrazeny i komentářové řádky) ****/
/**** toSource je implementačně závislá (v IE není definovaná) *****************************/

delete a; delete b1; delete b2;
a(); /* OK */
b1(); /* selže */
b2(); /* OK */
//--------------------------------------------------------------------------------------------------------------------------------------
// Můžeme literál funkce: function(){.....} nahradit objektem funkce:
// new Function(["arg1"...,] " .... ")
// Pak se ale vytvoří něco jako paralelní proces, který při každém volání funkce
// její tělo znovu kompiluje (proměnné v těle se vyhodnocují vždy v globálním oboru)
//--------------------------------------------------------------------------------------------------------------------------------------

S prototypovou dědičností problémy nemám, ale ze Crockfordovy přednášky o javascriptu http://video.yahoo.com/video/search?p=douglas+crockford+javascript+programming+language&x=0&y=0
(komplet .ppt prezentace: http://yuiblog.com/assets/crockford/javascript.zip) jsem zatím nepochopil nejjednodušší způsob dědičnosti tvorbou nového objektu slinkovaného se svým předchůdcem, ze kterého dědí vlastnosti jako by patřily jemu samotnému:

var mujStary={A:1;B:2}; var mujNovy=object(mujStary); mujNovy.B=22; mujNovy.C=33;..... Já ani neznám funkci object s malým o.

...........pardon ( stačilo sledovat dál až k části FUNKCE -> jedná se totiž o docela fíkaný výtvor páně Crockforda:
function object(o) { function F(){}; F.prototype=o; return new F() }

Nahlásit jako SPAM
IP: ...–
Petr Fojtík0
Věrný člen
19. 7. 2007   #27
-
0
-

Mám (doufám že poslední) prosbu - dokončil jsem kód:
Ten při volbě položky <VLASTNÍ BODY> v MENU provede přihlášení <= nejpraktičtější způsob.
[Kromě toho umožňuje autologin (po odhlášení) starým způsobem - tlačítkem Odeslat ve formuláři]

Zabuduje do metody Smartnames.init (která se spustí aktivací menu) volání přihlašovací metody:

Smartnames.onLogin=function(e){this.logininfo.innerHTML="";this.login("aska@tis.cz","psw");} 

Smartnames.inic0=Smartnames.init;
Smartnames.init=function(m){this.inic0(m);this.onLogin()}
Problém je že se osvědčený způsob (vložení jako řetězce do setTimeoutu) nedaří /jinak jsem zdráv/.
Nějaký návrh ?
................pardon, asi jsem ne dost pečlivě sestavil finální příkaz, který ale teď šlape jak má........
A navíc jsem tam zakomponoval funkci zavěšenou na události ONCLICK tlačítka PŘIHLÁSIT SE
=> postará se o přeskočení zobrazení formuláře a rovnou dělá LOGIN.
// -------------------------------------------------- //

// <AutoLogin> ^MENUitem OR ^Přihlásit <for AMAPY.CZ> //
// -------------------------------------------------- //
//
// ==UserScript==
// @name MAPY autologin
// @namespace tag:ikar1@quick.cz,2007-07-19:amapy_autologin
// @description Result:autofill form Algo: setTimeout($,3000) Modify: Smartnames.onLogin Smartnames.init
// @include http://amapy.atlas.cz
// @include http://amapy.atlas.cz/*
// @exclude http://amapy.atlas.cz/api
// @exclude http://amapy.atlas.cz/api/*

setTimeout(
"Smartnames.onLogin=function(e){this.logininfo.innerHTML=\"\"; this.login(\"aska@tis.cz\",\"psw\");};"
+"Smartnames.inic0=Smartnames.init; Smartnames.init=function(m){this.inic0(m); this.logintoggler.addEventListener(\"click\","
+"function(){Smartnames.skipForm()},false); Smartnames.skipForm=function(){if(!this.isAuthenticated){this.hideForms();this.onLogin();}};this.onLogin()}"
,3333)

Nahlásit jako SPAM
IP: ...–
Prog.0
Věrný člen
7. 8. 2007   #28
-
0
-

Sorry, bol som chvilu mimo, ...vidim ze si to zmakol s tym timeoutom. Ja by som to riesil cez ten unsafeWindow.
Kazdopadne gratulujem :-)

Nahlásit jako SPAM
IP: ...–
Prog.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý