Eventuali duplicati:
How to make this JavaScript much faster?jQuery: Evidenzia elemento sotto il cursore del mouse?
che sto cercando di creare un "elemento picker" in jQuery, come Firebug ha. Fondamentalmente, voglio evidenziare l'elemento sotto il mouse dell'utente. Ecco quello che ho finora, ma non sta funzionando molto bene:
$('*').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');
Fondamentalmente, io sto iniettando un div nel DOM che ha uno sfondo semi-trasparente. Quindi ascolto l'evento mouseover su ogni elemento, quindi sposta il div in modo che copra quell'elemento.
Al momento, questo rende l'intera pagina diventata rossa non appena si sposta il mouse sulla pagina. Come posso farlo funzionare meglio?
Edit: abbastanza sicuro che il problema è che, non appena il mio mouse tocca la pagina, il corpo viene selezionato, e poi come muovo il mouse intorno, nessuno dei momenti viene passato attraverso il highligher perché la sua overtop di qualunque cosa.
Firebug
Scavando attraverso il codice sorgente di Firebug, ho trovato questo:
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;
}
Sembra che si sta utilizzando uno standard div + CSS per disegnare ..... basta per capire come stanno gestendo gli eventi ora ... (questo file è lungo 28K)
C'è anche questo frammento, che presumo recupera l'oggetto appropriato .... anche se non riesco a capire come . Stanno cercando una classe "objectLink-element" ... e non ho idea di cosa sia questo "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();
},
sto pensando che forse quando le MouseMove o mouseover generato l'evento per il nodo evidenziatore posso in qualche modo passarlo insieme, invece? Forse per il nodo sta coprendo ...?
Se posiziono un elemento invisibile sopra di ogni elemento con un più alto z-index del mio evidenziatore, ma do il mio evidenziatore un z-index superiore gli elementi reali ... in teoria, dovrebbe funzionare. Gli elementi invisibili faranno scattare l'evento del mouse, ma l'effetto di evidenziazione sembrerà ancora il suo overtop degli elementi reali.
Ciò significa che ho appena raddoppiato gli elementi DOM, e il posizionamento deve essere corretto. A meno che non sia forse "sollevo" solo gli elementi che l'evidenziatore sta attualmente coprendo ?? Ma questo potrebbe essere ancora ogni elemento>. < Qualcuno mi aiuti!
C'è un brutto catch-22 quando provi a fare cose del genere. Fondamentalmente, non appena si disegna qualcosa sotto il mouse, come risultato del passaggio del mouse su un elemento, il mouse lascia effettivamente l'elemento originale e si trova ora sopra il _new_. –
@ Matt: beh, come facciamo a evitare questo? Firebug non manipola il DOM per il rendering di quelle scatole o ha il proprio motore di rendering? – mpen
Firebug evidenzia elementi in una pagina Web quando si passa il mouse su di essi in Firebug - che è ** separato **. O è così stanco? Quando usi il "click to inspect" delinea solo gli elementi, che possono essere il nocciolo della questione - Firebug potrebbe disegnare 4 elementi separati, uno per ciascun lato della scatola, nel qual caso, il catch-22 che ho citato isn è un problema. –