Auto-time OK-button

32 views
Skip to first unread message

Rudy

unread,
Jun 30, 2011, 2:15:33 PM6/30/11
to greasemonkey-users
Dear forumusers,

As a beginning scripter I'd like some help with the following:

For a certain website I'm trying to develop a userscript that presses
the OK button when a page with the requirements is loaded.
This has to be 'timed', only 5 OK presses are allowed per second and
it takes about 2 seconds before each page is loaded.
The pages useually are opened in seperate tabs and triggerd after each
other.

Is this possible or shouldn't I even start thinking about this?
If it is possible, do you have any feed so I can try to figure this
one out?

Thank you!

.Rudy

LWChris@LyricWiki

unread,
Jun 30, 2011, 7:42:41 PM6/30/11
to greasemon...@googlegroups.com

Hi Rudy,
maybe you want this code as draft:

ClickOKButton = function () {
var Button = document.querySelector();
Button.click();
}
window.addEventListener("load",setTimeout(ClickOkButton,2000),false);

With this code, a timeout of 2 seconds will be triggered as soon as the
page is ready with loading. After the timeout, the function
"ClickOKButton" is called, which gets the button element as a variable
and simulates a click on it. For the explicit usage of querySelector,
setTimeout and EventListeners use Google or any site you prefer. It did
not sound like you wanted some ready-to-use script with a complete
explanation.

Also, read
http://wiki.greasespot.net/Avoid_Common_Pitfalls_in_Greasemonkey because
your script uses setTimeout which does not work the way it's commonly
used ;)

Chris

N. B.: This script sounds like something for Facebook and Co. If you
haven't already found it anyway, you may be interested in
userscripts.org, a huge online repository for userscripts. Maybe the one
you need is already there just waiting for you to install it within a
search and 3 clicks.

Rudy

unread,
Jul 1, 2011, 12:18:53 PM7/1/11
to greasemonkey-users
Dear Chris,

thank you so far.

If you could help me with the code it would be great.
I can't seem to figure out when it triggers, with what website or does
it always do it?

What I now use is a bookmark, which is the following code:

javascript:document.getElementsByName('submit')[0].click();

So what you basically say is that this should be in the clickOkButton
section and then the eventlistener?

Is it possible to only activate the script when a webpage includes
try=confirm?

I know.. a lot of questions but I couldn't really find it. Tried
google but all but the answers popped up.
I have no idea how much work it is, but if you could, can you set out
the code and explain why you use certain coding?

Thank you!

P.S. It is for a friend of mine who has RSI. This will help him to
skip the submit sections.

LWChris@LyricWiki

unread,
Jul 1, 2011, 3:24:41 PM7/1/11
to greasemon...@googlegroups.com
Am 01.07.2011 18:18, schrieb Rudy:
> Dear Chris,
>
> thank you so far.

You're always welcome.

> If you could help me with the code it would be great.
> I can't seem to figure out when it triggers, with what website or does
> it always do it?

The code I gave you is just the actual code. A userscript also contains
a specific section at the top, which contains the information that goes
with a userscript. When you decide to create a script, you'll get a form
to enter that information, and it'll be inserted into the header
correctly. See the next section for more detailed information.

> What I now use is a bookmark, which is the following code:
>
> javascript:document.getElementsByName('submit')[0].click();
>
> So what you basically say is that this should be in the clickOkButton
> section and then the eventlistener?

Absolutely :)

clickOKButton = function () {


document.getElementsByName('submit')[0].click();
}

window.addEventListener("load", setTimeout(clickOKButton, 2000), false);

should do the trick.

> Is it possible to only activate the script when a webpage includes
> try=confirm?

Yes it is. Userscripts are enabled for exact URLs or URL patterns. Best
you start with navigating to the site you want to create a script for.
Then, from the "Monkeymenu", select the entry "New Script". The above
mentioned form will appear and ask for a script name, a namespace (that
is something to group scripts together, you can set it once in the very
first form, Greasemonkey will then continue to use it for every new
script), and it'll also ask for the URLs to in- and exclude.

Basically, you just add each URL plaintext that you want the script to
be enabled on. A * stands for "anything" (or even nothing) within the
URL. To activate it a script on google.com and all country-derivations,
you can either add all the URLs, or simply use "http://www.google.*" as
rule. For more detailed information see the Greasemonkey Wiki at
wiki.greasespot.net.

Your rule would be something like *try=confirm* then, I guess? But pay
attention to that the wildcards also mean the script is enabled for
"...nexttry=confirmation..." and so on. Automatically click on a
submit-button might be dangerous, so if you can narrow the set of
matching URLs with more attributes (for example the domain name), I'd
recommend to do it.

> I know.. a lot of questions but I couldn't really find it. Tried
> google but all but the answers popped up.
> I have no idea how much work it is, but if you could, can you set out
> the code and explain why you use certain coding?

Of course. I wasn't quite sure how detailed you wanted it. Sometimes
some people just want hints which keywords they should Google for
because they only understand and learn if they find out themselves how
things work. Okay, let's start from the beginning.

We first set up a function to perform the action. I assume you've got at
least that little experience already to know that a function is
basically like a group of commands, that can be accessed with the
function name, plus maybe parameters and / or a return value. I needn't
explain that to the full extend, I think.

The code for the function is already available, and basically does
nothing then selecting all elements with the name attribute value
"submit", pick the first of it (in JS, any index starts with 0) and
simulate a click on it. You may be used to define a function like
"function ClickOKButton () {". This doesn't work for Greasemonkey if you
use eventListeners or timeouts, but explaining why it does not goes very
deeply into the complicated areas of programming and object modelling
and stuff. I think that's too complex to explain, so basically just do
as I posted and it'll work. ;)

The really interesting point is the last line. Let's start with basics,
"event listeners" in common.

As the name suggests, event listeners "listen" to events. Opposed to,
say, the onClick="..." in an input tag, you can't see that anywhere in
the code except where the listener is defined. Basically, nearly every
tag can have one or more listeners (to cut it short). But what are those
"events" anyway that the listeners detect?
Events can be any interaction with the page by the mouse or the
keyboard, for example a click or a double-click, mouse movements, and
there's one for keypress, one for keydown and keyup, and so on. But
there are also some events that are "fired" (this is the term for the
browser broadcasting "hey, event so-and-so occurred") from within the
page, like when the page is readily loaded or when an error occurs.

Your script needs the content to be loaded beforehand, which is why we
use the "Load" event, that is fired as soon as the content completely
ready and visible for the user from the primary entered code (there
might be some scripts that later change the code, but that doesn't count
for the "load" event). Just assume "the load event is fired as soon as
the browser is ready with processing the code on the page". Event
listeners are added and removed from the elements by the function
"addEventListener" and "removeEventListener". While we needn't really
remove the load listener as that event is fired only once anyway, I'll
focus on the "add" here.

The function expects three parameters: the name of the event, which is
"load" in this case; next the function to call when the event was fired
and "heard" (to stay in terms of listening); and last a boolean. Again,
the boolean has to be set but is only relevant for advanced scripters.
Usually, both false and true will have the same result for the "load"
event anyway. If you're really interested in the stuff, I recommend to
keep in mind the keywords "capturing" and "bubbling", and to read
http://www.quirksmode.org/js/events_order.html to see what the boolean
is for.

Okay, now that we've got that clear, (y)our script is almost ready.
We've got the function with the code in it, and decided to call it when
the window says "I'm ready with loading". Now, it'd call the function
directly. You said you want to wait two seconds, so we delay the
execution of our ClickOKButton function with setTimeout, set to a delay
of 2000 milliseconds, the desired two seconds.

By the way, I assume those two seconds were meant to be the "wait until
the page is loaded to be sure the button the script tries to click on
will already exist". Now that we use our event listener, we can maybe
omit the timeout, because the event isn't fired unless the button is
available for the code. If the page takes 5 seconds to load, the script
will be executed after 5 seconds, if the page takes 0.5 seconds to load,
... I think you get the point.

However, as explained above, the script might unintentionally be
executed for pages that don't have any submit button at all, maybe. As
it's a single command function, it doesn't matter if the execution of
that command fails and the function is thereby aborted at that command.
But if there were more commands behind the click, you should wrap the
click command in an if conditional to catch the case that
"document.getElementsByName("submit")[0]" does not match any element,
therefore is undefined and therefore does not have any sub-function
".click()".

if (document.getElementsByName("submit")[0]) {

document.getElementsByName("submit")[0].click() };

I don't like it that way though, because that'll make the code search
all matching elements twice. Imagine you've got thousands of
name="submit" elements, you'd create the list two times. That's why I
put the result of the getElements... into a variable and work with that
variable from then on:

var Button = document.getElementsByName("submit")[0];
if (Button) { Button.click() };

Don't be afraid of using many variables within a function. They are only
kept temporarily for that single call until the function is done. Then,
they are deleted again.

> Thank you!
>
> P.S. It is for a friend of mine who has RSI. This will help him to
> skip the submit sections.

I hope I could help you. I know this is a mailing list, so I know that
many people with more knowledge than I have might read this. Maybe, I
didn't explain anything 100% correctly, and maybe I used a term do
describe something although that term usually describes something
different. I hope nobody minds that, I am no native speaker, so I have
to translate my knowledge (luckily I don't have to use Google Translate
for it, that wouldn't be understandable at all for such topics I guess).

Let me know if you've got further questions. Feel free to ask, also
directly instead of via mailing list, if you want to. It's always a
balancing act to decide between "annoys readers with another
mailing-list-mail" and "it might be helpful for someone who later reads
the thread and has the same problem". I do not mind how you decide to
answer.

Good luck with your first script.

Chris


Reply all
Reply to author
Forward
0 new messages