Duplicar posible:
How to make this JavaScript much faster?jQuery: elemento resaltado debajo del cursor del mouse?
estoy tratando de crear un "selector de elemento" en jQuery, tiene como Firebug. Básicamente, quiero resaltar el elemento debajo del mouse del usuario. Esto es lo que tengo hasta ahora, pero no está funcionando muy bien:
$('*').mouseover(function (event) {
var $this = $(this);
$div.offset($this.offset()).width($this.width()).height($this.height());
return false;
});
var $div = $('<div>')
.css({ 'background-color': 'rgba(255,0,0,.5)', 'position': 'absolute', 'z-index': '65535' })
.appendTo('body');
Básicamente, estoy inyectando un div en el DOM que tiene un fondo semitransparente. Luego escucho el evento mouseover en cada elemento, luego muevo el div para que cubra ese elemento.
En este momento, esto solo hace que toda la página se vuelva roja tan pronto como mueva el mouse sobre la página. ¿Cómo puedo hacer que esto funcione mejor?
Editar: seguro de que el problema es que tan pronto como el ratón toca a la página, el cuerpo se ha seleccionado, y luego como muevo el ratón alrededor, ninguno de los momentos van pasando a través de la highligher porque su overtop de todo.
Firebug
de excavación a través del código fuente de Firebug, me encontré con esto:
drawBoxModel: function(el)
{
// avoid error when the element is not attached a document
if (!el || !el.parentNode)
return;
var box = Firebug.browser.getElementBox(el);
var windowSize = Firebug.browser.getWindowSize();
var scrollPosition = Firebug.browser.getWindowScrollPosition();
// element may be occluded by the chrome, when in frame mode
var offsetHeight = Firebug.chrome.type == "frame" ? FirebugChrome.height : 0;
// if element box is not inside the viewport, don't draw the box model
if (box.top > scrollPosition.top + windowSize.height - offsetHeight ||
box.left > scrollPosition.left + windowSize.width ||
scrollPosition.top > box.top + box.height ||
scrollPosition.left > box.left + box.width)
return;
var top = box.top;
var left = box.left;
var height = box.height;
var width = box.width;
var margin = Firebug.browser.getMeasurementBox(el, "margin");
var padding = Firebug.browser.getMeasurementBox(el, "padding");
var border = Firebug.browser.getMeasurementBox(el, "border");
boxModelStyle.top = top - margin.top + "px";
boxModelStyle.left = left - margin.left + "px";
boxModelStyle.height = height + margin.top + margin.bottom + "px";
boxModelStyle.width = width + margin.left + margin.right + "px";
boxBorderStyle.top = margin.top + "px";
boxBorderStyle.left = margin.left + "px";
boxBorderStyle.height = height + "px";
boxBorderStyle.width = width + "px";
boxPaddingStyle.top = margin.top + border.top + "px";
boxPaddingStyle.left = margin.left + border.left + "px";
boxPaddingStyle.height = height - border.top - border.bottom + "px";
boxPaddingStyle.width = width - border.left - border.right + "px";
boxContentStyle.top = margin.top + border.top + padding.top + "px";
boxContentStyle.left = margin.left + border.left + padding.left + "px";
boxContentStyle.height = height - border.top - padding.top - padding.bottom - border.bottom + "px";
boxContentStyle.width = width - border.left - padding.left - padding.right - border.right + "px";
if (!boxModelVisible) this.showBoxModel();
},
hideBoxModel: function()
{
if (!boxModelVisible) return;
offlineFragment.appendChild(boxModel);
boxModelVisible = false;
},
showBoxModel: function()
{
if (boxModelVisible) return;
if (outlineVisible) this.hideOutline();
Firebug.browser.document.getElementsByTagName("body")[0].appendChild(boxModel);
boxModelVisible = true;
}
parece que están usando un div estándar + CSS para dibujar ..... solo tiene para averiguar cómo están manejando los eventos ahora ... (este archivo tiene una longitud de 28K)
También hay este fragmento, que creo que recupera el objeto apropiado ... aunque no puedo entender cómo . Están buscando una clase "objectLink-element" ... y no tengo idea de qué es este "repObject".
onMouseMove: function(event)
{
var target = event.srcElement || event.target;
var object = getAncestorByClass(target, "objectLink-element");
object = object ? object.repObject : null;
if(object && instanceOf(object, "Element") && object.nodeType == 1)
{
if(object != lastHighlightedObject)
{
Firebug.Inspector.drawBoxModel(object);
object = lastHighlightedObject;
}
}
else
Firebug.Inspector.hideBoxModel();
},
estoy pensando que tal vez cuando se dispara el evento MouseMove o encima del ratón para el nodo rotulador puedo pasar de alguna manera a lo largo de su lugar? Tal vez al nodo está cubriendo ...?
Si coloco un elemento invisible por encima de todos los elementos con un alto índice z que mi marcador, pero doy mi rotulador un mayor índice z de los elementos reales ... en teoría, debería funcionar. Los elementos invisibles dispararán el evento del mouse, pero el efecto de resaltado aún se verá como un sobretiro de los elementos reales.
Esto significa que acabo de duplicar los elementos DOM, y el posicionamiento tiene que ser correcto. A menos que tal vez solo "levante" los elementos que el resaltador está cubriendo actualmente? Pero eso aún podría ser cada elemento>. < ¡Alguien me ayude!
Hay un desagradable catch-22 cuando intentas hacer cosas como esta. Básicamente, tan pronto como dibuja algo debajo del mouse, como resultado del mouse sobre un elemento, el mouse realmente abandona el elemento original y ahora está sobrevolando el _new_ one. –
@Matt: Bueno, ¿cómo solucionamos esto entonces? ¿Firebug no manipula el DOM para renderizar esos cuadros, o tiene su propio motor de representación? – mpen
Firebug resalta los elementos en una página web cuando pasas el mouse sobre ellos en Firebug, que está ** separado **. ¿O está cansado, piensas? Cuando utilizas el "clic para inspeccionar" solo se delinean los elementos, lo que puede ser el quid de la cuestión: Firebug podría dibujar 4 elementos separados, uno para cada borde de la caja, en cuyo caso, el catch-22 que mencioné isn No es un problema en absoluto. –