Sự khác biệt giữa e.target và e.cienTarget


276

Tôi không hiểu sự khác biệt, cả hai đều giống nhau nhưng tôi đoán là không.

Bất kỳ ví dụ về thời điểm sử dụng cái này hay cái kia sẽ được đánh giá cao.


2
Đây fiddle show sự khác biệt rất rõ ràng
Murhaf Sousli

1
có ai biết ActionScript3 đủ tốt để xác nhận rằng các sự kiện của nó hoạt động giống như các sự kiện DOM không?
Ben Creasy

2
Tương đương với JavaScript: stackoverflow.com/questions/10086427/ Mạnh
Ben Creasy

Một tài liệu tham khảo được cung cấp bởi Murhaf Sousli là một lời giải thích rõ ràng trả lời một câu hỏi về sự khác biệt là gì. Một phiên bản đơn giản hóa của fiddle này sẽ là câu trả lời tốt nhất.
azakgaim

Câu trả lời:


204

Ben hoàn toàn chính xác trong câu trả lời của mình - vì vậy hãy ghi nhớ những gì anh ấy nói. Những gì tôi sắp nói với bạn không phải là một lời giải thích đầy đủ, nhưng đó là một cách rất dễ để nhớ cách thức e.target, e.currentTargethoạt động liên quan đến các sự kiện chuột và danh sách hiển thị:

e.target= Thứ dưới chuột (như ben nói ... thứ kích hoạt sự kiện). e.currentTarget= Điều trước dấu chấm ... (xem bên dưới)

Vì vậy, nếu bạn có 10 nút bên trong clip có tên ví dụ là "btns" và bạn làm:

btns.addEventListener(MouseEvent.MOUSE_OVER, onOver);
// btns = the thing before the dot of an addEventListener call
function onOver(e:MouseEvent):void{
  trace(e.target.name, e.currentTarget.name);
}

e.targetsẽ là một trong 10 nút và e.currentTargetsẽ luôn là clip "btns".

Điều đáng chú ý là nếu bạn thay đổi MouseEvent thành ROLL_OVER hoặc đặt thuộc tính btns.mouseChildrenthành false e.targete.currentTargetcả hai sẽ luôn là "btns".


2
Vì vậy, nói cách khác, mục tiêu là con và currentTarget là các thùng chứa.
Artemix

107
Không, currentTargetluôn là đối tượng lắng nghe sự kiện; targetlà mục tiêu thực tế đã nhận được sự kiện. Mỗi bong bóng sự kiện, mục tiêu nhận được sự kiện và nó hiện lên danh sách hiển thị. (Hoặc cách khác để chụp sự kiện)
chọc

4
Nếu đó là một đứa trẻ đã gửi sự kiện thì có mục tiêu là những đứa trẻ. Thông thường bạn sẽ muốn sử dụng e.cienTarget vì đây là những gì bạn đã gán cho người nghe. Nhưng trong các tình huống, chẳng hạn như một Zevan được liệt kê ở trên nơi bạn muốn có một người nghe trên một thùng chứa có nhiều trẻ em, sau đó bạn sẽ sử dụng e.target để xem những đứa trẻ nào đã gửi sự kiện.
Ben Gale

nhận xét từ @poke ở trên là câu trả lời hay nhất "currentTarget luôn là đối tượng lắng nghe, mục tiêu là mục tiêu thực tế đã nhận được sự kiện"
PandaWood


28

e.currentTargetluôn luôn là yếu tố mà sự kiện thực sự bị ràng buộc làm. e.targetlà yếu tố mà sự kiện bắt nguồn từ đó, vì vậy e.targetcó thể là con của e.currentTargethoặc e.targetcó thể là === e.currentTarget, tùy thuộc vào cách đánh dấu của bạn được cấu trúc.


26

Tôi thích câu trả lời trực quan.

nhập mô tả hình ảnh ở đây

Khi bạn bấm vào #btn, hai trình xử lý sự kiện được gọi và chúng xuất ra những gì bạn nhìn thấy trong hình.

Demo tại đây: https://jsfiddle.net/ujhe1key/


Câu hỏi là về AS3 chứ không phải JS.
Artemix

1
À không sao, xin lỗi về việc gắn thẻ. Câu trả lời vẫn còn cho cả hai.
Maria Ines Parnisari

8

Đáng lưu ý rằng event.target có thể hữu ích, ví dụ, khi sử dụng một trình nghe duy nhất để kích hoạt các hành động khác nhau. Giả sử bạn có sprite "menu" điển hình với 10 nút bên trong, vì vậy thay vì thực hiện:

menu.button1.addEventListener(MouseEvent.CLICK, doAction1);
menu.button2.addEventListener(MouseEvent.CLICK, doAction2);
etc...

Bạn chỉ có thể làm:

menu.addEventListener(MouseEvent.CLICK, doAction);

Và kích hoạt một hành động khác trong doAction (sự kiện) tùy thuộc vào event.target (sử dụng thuộc tính tên của nó, v.v ...)


5

làm một ví dụ:

var body = document.body,
    btn = document.getElementById( 'id' );
body.addEventListener( 'click', function( event ) {
    console.log( event.currentTarget === body );
    console.log( event.target === btn );
}, false );

khi bạn nhấp vào 'btn' và 'true' và 'true' sẽ xuất hiện!


3

e.cienTarget sẽ luôn trả về thành phần mà trình lắng nghe sự kiện được thêm vào.

Mặt khác, e.target có thể là chính thành phần hoặc bất kỳ đứa trẻ trực tiếp hoặc cháu nội hoặc cháu lớn và những người đã nhận sự kiện này. Nói cách khác, e.target trả về thành phần nằm trên cùng trong hệ thống phân cấp Danh sách hiển thị và phải nằm trong cấu trúc phân cấp con hoặc chính thành phần đó.

Một lần sử dụng có thể là khi bạn có một vài Hình ảnh trong Canvas và bạn muốn kéo Hình ảnh bên trong thành phần trừ Canvas. Bạn có thể thêm một trình nghe trên Canvas và trong trình nghe đó, bạn có thể viết đoạn mã sau để đảm bảo rằng Canvas sẽ không bị kéo.

function dragImageOnly(e:MouseEvent):void
{
    if(e.target==e.currentTarget)
    {
        return;
     }
     else
     {
        Image(e.target).startDrag();
     }
}

3
target  is the element that triggered the event (e.g., the user clicked on)

currenttarget is the element that the event listener is attached to.

2
  • e.target là yếu tố, mà bạn bấm vào
  • e.cienTarget là phần tử có thêm trình nghe sự kiện.

Nếu bạn nhấp vào phần tử con của nút, tốt hơn là sử dụng currentTarget để phát hiện các thuộc tính nút, trong CH đôi khi vấn đề sử dụng e.target.


0

e.cienTarget là phần tử (cha mẹ) trong đó sự kiện được đăng ký, e.target là nút (con) nơi sự kiện được trỏ đến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.