views:

285

answers:

6

To prevent impatient users from clicking on a link to a webstart application too often, I tried to disable the hyperlink for some seconds after it has been called the first time.

<a href="file.jnlp" onclick="if (!this.clicked){this.clicked = true; setTimeout('this.clicked = false' ,10000); return true;} return false">

The code above only works for disabling the link, but it doesn't get re-enabled after the timeout of 10 seconds.

I've seen that the 'this.clicked' variable isn't true (as it is supposed to be) when I check it in the setTimeout call. Maybe i'm missing some basic JS-knowledge here..

Or perhaps there is a different approach to solve this problem?

+1  A: 

give this anchor an ID and then change your timeout call to:

setTimeout('document.getElementById("<id>").clicked = false;' , 10000);

I think the 'this' is not evaluated to anything when the timer comes around.

Peter Perháč
+1  A: 

using your code modifying only a small part it may work

<a href="file.jnlp" onclick="if (!this.clicked){this.clicked = true; setTimeout(function(){this.clicked = false;} ,10000); return true;} return false">

looks like people say that didnt work and it didnt form a closure around 'this'

John Boker
yeah, nice too :) basically the problem was with the 'this' being a string. this way it's actually an object
Peter Perháč
Note though that 'this' when using inside the function invoked by setTimeout will be the window (the global object) not the anchor element its intended to be.
AnthonyWJones
didn't work. the 'this' seems to be the problem, as MasterPeter assumed
räph
+1  A: 

var a=this;setTimeout(function(){a.clicked = false} ,10000);

Chad Grant
+1. That'll do it but the attribute content is getting overly complex especially since it could be formulated as a re-usable function for use on other links
AnthonyWJones
yeah, lot of stuff going on in that attribute
Chad Grant
+1  A: 

First add a this function to a Javascript Script block

function Debounce()
{

    var self = this
    if (this.clicked) return false;

    this.clicked = true;
    setTimeout(function() {self.clicked = false;}, 10000);

    return true;
}

Now change your onclick to:-

onclick="return Debounce.call(this)"
AnthonyWJones
A: 

The this object is not defined in the code being evaluated by setTimeout which is done in the global scope.

Give the link an ID then use getElementById e.g.

<a href="file.jnlp" id='my_link' onclick="if(!this.clicked){this.clicked = true; setTimeout('document.getElementById("my_link").clicked = false;' ,10000); return true;} return false;">
partoa
A: 

while im refreshing the web page the link is working even the time's not completed