I'm trying to run an ajax function when links are clicked, but I need to exclude links to anchors on the same page so I don't try to re-load in the page content when I'm simply scrolling down to a different part of the same page.
I know I can test if the href include a hash but that's not good enough:
if (href.indexOf("#") === -1)
Because I will have links that go to another page AND scroll to a local anchor. So I need to test if the href points to the current page AND includes a hash. And in that case I would exclude it from the function. But if it points to a different page and includes a hash it should still be included.
How can I achieve this with jQuery?
you just need to do this : $(document). ready(function () { $('#document_dropdown . notify').
In the content editor, highlight the text you want to hyperlink. In the rich text toolbar, click the linkd link icon. If the anchor you're linking to is on the same page as your link: In the pop-up box, click the Link to dropdown menu and select Anchor on this page.
An anchor tag, or anchor link, is a web page element that links to another location on the same page. They are typically used for long or text-heavy pages so that visitors can jump to a specific part of the page without having to scroll as much.
By comparing the hostname of the string URL to the hostname of the web page URL, you can determine whether the link is external or not.
/**
* Checks if the href belongs to the same page and returns the anchor if so.
*
* @param {String} href
* @returns {Boolean|String}
*/
function getSamePageAnchor (href) {
var link = document.createElement('a');
link.href = href;
/**
* For IE compatibility
* @see https://stackoverflow.com/a/24437713/1776901
*/
var linkCanonical = link.cloneNode(false);
if (
linkCanonical.protocol !== window.location.protocol ||
linkCanonical.host !== window.location.host ||
linkCanonical.pathname !== window.location.pathname ||
linkCanonical.search !== window.location.search
) {
return false;
}
return link.hash;
}
You do not need jQuery for this. Just use regex in Javascript.
if(/^#/.test(href)) { // .test() returns a boolean
/* do not run AJAX function */
} else {
/* run the AJAX function */
}
Explanation:
^#
is the regex. //
is where you wrap your regex in. ^
means at the beginning of the string and #
is what you are looking for. .test()
is a javascript function that executes the regex on a given string and return a boolean value.
Read up: RegExp.prototype.test()
- JavaScript | MDN
Update 1:
In case if the href
is not starting with a #
but it still points to the same webpage, your problem is reduced to checking if a string is a substring of another string. You can make use of window.location.href
and .indexOf()
to achieve this:
if(href.indexOf(window.location.href) > -1) {
/* do not run AJAX function */
} else {
/* run the AJAX function */
}
window.location.href
returns the URL of the webpage that you are on and href.indexOf(window.location.href)
checks if window.location.href
is substring of href
;
Example: https://www.example.com/page1
is a substring of https://www.example.com/page1#myDiv
Read up:
Window.location
- Web APIs | MDNString.prototype.indexOf()
- JavaScript | MDNUpdate 2:
Good find by @Tib. My code in update above was not checking if the hostnames are the same. I have fixed it below:
if(<hostnames are the same>) { // make use of window.location.hostname here to get hostname of current webpage
if(href.indexOf(window.location.href) > -1) {
/* do not run AJAX function */
} else {
/* run the AJAX function */
}
} else {
/* do not run AJAX function */
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With