() => { var items = Array.prototype.slice.call( document.querySelectorAll('*') ).map((element) => { var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); var rects = [...element.getClientRects()].filter(bb => { var center_x = bb.left + bb.width / 2; var center_y = bb.top + bb.height / 2; var elAtCenter = document.elementFromPoint(center_x, center_y); return elAtCenter === element || element.contains(elAtCenter) }).map(bb => { const rect = { left: Math.max(0, bb.left), top: Math.max(0, bb.top), right: Math.min(vw, bb.right), bottom: Math.min(vh, bb.bottom) }; return { ...rect, width: rect.right - rect.left, height: rect.bottom - rect.top } }); var area = rects.reduce((acc, rect) => acc + rect.width * rect.height, 0); return { element: element, include: window.getComputedStyle(element).cursor == "pointer", area, rects, text: element.textContent.trim().replace(/\s{2,}/g, ' '), }; }).filter(item => item.include && (item.area >= 20) ) items = items.filter(x => !items.some(y => x.element.contains(y.element) && !(x == y))) items.forEach(item => { item.element.classList.add('possible-clickable-element'); }); }