07. september 2004 - 12:28Der 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?
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 !-)
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 :)
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 !-)
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.
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 :) .. ?
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 !-)
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.
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)
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?
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.
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
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.
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
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 :)
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 :)
... 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 & CSS [BookMarklet]</a>
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
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 :)
... 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
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 :) )
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:
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 & CSS [BookMarklet]</a>
... og så er det slut med BookMarklets for idag! :D
Synes godt om
Ny brugerNybegynder
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.