Mögliche Duplizieren:
How to make this JavaScript much faster?jQuery: Markieren Sie das Element unter dem Mauszeiger?
Ich versuche, ein "Element-Picker" in jQuery zu erstellen, wie Firebug hat. Grundsätzlich möchte ich das Element unter der Maus des Benutzers hervorheben. Hier ist, was ich so weit gekommen, aber es funktioniert nicht sehr gut:
$('*').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');
Grundsätzlich bin ich ein Div in die DOM Injektion, die einen halbtransparenten Hintergrund hat. Dann höre ich für jedes Element nach dem mouseover-Ereignis und verschiebe dann das div so, dass es dieses Element abdeckt.
Im Moment wird nur die ganze Seite rot, sobald Sie die Maus über die Seite bewegen. Wie kann ich das schöner arbeiten lassen?
Edit: Ziemlich sicher, dass das Problem ist, dass, sobald die Maus die Seite berührt, wird der Körper ausgewählt, und dann, als ich um meine Maus bewegen, keiner der Momente erhalten durch die highligher, weil seine overtop bestandener alles.
Firebug
Graben durch Firebug Quellcode, fand ich diese:
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;
}
Sieht aus wie sie ein Standard-div + CSS verwenden zu ziehen ..... nur haben um herauszufinden, wie sie die Ereignisse jetzt behandeln ... (diese Datei ist 28K Zeilen lang)
Es gibt auch dieses Snippet, das ich denke, das passende Objekt abgerufen .... obwohl ich nicht herausfinden, wie . Sie suchen nach einer Klasse "objectLink-element" ... und ich habe keine Ahnung was dieses "repObject" ist.
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();
},
Ich denke, dass vielleicht, wenn die mousemove- oder Mouseover-Ereignis ausgelöst wird für den Textmarker Knoten ich es irgendwie entlang stattdessen passieren kann? Vielleicht zum Knoten deckt es ...?
Wenn ich mit einem höheren Z-Index als mein Textmarker, ein unsichtbares Element über jedes Element positionieren, aber meinem Highlighter einen höheren Z-Index als die tatsächlichen Elemente geben ... theoretisch soll es funktionieren. Die unsichtbaren Elemente lösen das Mausereignis aus, aber der Hervorhebungseffekt sieht immer noch wie der Überhang der tatsächlichen Elemente aus.
Das bedeutet, ich habe nur die DOM-Elemente verdoppelt, und die Positionierung muss korrekt sein. Es sei denn vielleicht "life" ich nur die Elemente, die der Textmarker gerade bedeckt ?? Aber das könnte immer noch jedes Element sein. < Jemand hilf mir!
Es gibt einen fiesen Catch-22, wenn man versucht, sowas zu machen. Sobald Sie nun etwas unter die Maus zeichnen, während die Maus über einem Element schwebt, verlässt die Maus tatsächlich das ursprüngliche Element und schwebt nun über dem neuen Element. –
@Matt: Nun, wie schaffen wir das dann? Behandelt Firebug das DOM nicht, um diese Felder zu rendern, oder hat es eine eigene Rendering-Engine? – mpen
Firebug hebt Elemente in einer Webseite hervor, wenn Sie in Firebug mit der Maus darüber fahren - was ** separat ** ist. Oder ist das müde? Wenn Sie das "Klicken zum Inspizieren" verwenden, werden nur die Elemente umrissen, die den Kern der Sache ausmachen könnten - Firebug könnte 4 separate Elemente zeichnen, eines für jeden Rand der Box, in welchem Fall die Catch-22, die ich erwähnt habe, isn ist Das ist überhaupt kein Problem. –