Расширение Google Chrome: выделите div, над которым курсирует мышь
Я новичок в расширениях Google Chrome и пытаюсь написать расширение, которое выделяет div
при наведении курсора. Если есть div
внутри другого div
и внутренней div
наведен, я хотел бы подчеркнуть внутренний div
только.
У меня работают некоторые образцы, но я не уверен, как поймать событие при наведении.
Ответы
Ответ 1
В HTML каждое событие мыши имеет доступ к базовому элементу. Вы можете легко это сделать с помощью JavaScript, и в HTML5 есть хорошая функция, называемая classList (благодаря Erik от Chromium), которая позволяет вам легко добавлять и удалять классы из DOM.
Прежде всего, это можно сделать с помощью Google Chrome Скрипты содержимого. Алгоритм довольно прост, вы сохраняете указатель на последний посещенный DOM, и вы просто добавляете/удаляете класс при посещении другого элемента DIV.
В рамках manifest.json Мы будем определять инъекции CSS и JS на каждую страницу, которую мы видим.
...
...
"content_scripts": [
{
"matches": ["http://*/*"],
"css": ["core.css"],
"js": ["core.js"],
"run_at": "document_end",
"all_frames": true
}
]
...
...
Теперь рассмотрим наш core.js. Я включил некоторые комментарии, чтобы объяснить, что происходит:
// Unique ID for the className.
var MOUSE_VISITED_CLASSNAME = 'crx_mouse_visited';
// Previous dom, that we want to track, so we can remove the previous styling.
var prevDOM = null;
// Mouse listener for any move event on the current document.
document.addEventListener('mousemove', function (e) {
var srcElement = e.srcElement;
// Lets check if our underlying element is a DIV.
if (srcElement.nodeName == 'DIV') {
// For NPE checking, we check safely. We need to remove the class name
// Since we will be styling the new one after.
if (prevDOM != null) {
prevDOM.classList.remove(MOUSE_VISITED_CLASSNAME);
}
// Add a visited class name to the element. So we can style it.
srcElement.classList.add(MOUSE_VISITED_CLASSNAME);
// The current element is now the previous. So we can remove the class
// during the next iteration.
prevDOM = srcElement;
}
}, false);
Теперь рассмотрим простой core.css для стилей:
.crx_mouse_visited {
background-color: #bcd5eb !important;
outline: 1px solid #5166bb !important;
}
Значит, вы заметите, что все ваши div будут иметь "зависающее" состояние, подобное тому, что происходит при посещении вашего инспектора браузера при проверке элементов.
Ответ 2
Сейчас 2018 год, и прошло 7,5 лет с тех пор, как был задан этот вопрос. Тем не менее, вопрос все еще актуален, и ответ Мохамеда-Мансура является лучшим.
Тем не менее, я хочу немного его оптимизировать, модернизировать с поддержкой https и предоставить полную документацию для всего расширения Chrome.
mannifest.json
{
"name": "Mark active image",
"version": "1.11",
"description": "Mark image with dashed frame.",
"permissions": [
"activeTab",
"declarativeContent"
],
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"css": [
"imageMarker.css"
],
"js": [
"imageMarker.js"
]
}
],
"manifest_version": 2
}
imageMarker.js
В моем примере ниже я отмечаю изображения (тег IMG) на странице пунктирным контуром. И избегайте избыточной обработки текущего изображения.
// Unique ID for the className.
var MOUSE_VISITED_CLASSNAME = 'crx_mouse_visited';
// Previous dom, that we want to track, so we can remove the previous styling.
var prevDOM = null;
// Mouse listener for any move event on the current document.
document.addEventListener('mousemove', function (e) {
let srcElement = e.srcElement;
// Lets check if our underlying element is a IMG.
if (prevDOM != srcElement && srcElement.nodeName == 'IMG') {
// For NPE checking, we check safely. We need to remove the class name
// Since we will be styling the new one after.
if (prevDOM != null) {
prevDOM.classList.remove(MOUSE_VISITED_CLASSNAME);
}
// Add a visited class name to the element. So we can style it.
srcElement.classList.add(MOUSE_VISITED_CLASSNAME);
// The current element is now the previous. So we can remove the class
// during the next ieration.
prevDOM = srcElement;
console.info(srcElement.currentSrc);
console.dir(srcElement);
}
}, false);
imageMarker.css
.crx_mouse_visited {
background-clip: #bcd5eb!important;
outline: 1px dashed #e9af6e!important;
}
Ответ 3
@pdknsk Что вы можете сделать, чтобы установить это для каждого элемента, для события onload
тела, запустите этот код:
bod= document.body;
walker = document.createTreeWalker(bod,NodeFilter.SHOW_ELEMENT,null,false);
while (walker.nextNode()){
walker.currentNode.addEventListener("mouseover",on,false);
walker.currentNode.addEventListener("mouseout",off,false);
}
и изменить и выключить так:
on=function(elem){ oldBG = this.style.backgroundColor;
this.style.backgroundColor='#123456';
this.addEventListener("mouseout",function(){this.style.backgroundColor= oldBG},false);
}
Следует отметить, что это будет работать только в том случае, если стиль установлен с помощью объекта element.style
, и для того, чтобы сделать его более надежным, вам нужно будет получить element.style.cssText
и обработать (используя регулярное выражение) и измените его.
В общем, Mohamed Mansour Answer - лучший способ добиться этого.
Ответ 4
Как выделить тег DIV, в котором найдено совпадение текста? Нужна срочная помощь.
ре