Решение не кажется мне простым, поскольку вы не знаете ни класса, ни уникального идентификатора для всех визуальных кнопок ...
Поэтому я предложу один из способов сделать это.
Сначала добавьте глобальный список событий щелчка на document
, чтобы вы могли отслеживать все щелчки и просто выбирать то, что вы хотите.
Что-то вроде этого, простой способ увидеть, что вы нажимаете. (может быть, вы можете найти решение именно по этому поводу)
document.addEventListener("click", function(event) {
const elementType = event.target.tagName;
console.log(elementType + ' clicked!');
});
<div>Test1</div>
<span>Test2</span><br>
<button>Test3</button><br>
<a>Test4</a><br>
<button>Test5</button><br>
<div>
<button>Test6</button>
</div>
<p>Test7</p>
Тогда вам придется каким-то образом внести в белый список, что такое кнопка (поскольку вы не можете взять только теги)
Так что для этого я подумал о создании массива или карты (если возможно) из XPaths и проверки соответствия совпадающего элемента с вашим белым списком. Только тогда вы получите текст.
Примечание: XPath - это уникальный путь узла в DOM. Это также означает, что вам нужно знать все XPath-ы ваших кнопок.
Обычно XPath не являются легкими с точки зрения производительности, но если вы запускаете только по щелчку и находите оптимизированное решение, все должно быть в порядке ...
Вот пример того, о чем я говорю:
// Using object for performance reasons.
const ACCEPTED_XPATHS = {
'/html/body/button[1]': 1,
'/html/body/button[2]': 1,
'/html/body/div[2]/button': 1,
'/html/body/div[3]/div/span': 1
}
document.addEventListener("click", function(event) {
const element = event.target;
const elementXPath = xpath(element);
// You can use this to collect your accepted list:
console.log('CLICKED PATH = ' + elementXPath);
if (ACCEPTED_XPATHS[elementXPath]) {
console.log('BUTTON CLICKED --- Button Text: ' + element.innerHTML);
}
});
// https://gist.github.com/iimos/e9e96f036a3c174d0bf4
function xpath(el) {
if (typeof el == "string") return document.evaluate(el, document, null, 0, null)
if (!el || el.nodeType != 1) return ''
if (el.id) return "//*[@id='" + el.id + "']"
var sames = [].filter.call(el.parentNode.children, function (x) { return x.tagName == el.tagName })
return xpath(el.parentNode) + '/' + el.tagName.toLowerCase() + (sames.length > 1 ? '['+([].indexOf.call(sames, el)+1)+']' : '')
}
<div>Test1</div>
<span>Test2</span><br>
<button>Test3</button><br>
<a>Test4</a><br>
<button>Test5</button><br>
<div>
<button>Test6</button>
</div>
<p>Test7</p>
<div>
<div>
<span>THIS IS ALSO A BUTTON</span>
</div>
</div>
У меня сейчас нет лучшей идеи, надеюсь, это поможет:)