Assuming that you only control a page holding a frame and you just want to check if any link inside that frame was clicked, you can listen for frame's load
event.
Obviously it's not 100% reliable. For starters, you don't know which link was clicked. It doesn't work for links to #hashes
(on the same page). Finally, you cannot distinguish between page reload and address change.
Unfortunately, without access to the frame, there's nothing more you can do.
If, on the other hand, you control both frame's page and a page holding that frame (but they're on different domains), you can gain full control, as long as you conform to Same-origin policy.
Example
Here's an over–complicated (for looks :D) example:
var frame = document.querySelector('iframe'),
indicator = document.querySelector('#frame-state'),
ignoreFirstLoad = true,
timeout = null;
frame.addEventListener('load', function() {
if (ignoreFirstLoad) {
ignoreFirstLoad = false;
return;
}
// some link was clicked or frame was reloaded
indicator.classList.add('loaded');
clearTimeout(timeout);
timeout = setTimeout(function() {
indicator.classList.remove('loaded');
}, 1000);
});
iframe {
width: 100%;
}
#frame-state {
opacity: 0;
transition: opacity 2s;
font-weight: bold;
}
#frame-state.loaded {
opacity: 1;
transition: opacity .2s;
}
<p>Click on any link inside the frame: <span id="frame-state">Loaded!</span></p>
<iframe src="https://en.m.wikipedia.org/"></iframe>