How to re-enable default action after preventDefault()? - javascript

I have an application where some actions are taking place on click event of buttons. Also, I want to append a query string on every in the app. For this, I have written a jquery code, which is as follows:-
window.addEventListener('click', function(event) {
event.preventDefault();
var href = event.target.getAttribute("href");
if(href && href.indexOf('http') !== -1) {
timezone = jstz.determine()
window.location.href = href + '?jstz=' + timezone.name();
}
else
{
// re-enable default;
}
}, false);
The code prevents the default action of every click event. Then checks if the event generator has href attribute. If it has href attribute, then it appends the current client timezone in the url.
The problem is, the above code prevents the click event of every clickable object.
How can I re-enable the default action?
Is there any way by which I can use event.preventDefault() for only anchor tags?

You can implement you logic with event listener on a jquery selector as:
$("#target").click(function(event) {
event.preventDefault();
var href = event.target.getAttribute("href");
// blah blah
});
This way, for this example, prevent default is called only if the element with id target is clicked.
For more on jquery selectors: https://www.w3schools.com/jquery/jquery_ref_selectors.asp

Related

Update Variable On Hashchange

I am trying to have a variable that always matches the hash of the URL on a single page site.
$(window).on('hashchange', function() {
var hashTag = window.location.hash;
$('#btn').click(function(){
console.log(hashTag)
});
});
Using the code above creates a list of all the past changes rather than the current hash.
hashTag.last();
This didn't work
That is because you are attaching button click event listener again and again. Please move your button event listener outside hashchange event, like below
var hashTag = "";
$(window).on('hashchange', function() {
hashTag = window.location.hash;
});
$('#btn').click(function(){
console.log(hashTag)
});
Now, there is permanent event listener attached to button which display value of hashTag variable. And on hashchange value of hashTag variable is updated.

how to change href during onclick event

I am trying to create a dynamic hyperlink that will download an image retrieved from the server.
The code I am using:
HTML:
<a class="btn" id="controlDownloadJPEG" download>Save & Download</a>
JS:
this.downloadJPEGClickHandler = function() {
CollageCore.downloadJPEG(function(data){
$("#controlDownloadJPEG").attr("href", "../file/fileStore.action?fileName=/" + data[0].AttachmentUrl);
});;
return true;
};
The href is getting changed on click, but the link itself is linking to the href set before my JavaScript executes. The first click does nothing as there is no default href and the second click will download what the first click should have downloaded.
I have seen suggestions to use JavaScript window.href instead of relying on the html tag itself. The reason I need to use the html tag is for its download functionality.
You are treating an asynchronous call as it it is synchronous. It is like ordering a delivery pizza and expecting it to be there as soon as you place the order. That does not happen unless you are standing in the restaurant and it is already been made.
You need to cancel the click and fire the page change manually when the call comes back. So you want to use window.location.href = "new path"; instead of setting the href.
this.downloadJPEGClickHandler = function() {
CollageCore.downloadJPEG(function(data){
window.location.href = "../file/fileStore.action?fileName=/" + data[0].AttachmentUrl;
});
return false; //or preventDefault if you pass in event object
};
If you are are attaching this activity to an onClick(event) handler you should be able to stop the redirect by passing in event.preventDefault();
cite: http://api.jquery.com/event.preventdefault/
Prevent the default click behavior, change the href attribute, and then imitate the click. Should work.
$( "a" ).click(function( event ) {
event.preventDefault();
$("#controlDownloadJPEG").attr("href", "../file/fileStore.action?fileName=/" + data[0].AttachmentUrl);
$(this).click();
});

Event click on href <a> tag [duplicate]

This question already has answers here:
How do I programmatically click a link with javascript?
(12 answers)
Closed 8 years ago.
I have a question about Javascript event here. I have an <a> tag like this:
<a id='aTag' href='http://example.com'>Click to redirect</a>
Then I call an event like:
<script>
$('#aTag').click();
//or
$('#aTag').trigger('click');
</script>
It does not redirect me to http://example.com. I tried to add an onClick() event in the <a> tag like this:
<a id='aTag' href='http://example.com' onclick='alert("Event happened");'>Click to redirect</a>
And then call the .click() event. It shows me alert("Event happened");
Can anyone show me how to call the .click() event correctly, or correct this redirect with issue with the href in that <a> tag?
In my business I just need an <a> tag, so not with the window.open or windown.location.
Explanation
Redirects can only happen if the user clicks directly on the link. Programmatic or deferred click triggers do not work.
An alternative would be:
to change directly the window.location
to open the link in a new tab/window
Changing window.location
window.location="http://wherever.you/want/to/g0";
or
window.location=$('a.selector').attr('href'); // to use a link's address
New tab/window
You cannot programmatically (click() or trigger) open new tabs/ windows or redirect. They get (ad-)blocked. automatically
So new tab/window openings always have to be triggered by user action. (Otherwise we'd always be full with popup ads)
So 1st of all, make sure that your js is executed on a user event, and then you should be able to use window.open.
JsFiddle example
html:
new tab google
<button class="user">user triggered</button>
<button class="programatic">programatic</button>
js:
$('a').on('click', function(e) {
console.log('clicked', e);
// unfortunately although we simulated
// the click on the <a/> , it will still
// not launch a new window - idk why.
// therefore we can use the line below
// to open the <a>'s href in a new tab/window
// NOTE: this will only occur if the execution was
// triggered by the user
window.open(e.currentTarget.href);
});
var simulateClick = function(origEv) {
var e = $.Event("click");
e.ctrlKey = true;
e.metaKey = true;
e.originalEvent = origEv;
$('a').trigger(e);
};
$('button.user').on('click', function(e) {
// this call will actually open a window
simulateClick(e);
});
$('button.programatic').on('click', function(e) {
// this will result in a blocked popup
$.get('/someurl').always(function() {
// executes the method after a non-user event
// results in blocked popup
simulateClick(e);
});
});
// this will result in a blocked popup
setTimeout(simulateClick, 1000);
Try this -
<a id="aTag" href="http://mylink.com" onclick="return doWork();">Click to redirect</a>
<script>
function doWork(){
//... do your works
return true; // then return true to redirect
}
</script>
Here is the fiddle - http://jsfiddle.net/gcJ73/
(Though the fiddle attributes are a little different to show you that it works)
or with jQuery:
//first assign the click handler
$('#aTag').click(function(){
//... do your work
return true;
});
//then call programmatically
$("#aTag").click(); or $("#aTag").trigger("click");
BTW programatically calling it will not redirect. Will just call the event handler, not redirect.
jQuery fiddle - http://jsfiddle.net/gcJ73/3/
Try:
<script>
jQuery('#aTag').click(function() {
// Your Code
});
</script>
jQuery('#aTag').click() does not execute the href attribute of an anchor tag so you will not be redirected, do:
$(document).ready(function() {
jQuery('#aTag').click( function (e) {
window.location.href = this.href;
});
});
<a id='aTag' href='http://mylink.com' onclick="location.href='http://mylink.com';">
Click to redirect
</a>
check this code snippet, also it will work like what you want to do.

Prevent Anchor navigate if inner Button click

I have a button like the below
If a user clicks on the phone number portion, I'd like one action to be called.
If a user clicks on any other part of the rest of the Anchor, they should navigate to a different page.
I've nested everything into an anchor element like so
<a id = "contact_button_outer" href = "http://example.com/linkedtopage">
<button id = "contact_button">
Get Started Now.
<span id = "call_sales_button" onclick = "call();">
Call 111-111-1111
</span>
</button>
</a>
The call function is defined as
function call(){
/*what it do*/
return false
}
I've also added z-indexes to both the anchor and the span, with the span having a higher index than the anchor.
If the user clicks on the phone number span, the default anchor action is still redirecting the browser to the linked page.
How would you prevent the default action from occurring in this instance?
Never use two or more nested Action Elements (a > button or vice-versa)
Use Event.preventDefault() to prevent the default browser action of following a href if some condition is met
Your condition should be "if a clicked element triggers a function, but has an Anchor parent - preventDefault()!"
const fn = {
call(evt) {
// Check if there's an Anchor element as parent
if (evt.target.closest("a")) evt.preventDefault(); // Do not follow parent link
// Call instead!
console.log("calling 111-111-1111")
}
};
document.querySelectorAll("[data-click]").forEach(EL => {
EL.addEventListener("click", (evt) => {
const fnName = evt.currentTarget.dataset.click; // "call"
if (fn[fnName]) fn[fnName](evt);
});
});
<a href="http://example.com/linkedtopage">
Get Started Now.
<b data-click="call">Call 111-111-1111</b>
</a>
PS: Preferably don't do that, wrap into links only the portions you want to be links, and the other ones create click handlers for JS.
Additional read:
Element.closest
Event.target
HTMLElement.dataset
return false inside call() will prevent default browser behaviour on span, but the event will still bubble to parent elements and actions on them is not cancelled. What you need to do is prevent the event from propagating to parent elements. You do this by doing something like this below
function call(event) {
event.stopPropagation(); // modern browsers (IE9 and above)
event.cancelBubble = true; // IE8
//do something
}
if nothing work, try
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();

How to get the link tag inside a div and append the onclick statement with 'return false' in javascript only

I forgot to add
return false;
to an onclick event on 78+pages and I don't want to edit 78 pages. I need to add it because Chrome moves the screen up and down when the link is clicked and its important that it doesn't. I haven't given the link that contains the onclick an id so I need to grab it, the only link, inside that div and amend it so it says
onclick="myFunction(); return false;"
NOT
onclick="myFunction();"
I have tried many things inc.
document.getElementById('shuffle-the-deck').getElementsByTagName('a').setAttribute( 'onClick', 'javascript: startShuffle(); return false;' );
I have to upload each change to test it and it's driving me nuts!
I would be grateful for help,
This will work for the first anchor (use a loop if you have more):
var anchor = document.getElementById('shuffle-the-deck').getElementsByTagName('a')[0];
anchor.onclick = function(e) {
e.preventDefault(); // prevents the browser from following the href
// just like "return false"
startShuffle();
}
On IE8 and older you have to set the returnValue property of the event object. So a more cross-browser approack would be:
var anchor = document.getElementById('shuffle-the-deck').getElementsByTagName('a')[0];
anchor.onclick = function(e) {
(e.preventDefault) ? e.preventDefault() : e.returnValue = false;
startShuffle();
}

Categories