thể trùng lặp:
How to make this JavaScript much faster?jQuery: Đánh dấu phần tử bên dưới con trỏ chuột?
Tôi đang cố gắng để tạo ra một "bảng chọn yếu tố" trong jQuery, như Firebug có. Về cơ bản, tôi muốn làm nổi bật phần tử bên dưới chuột của người dùng. Đây là những gì tôi đã có cho đến nay, nhưng nó không hoạt động rất tốt:
$('*').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');
Về cơ bản, tôi đang tiêm div vào DOM có nền bán trong suốt. Sau đó, tôi lắng nghe sự kiện di chuột trên mọi phần tử, sau đó di chuyển div để nó bao gồm phần tử đó.
Ngay bây giờ, điều này chỉ làm cho toàn bộ trang chuyển sang màu đỏ ngay sau khi bạn di chuyển chuột qua trang. Làm thế nào tôi có thể làm điều này để làm việc đẹp hơn?
Chỉnh sửa: Chắc chắn vấn đề là ngay khi chuột chạm vào trang, nội dung được chọn và sau đó khi tôi di chuyển chuột, không có khoảnh khắc nào được truyền qua highligher vì phần trên của nó mọi điều.
Firebug
Đào thông qua mã nguồn Firebug, tôi thấy điều này:
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;
}
Hình như họ đang sử dụng một div chuẩn + css để vẽ nó ..... chỉ có để tìm hiểu cách họ xử lý các sự kiện ngay bây giờ ... (tệp này có độ dài 28K)
Còn đoạn mã này, tôi đoán tìm đối tượng thích hợp .... mặc dù tôi không thể tìm ra cách . Họ đang tìm kiếm một lớp "objectLink-element" ... và tôi không biết cái này "repObject" là gì.
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();
},
Tôi đang nghĩ rằng có lẽ khi MouseMove hoặc mouseover cháy sự kiện cho nút highlighter tôi bằng cách nào đó có thể vượt qua nó cùng để thay thế? Có lẽ để nút nó bao gồm ...?
Nếu tôi đặt một yếu tố vô hình trên mọi phần tử với một z-index cao hơn highlighter của tôi, nhưng cho highlighter tôi một z-index cao hơn các yếu tố thực tế ... về mặt lý thuyết, nó cũng làm việc. Các phần tử vô hình sẽ di chuyển sự kiện chuột, nhưng hiệu ứng nổi bật sẽ vẫn trông giống như các phần tử thực tế của nó.
Điều này có nghĩa là tôi vừa tăng gấp đôi các phần tử DOM và vị trí phải chính xác. Trừ khi có lẽ tôi chỉ "nâng" các yếu tố mà trình đánh dấu hiện đang bao gồm ?? Nhưng đó vẫn có thể là mọi yếu tố>. < Ai đó giúp tôi!
Có một khó khăn bắt-22 khi cố gắng để làm những thứ như thế này. Về cơ bản, ngay sau khi bạn vẽ một cái gì đó dưới con chuột, là kết quả của con chuột di chuột qua một phần tử, con chuột thực sự rời khỏi phần tử gốc và hiện đang lơ lửng trên phần tử _new_. –
@Matt: Làm cách nào để chúng ta có được điều này? Firebug không thao tác DOM để hiển thị các hộp đó hay nó có công cụ hiển thị của riêng nó? – mpen
Firebug nêu bật các yếu tố trong trang web khi bạn di chuột qua chúng trong Firebug - ** riêng **. Hay là suy nghĩ mệt mỏi? Khi bạn sử dụng "bấm để kiểm tra" nó chỉ phác thảo các yếu tố, có thể là điểm then chốt của vấn đề - Firebug có thể vẽ 4 phần tử riêng biệt, một cho mỗi cạnh của hộp, trong trường hợp đó, catch-22 tôi đã đề cập isn không có vấn đề gì cả. –