Avatar billede dennismp Nybegynder
07. september 2004 - 12:28 Der er 31 kommentarer og
1 løsning

Bookmarklets; Clientside ændring af onSubmit()

Beklager den dårlige overskrift. Men jeg vil gerne lave en bookmarklet, som går ind og retter på de forms der er på den aktuelle side, således at der bliver lavet en "onSubmit"-event der laver nogle forskellige ting og derefter kalder den oprindelig onSubmit-kode (hvis der er nogen).

Selve koderiet tager jeg som en udfordring, men kan jeg godt "ændre" på en form - efter browseren har modtaget html-koden; Altså tilføje (og læse) onSubmit ? Har du evt et eksempel?
Avatar billede roenving Novice
07. september 2004 - 12:44 #1
Jeg har dårlige erfaringer med mine forsøg med det, så jeg ville simpelthen lave en generisk funktion, og altid afvikle den før den egentlige submit-handler !-)

altså f.eks.

<form ... onsubmit="minBookmarkFunktion();return validate(this);">

-- og så i minBookmarkFunktion() gøre noget eller ikke gøre noget afhængig af forskellige parametre !o]
Avatar billede dennismp Nybegynder
07. september 2004 - 13:06 #2
Det kan jeg ikke, da ideen var at den skulle udføres på andre sider, end min egen. Det skulle være en hjælper til mig selv.  Men det kan godt være at javascript som udgangspunkt til dette, er en skidt ting. Det er det nok - også når man tænker på mit "niveau" indenfor javascripting :)
Avatar billede roenving Novice
07. september 2004 - 13:22 #3
Altså, javascript kan jo som udgangspunkt ikke udføre andet overfor andre sider, end at smide http-requests til serveren, og evt. sende dem i andre rammer ...

-- så hvad det lige er du vil ?-)

-- f.eks. at ændre urlen i action på formen vil jo kunne bruges ganske aktivt af et serverside script !-)
Avatar billede dennismp Nybegynder
07. september 2004 - 13:55 #4
Fx.

Jeg går ind på amazon.com og skal betale. Istedet for at indtaste mit visakortnummer; så taster jeg @VISA. Min custom onSubmit sørger så for at erstatte @VISA med mit visakortnummer.

Og i samme stil med password.
Avatar billede roenving Novice
07. september 2004 - 14:04 #5
Du kan _ikke_ scripte mod sider fra andre domæner !o]

-- og slet ikke mod betalingssider, som forhåbentlig kører med en SSL-forbindelse (https://-protokollen !-)
Avatar billede dennismp Nybegynder
07. september 2004 - 14:27 #6
Jeg er ikke helt sikker på du forstå hvad jeg vil. Jeg "bryder" jo ikke ind på andre domæner - så SSL'en gør jo hverken fra eller til. Jeg vil bare have noget javascript i min browser, som kan hjælpe mig med at udfylde forms. Der findes jo mange andre bookmarklets, der fx. henter links, finder tekst, etc. Så burde det jo være snildt at lave een der retter "lidt" i formen.

Det er i stil med disse http://www.bookmarklets.com/tools/categor.html jeg forestiller at man kan. Hvis man kan ændre på tekstfarven vha javascript - så burde det jo ikke være så svært at ændre i en form :) .. ?

Men ok - det kunne være jeg skulle droppe det. :)
Avatar billede roenving Novice
07. september 2004 - 14:34 #7
Du kan stadig _ikke_ scripte ind i andre sider, ikke engang ændre farver osv. !-)

-- og alle de scripts, som ligger på den pågældende side, ligger jo netop på samme side, som de arbejder imod ...
Avatar billede dennismp Nybegynder
07. september 2004 - 18:12 #8
Ligger på samme side? De er da i ens bookmarks, hvor de så går ind og "justerer" på det html man ser på.. Netop det jeg gerne vil.

Jeg tror altså jeg ikke har forklaret mig godt nok. :-\

1) Jeg åbner en side
2) jeg taster noget ind
3) jeg trykker på en bookmarklet - som så behandler siden

Om den bookmarklet går ind og farver noget grimt, eller om den læser værdier fra en form, er vel princippet det samme der sker?

Det burde da være muligt. Altså borset fra, at det måske ikke er ligetil.
Avatar billede roenving Novice
07. september 2004 - 18:16 #9
Cross-domain-scripting er 'no-no' på grund af alle de manipulationer, man kan komme til at lave med det bagved-liggende datagrundlag, så det er bare umuligt, at lave noget javascript, som arbejder på andre sider, hvis de ligger på andre domæner, hvilket de jo under alle omstændigheder vil gøre, hvis du arbejder fra domænet: File:///C !-)
Avatar billede dennismp Nybegynder
07. september 2004 - 18:22 #10
Det er jeg klar over..

Har du nogensinde brugt en bookmarklet? Det virker og bliver tit brugt med blogs (marker noget på en side, tryk på bookmark (som er et javascript, deraf bookmarklet) som så submitter til fx ens egen side) .. Det er ikke XSS - da der kun er et domæne involveret.
Avatar billede olebole Juniormester
07. september 2004 - 18:34 #11
<ole>

Jes >> Du er på dybt vand  ;o)
Prøv at gå ind på Google - slet teksten i din adresselinie og skriv i stedet:
  java script:document.body.innerHTML+="Se,%20det%20virker%20zq%20...!%20%20;o)"

Klask et gigtsvagt forben ned på Return-tasten og se, hvad der sker i bunden af siden  :)

dennismp >> Jeg har lavet masser af små bookmarlet-værktøjer ... jeg kan godt lige prøve at se på dit problem  ;o)

/mvh
</bole>
Avatar billede dennismp Nybegynder
07. september 2004 - 18:47 #12
ole; det må du gerne. Men en reference eller et lille eksempel er rigeligt :)
Avatar billede olebole Juniormester
07. september 2004 - 19:03 #13
Umiddelbart kan jeg ikke få onsubmit-handleren til at responere som forventet. Laver du denne form i et HTML-doc:

<form action="">
    <input type="text" name="q">
    <button type="submit">TEST</button>
</form>

... og skriver dette i adresselinien:

  java script:document.forms[0].setAttribute("action","http://www.google.dk/search");

efterfulgt af et tryk på Return, vil du helt som forventet søge på Google - men onsubmit-handleren driller  :o|
Avatar billede dennismp Nybegynder
07. september 2004 - 19:08 #14
Kunne man så ikke:
1) Gemme action-linket i et andet hidden element
2) Overskrive action med javascript som laver det jeg gerne vil have haft i "onsubmit" og så afslutningsvis submitter til den rigtige action?
Avatar billede dennismp Nybegynder
07. september 2004 - 19:08 #15
Jeg tror jeg er ved at komme ud på dybt vand her :)
Avatar billede olebole Juniormester
07. september 2004 - 19:12 #16
*LoooL* nu bliver du sjov ... det må jeg lige kikke på  ;D

Foreløbig har jeg prøvet:

<form action="" onsubmit="alert('Oprindelig handler')">
    <input type="text" name="q">
    <button type="submit">TEST</button>
</form>

<button onclick="alert(document.forms[0].onsubmit)">Check handler</button>

Og så denne linie i adresselinien:
  java script:document.forms[0].setAttribute("onsubmit","function(){alert('Ny handler')}");

Den kan du lege lidt med i mellemtiden - men den funker ikke efter hensigten. Jeg checker lige dit (vilde) forslag  ;o)
Avatar billede dennismp Nybegynder
07. september 2004 - 19:51 #17
Det vil jeg gøre.

Med mindre du selv syntes det er sjovt, så behøver du ikke. Du har sparket mig lidt igang - så det kan være jeg (med tiden) finder frem til en løsning :). Så du er velkommen til at smide et svar.
Avatar billede olebole Juniormester
07. september 2004 - 21:21 #18
Jamen, umulige, 'sindsyge' projekter er altid sjove ... undskyld udtrykket, men jeg tror, du forstår, hvad jeg mener  ;o)

Nu fik jeg tid til at teste - og nej, du kan ikke afvikle JavaScript-pseudo-protokollen i action-attributten på en form  :o|
Du kan godt skrive:
  java script:var e,d=document,f=d.forms[0];e=d.createElement("INPUT");e.type="text";f.appendChild(e);e.value=f.action;e.Name="hid";void(0);

Det opretter et nyt felt i formen (af typen 'text', men det kan du jo bare lave om til 'hidden'). Feltet hedder 'hid' og får tildelt formens action som værdi. Det hjælper dog ikke meget, da du som sagt ikke kan afvikle JavaScript i action-attributten ... men det kan måske give yderligere inspiration  :)

Du kan måske indskrive en knap med et JS i onclick-handler'en. Dette JS kan så gøre ved formen, hvad du ønsker. Det tror jeg er en mere farbar vej at gå, end at bruge onsubmit-event'en.

Lige en ting, du skal være opmærksom på: Der er en forholdsvis lav grænse for, hvor lang din JS-streng (i adresselinien) kan være. Jeg huker ikke, hvor loftet ligger - blot at jeg til stor forbløffelse er stødt mod det et par gange ... det er længe siden, jeg sidst rodede med at skrive bookmarlets, selvom jeg meget ofte bruger dem, jeg har  :)
/mvh
Avatar billede dennismp Nybegynder
07. september 2004 - 21:56 #19
Joe - jeg kan godt følge dig :) Når en opgave starter med "kan det" og bliver til "det skal kunne lade sig gøre" :-)

Så vidt jeg ved så har Firefox en højere grænse end IE - men det er ihvertfald noget jeg skal lege med :) Jeg siger mange tak for din hjælp og input. Nu har jeg lidt at arbejde med.
Avatar billede olebole Juniormester
07. september 2004 - 21:57 #20
Hvis du har en form med et felt med navnet 'q' (det kunne f.eks. være Google), kan du prøve:
  java script:var d=document;d.body.innerHTML+="<button onclick='var d=document,f=d.forms[0];alert(f.q.value)'>A</button>";void(0)

Læg mærke til, at jeg definerer variablen 'd' to gange. Det er ikke en fejl  :)
Første gang er det af hensyn til det script, der skal indskrive knappen på siden - anden gang er det af hensyn til det script, knappen skal afvikle ... det gælder om at holde tungen lige i bukserne, når man roder med det her  ;o)

Du kunne også vælge at nøjes med at indskrive:
  <b onclick='...blablabla...'>A</b>

hvilket sparer dig for 10 tegn - og det gælder _virkelig_ om at komprimere sit script, når det skal bruges som bookmarklet.

F.eks. kan du poppe et vindue op og skrive strengen 't' ud i det med:
  with(open('','','width=600,height=300,scrollbars,resizable').document){write(t);close()};

hvilket er 20 tegn kortere end:
  var w,d;w=open('','','width=600,height=300,scrollbars,resizable');d=w.document;d.open();d,write(t);d.close();

Det er en ofte brugt funktion, hvis man f.eks. ønsker at liste en bestemt sides billeder, links, el.lign.
/mvh
Avatar billede dennismp Nybegynder
07. september 2004 - 22:12 #21
Ah smart :). Man får jo lyst til at få sat sig (ordentlig) ind i javascript - så jeg kan komme igang med nogle bookmarklets. Og evt se på de der findes på bookmarklets.com - der er garanteret mange fif at hente :)
Avatar billede olebole Juniormester
07. september 2004 - 22:20 #22
Du kan få denne her, jeg har liggende i mine favoritter:

<a href="java script:t='<div%20align=\'center\'>';i=document.images;for(x=0;x<i.length;x++){if(i[x].src&&t.indexOf(i[x].src)==-1)t+='<div%20style=\'padding:5px;margin:2px;border:1px%20red%20solid;\'><img%20src=\''+i[x].src+'\'><br><a%20href=\''+i[x].src+'\'>'+i[x].src+'</a></div><br>';}t+='</div>';with(open('','','width=600,height=300,scrollbars,resizable').document){write(t);close();}">Get Images [BookMarklet]</a>

Kopier dette link over på en HTML-side og kast siden i en browser.
Højre-klik på linket og vælg 'Føj til Foretrukne'. Du vil få en advarsel, da der er tale om et script ... bare vælg 'OK'  ;o)

Gå så tilbage til siden her og vælg 'Get Images [BookMarklet]' i dine foretrukne og se, hvad der sker ... ganske anvendeligt  :)
Avatar billede dennismp Nybegynder
07. september 2004 - 22:24 #23
Nice. Der går lige et par timer, før jeg når det niveau :-D
Avatar billede olebole Juniormester
07. september 2004 - 22:35 #24
... så kan du da også lige nappe denne (jeg piller dem ud af min egen browser og laver links. Derved opstår der lidt af et gåseøje-helvede, der lige tager lidt tid at rette til ... hehe). Denne her er uvurderlig, når man roder med web-kodning ... og ikke mindst, når man hjælper på Eksperten.
Den lister alle remote JavaScript- og CSS-filer, der er brugt på en given side. Der er et link til hver fil - og som min Homesite er sat op, kan jeg blot vælge 'Open' i boksen, der kommer, når jeg klikker på et link - så åbner filen i HS ... dét er fedt  ;o)

<a href="java script:d=document;t='';c=d.styleSheets;for(a=0;a<c.length;a++){if(x=c[a].href)t+='<a%20href=\''+x+'\'>'+x+'</a><br>';i=c[a].imports;for(b=0;(i&&b<i.length);b++){if(y=i[b].href)t+='<a%20href=\''+y+'\'>'+y+'</a><br>';}}j=d.getElementsByTagName('script');for(c=0;c<j.length;c++){if(z=j[c].src)t+='<a%20href=\''+z+'\'>'+z+'</a><br>';}with(open('','','width=600,height=300,scrollbars,resizable').document){write(t);close();}">Get JS &amp; CSS [BookMarklet]</a>
Avatar billede olebole Juniormester
07. september 2004 - 22:38 #25
roenving >> Hvis du stadig 'lister rundt i krogene' af dette spørgsmål og ikke kender til bookmarklets, skulle du tage og checke den sidste ud ... den vil du uden tvivl kunne lide  ;o)
/mvh
Avatar billede dennismp Nybegynder
07. september 2004 - 22:40 #26
Tak.

Jeg kan så sige at den første virker næsten i opera (men viser ikke billedet, kun linket). Den anden virker slet ikke i opera. Begge virker fint i Firefox (hvis du kan bruge det til noget :) ).

Men jeg regner med at skifte helt til firefox så det er ikke noget problem. Men nu fik du da lidt feedback :)
Avatar billede olebole Juniormester
07. september 2004 - 22:50 #27
... og uden JS-debugger i Opera, tager det som vanligt en krig at finde det, den ikke kan lide.
Jeg ville fa'me gerne have kløerne i den tumpe, der viste de methanol-forgiftede nordmænd den første computer...!  *ROTFL*  :D
Avatar billede dennismp Nybegynder
07. september 2004 - 23:03 #28
Den har da en Javascript console der giver en fejl? (Altså, når den så ikke crasher. Det og så at den ikke klarer rss-opdateringen særligt godt (alt andet fryser imens den er igang) - gør at jeg nok skifter, når jeg har fået konverteret mine bookmarks(lets :) )
Avatar billede olebole Juniormester
07. september 2004 - 23:12 #29
Opera kender ikke 'document.styleSheets', så der ligger fejlen i den. Billed-sjoveren skal skrives en anelse om i slutningen, så kører den også i Opera:

<a href="java script:t='<div%20align=\'center\'>';i=document.images;for(x=0;x<i.length;x++){if(i[x].src&&t.indexOf(i[x].src)==-1)t+='<div%20style=\'padding:5px;margin:2px;border:1px%20red%20solid;\'><img%20src=\''+i[x].src+'\'><br><a%20href=\''+i[x].src+'\'>'+i[x].src+'</a></div><br>';}t+='</div>';with(open('','','width=600,height=300,scrollbars,resizable').document){write(unescape(t));close();}">Get Images [BookMarklet]</a>
Avatar billede olebole Juniormester
07. september 2004 - 23:15 #30
Denne kan trække JS-filer ud, men ikke CSS-filer ... til gengæld virker den så i Opera:

<a href="java script:d=document;t='';j=d.getElementsByTagName('script');for(c=0;c<j.length;c++){if(z=j[c].src)t+='<a%20href=\''+z+'\'>'+z+'</a><br>';}with(open('','','width=600,height=300,scrollbars,resizable').document){write(unescape(t));close();}">Get JS &amp; CSS [BookMarklet]</a>
Avatar billede dennismp Nybegynder
07. september 2004 - 23:15 #31
Det var sådanset derfor jeg droppede javascript i sin tid. De dersens små forskelle. Det kan jeg ikke klare :)

Men jeg tror det er blevet meget bedre iløbet af de sidste par år. (uhada, det er vel 4 år siden jeg prøvede :) )
Avatar billede olebole Juniormester
07. september 2004 - 23:43 #32
Ja, det bliver bedre og bedre  :)
Denne her suger både JS- og CSS-filer i ... også i Opera:

<a href="java script:d=document;t='';c=d.getElementsByTagName('LINK');for(a=0;a<c.length;a++){x=c[a].href;if(x!=''&&c[a].rel.toLowerCase()=='stylesheet')t+='<a%20href=\''+x+'\'>'+x+'</a><br>';}j=d.getElementsByTagName('script');for(c=0;c<j.length;c++){if(z=j[c].src)t+='<a%20href=\''+z+'\'>'+z+'</a><br>';}with(open('','','width=600,height=300,scrollbars,resizable').document){write(unescape(t));close();}">Get JS &amp; CSS [BookMarklet]</a>

... og så er det slut med BookMarklets for idag!  :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester