plugin development – Best way to add onclick function to all internal links using javascript

Question

As part of a plugin, I am looping all <a> link tags on a page and adding an onclick attribute.

But I only want to add the onclick attribute IF the link URL is on the same site… So I am using the siteurl option value as part of this detection. (Also, I I realize I could add a click event listener instead… I’m not sure if there is any advantage to that approach.)

Here is what I have so far (extracted and simplified to make it easier to read):

var siteurl="<?php echo get_option("siteurl"); ?>";
var ignoreclasses = [ 'external' ];

alinks = document.getElementsByTagName('a');
for (var i = 0; i < alinks.length; i++) {
    if ( !alinks[i].onclick && !alinks[i].getAttribute('onclick') && (alinks[i].href != '')
      && !alinks[i].getAttribute('target') && (alinks[i].href.indexOf('javascript:') !== 0) ) {
        skip = false;
        if (ignoreclasses.length) {
            for (i in ignoreclasses) {
                if (alinks[i].classList.contains(ignoreclasses[i])) {skip = true;}
            }
        }
        if (!skip) {
            external = is_link_external(alinks[i]);
            if (!external) {alinks[i].setAttribute('onclick', 'return my_function(this);');}
        }
    }
}

function is_link_external(el) {
    /* treat hash or query as internal */
    u = el.href; a="#"; b = '?';
    if ((u.indexOf(a) === 0) || (u.indexOf(b) === 0)) {return false;}

    /* check against site URL */
    if ((siteurl != '') && (u.indexOf(siteurl) === 0)) {return false;}

    /* check against host/protocol */
    if (el.host == window.location.host) {
        a = window.location.protocol+'//'+window.location.host;
        b = '//'+window.location.host;
        if ((u.indexOf(a) === 0) || (u.indexOf(b) === 0)) {return false;}
    }
    return true;
}

So that is what I have so far and it seems to be working well, my question is, am I missing anything? Are there any weird URLs that fall outside of this scope that I haven’t thought of? Or maybe there are other edge cases or some possibility that could trigger an error somewhere. I just want this code to be as robust as possible.

0
majick 2 months 2021-08-01T03:54:25-05:00 0 Answers 0 views 0

Leave an answer

Browse
Browse