JQuery mouseenter () vs mouseover ()


172

ดังนั้นหลังจากที่ได้อ่านเมื่อเร็ว ๆ นี้ตอบคำถามที่ผมไม่มีความชัดเจนว่าผมเข้าใจความแตกต่างระหว่างและmouseenter() mouseover()สถานะการโพสต์

MouseOver ():

จะยิงเมื่อเข้าสู่องค์ประกอบและเมื่อใดก็ตามที่มีการเคลื่อนไหวของเมาส์เกิดขึ้นภายในองค์ประกอบนั้น

MouseEnter ():

จะยิงเมื่อเข้าสู่องค์ประกอบ

ฉันเกิดซอที่ใช้ทั้งคู่และดูเหมือนว่าจะคล้ายกันมาก ใครช่วยอธิบายความแตกต่างระหว่างสองคนนี้ให้ฉันได้บ้าง

ฉันได้ลองอ่านคำจำกัดความของ JQuery แล้วทั้งคู่ก็พูดในสิ่งเดียวกัน

เหตุการณ์การวางเมาส์ถูกส่งไปยังองค์ประกอบเมื่อตัวชี้เมาส์เข้าสู่องค์ประกอบ

เหตุการณ์ Mouseenter จะถูกส่งไปยังองค์ประกอบเมื่อตัวชี้เมาส์เข้าสู่องค์ประกอบ

มีคนช่วยอธิบายด้วยตัวอย่างได้ไหม


1
ตัวอย่างในเอกสารแสดงให้เห็นว่ามันค่อนข้างดี
เฟลิกซ์คลิง

2
เป็นเรื่องน่าสังเกตว่า mouseenter และ mouseleave เป็นกิจกรรมที่เป็นกรรมสิทธิ์เฉพาะใน IE เท่านั้นและจำลองในเบราว์เซอร์อื่นโดย jQuery (ซึ่งตอนนี้ปรากฏอยู่ในข้อมูลจำเพาะแม้ว่าจะยังไม่ได้ใช้ในเบราว์เซอร์อื่นดูquirksmode.org/dom/events/mouseover.html )
Russ Cam

1
มีความเป็นไปได้ที่ซ้ำกันของเหตุการณ์ความแตกต่างระหว่าง mouseover และ mouseenter?
Kaspar Lee

คำตอบ:


274

คุณเห็นพฤติกรรมเมื่อองค์ประกอบเป้าหมายของคุณมีองค์ประกอบย่อย:

http://jsfiddle.net/ZCWvJ/7/

แต่ละครั้งที่เมาส์ของคุณเข้าหรือออกจากองค์ประกอบที่เด็กmouseoverจะถูกเรียก mouseenterแต่ไม่

$('#my_div').bind("mouseover mouseenter", function(e) {
  var el = $("#" + e.type);
  var n = +el.text();
  el.text(++n);
});
#my_div {
  padding: 0 20px 20px 0;
  background-color: #eee;
  margin-bottom: 10px;
  width: 90px;
  overflow: hidden;
}

#my_div>div {
  float: left;
  margin: 20px 0 0 20px;
  height: 25px;
  width: 25px;
  background-color: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<div>MouseEnter: <span id="mouseenter">0</span></div>
<div>MouseOver: <span id="mouseover">0</span></div>

<div id="my_div">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>


2
@psychobrm - ไม่เล่นกับเดโม่สองตัวที่ติดตามmouseleaveเหตุการณ์: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 หากจบตรงที่ใส่ + ปล่อยการนับค่าโอเวอร์จะเป็นผลรวมของ จำนวนสำหรับการเข้าและออก
gilly3

1
มีเหตุผลเฉพาะในการเขียนvar n = + el.text();แทนvar n = el.text();? ฉันขอเพียงแค่อยากรู้อยากเห็น
Fredrick Gauss

3
@FredrickGauss - ฉันใช้+โอเปอเรเตอร์เพื่อบีบบังคับสตริงที่ส่งคืนจากel.text()จำนวน ฉันต้องการหรือไม่ ไม่ในกรณีนี้คำสั่งถัดไปที่ใช้nก็จะบีบบังคับกับตัวเลขด้วยเช่นกัน ดังนั้นทำไมฉันถึงใช้มัน? ฉันไม่แน่ใจ ... นี่เป็น 2 ปีที่ผ่านมา มันเป็นนิสัยที่ดี มันทำให้ความตั้งใจของฉันชัดเจน น่าจะเป็นผม แต่เดิมมีn + 1ก่อนที่ผมบันทึกไว้ แต่ตัดสินใจที่จะหดตัวลงรหัสของฉัน 2 ++nตัวอักษรและการใช้งานเพียงแค่ n + 1จะไม่บีบบังคับnเป็นตัวเลข แต่จะบังคับให้เป็นสตริงที่มีผลในการส่งออกของเช่น1 0111111
gilly3

2
@ gilly3 - ขอบคุณสำหรับคำอธิบายโดยละเอียดเกี่ยวกับการเดินทางของคุณในใจ
Fredrick Gauss

1
@ gilly3 สรุปดี แต่มีการปรับปรุงเล็กน้อย: "หรือปล่อยองค์ประกอบย่อย" ควร "หรือปล่อยองค์ประกอบย่อยให้เนื่องจากมีช่องว่างระหว่างเด็กกับผู้ปกครองซอของคุณมีระยะขอบ / ระยะห่างและจึงเป็นความจริง เมื่อใดก็ตามที่คุณออกจากองค์ประกอบของเด็กคุณจะได้รับเหตุการณ์ mouseover แต่ลองโดยไม่มีการขยาย / ระยะขอบและคุณจะไม่ได้รับเหตุการณ์นี้
อิสราเอล

30

นี่เป็นหนึ่งในตัวอย่างที่ดีที่สุดที่ฉันได้พบ:

  • mouseenter
  • วางเมาส์
  • mouseout
  • MouseLeave

http://bl.ocks.org/mbostock/5247027


ตัวอย่างนี้ค่อนข้างเจ๋ง แต่คุณต้องจัดโครงสร้างคำตอบของคุณให้มากขึ้นเพื่อที่จะได้รับการยกระดับขึ้น โปรดจำไว้ว่าคุณกำลังพยายามตอบคำถาม ... หากคุณมีลิงก์เพียงอย่างเดียวความคิดเห็นอาจเหมาะสมกว่า หากคุณยังไม่สามารถแสดงความคิดเห็นได้เนื่องจากชื่อเสียงให้รับบางส่วนและทำในภายหลัง
scristalli

จริงๆแล้วฉันชอบคำตอบนี้จริงๆ ผู้ถามได้ให้คำจำกัดความของ mouseover และ mouseenter แล้ว พวกเขาขอตัวอย่างและตัวอย่างนี้แสดงให้เห็นว่าพวกเขาทำงานได้ดีกว่าตัวอย่างอื่น ๆ ที่นี่
patorjk

คำตอบของ gilly3 มีข้อบกพร่อง (ดูความคิดเห็นของฉัน) แม้ว่าจะมีโครงสร้างไม่ดีคำตอบนี้ชี้ไปยังแหล่งข้อมูลที่ดีกว่า
อิสราเอล

14

แม้ว่าพวกเขาจะดำเนินการในลักษณะเดียวกัน แต่mouseenterเหตุการณ์เดียวทริกเกอร์เมื่อตัวชี้เมาส์เข้าองค์ประกอบที่เลือก mouseoverเหตุการณ์จะถูกเรียกถ้าตัวชี้เมาส์เข้าองค์ประกอบของเด็ก ๆ ได้เป็นอย่างดี


3

ดูตัวอย่างรหัสและการสาธิตที่ด้านล่างของหน้าเอกสาร jquery:

http://api.jquery.com/mouseenter/

... mouseover ไฟไหม้เมื่อตัวชี้ย้ายไปยังองค์ประกอบลูกเช่นกันในขณะที่ mouseenter ไฟไหม้เฉพาะเมื่อตัวชี้ย้ายเข้าสู่องค์ประกอบที่ถูกผูกไว้


3

mouseenterเหตุการณ์ที่แตกต่างจากการวางเมาส์ในวิธีที่จะจัดการเดือดเหตุการณ์ mouseenterเหตุการณ์เพียงก่อให้เกิดการจัดการของมันเมื่อเมาส์เข้าองค์ประกอบมันถูกผูกไว้ที่จะไม่ได้ลูกหลาน อ้างอิง: https://api.jquery.com/mouseenter/

MouseLeaveเหตุการณ์ที่แตกต่างจากmouseoutในวิธีที่จะจัดการเดือดเหตุการณ์ MouseLeaveเหตุการณ์เพียงก่อให้เกิดการจัดการของมันเมื่อเมาส์ใบองค์ประกอบมันถูกผูกไว้ที่จะไม่ได้ลูกหลาน อ้างอิง: https://api.jquery.com/mouseleave/


2

ตัวอย่างนี้แสดงให้เห็นถึงความแตกต่างระหว่างเหตุการณ์mousemove , mouseenterและmouseover :

https://jsfiddle.net/z8g613yd/

HTML:

<div onmousemove="myMoveFunction()">
    <p>onmousemove: <br> <span id="demo">Mouse over me!</span></p>
</div>

<div onmouseenter="myEnterFunction()">
    <p>onmouseenter: <br> <span id="demo2">Mouse over me!</span></p>
</div>

<div onmouseover="myOverFunction()">
    <p>onmouseover: <br> <span id="demo3">Mouse over me!</span></p>
</div>

CSS:

div {
    width: 200px;
    height: 100px;
    border: 1px solid black;
    margin: 10px;
    float: left;
    padding: 30px;
    text-align: center;
    background-color: lightgray;
}

p {
    background-color: white;
    height: 50px;
}

p span {
    background-color: #86fcd4;
    padding: 0 20px;
}

JS:

var x = 0;
var y = 0;
var z = 0;

function myMoveFunction() {
    document.getElementById("demo").innerHTML = z += 1;
}

function myEnterFunction() {
    document.getElementById("demo2").innerHTML = x += 1;
}

function myOverFunction() {
    document.getElementById("demo3").innerHTML = y += 1;
}
  • onmousemove : เกิดขึ้นทุกครั้งที่มีการย้ายตัวชี้เมาส์เหนือองค์ประกอบ div
  • onmouseenter : เกิดขึ้นเมื่อตัวชี้เมาส์เข้าองค์ประกอบ div เท่านั้น
  • onmouseover : เกิดขึ้นเมื่อตัวชี้เมาส์เข้าองค์ประกอบ div และองค์ประกอบย่อย (p และ span)

อย่างใด jsfiddle เสียว่า funcitons ไม่ได้กำหนด - ฉันแค่ง่ามและย้าย js ทั้งหมดไปที่<script> jsfiddle.net/orc8empd
godblessstrawberry

0

คำถามเก่า แต่ก็ยังไม่มีคำตอบที่ทันสมัยพร้อมข้อมูลเชิงลึก

วันนี้เบราว์เซอร์สนับสนุนและmouseover/mouseout mouseenter/mouseleaveอย่างไรก็ตาม jQuery ไม่ได้ลงทะเบียนจัดการของคุณไปmouseenter/mouseleaveแต่ทำให้เงียบพวกเขาในห่อรอบเป็นแสดงให้เห็นว่ารหัสต่อไปและทำให้การตีความแตกต่างกันเล็กน้อยของตัวเองของmouseover/mouseoutmouseenter/mouseleave

พฤติกรรมที่แน่นอนของกิจกรรมมีความเกี่ยวข้องโดยเฉพาะอย่างยิ่งใน "ผู้จัดการมอบหมาย" น่าเสียดายที่ jQuery มีการตีความที่แตกต่างกันไปของตัวจัดการผู้รับมอบสิทธิ์และสิ่งที่พวกเขาควรได้รับสำหรับเหตุการณ์ ความจริงนั้นปรากฏในคำตอบอื่นสำหรับเหตุการณ์การคลิกที่ง่ายขึ้น

ดังนั้นวิธีการตอบคำถามอย่างถูกต้องเกี่ยวกับ jQuery ซึ่งใช้ Javascript ถ้อยคำสำหรับเหตุการณ์และเครื่องมือจัดการ แต่ทำให้ทั้งสองแตกต่างกันและไม่ได้พูดถึงสิ่งนั้นในเอกสารประกอบ

ครั้งแรกที่ความแตกต่างใน Javascript "ของจริง":

  • ทั้งสอง
    • เมาส์สามารถ“ กระโดด” จากองค์ประกอบภายนอก / ภายนอกไปยังองค์ประกอบภายใน / ภายในสุดเมื่อเคลื่อนที่เร็วกว่าเบราว์เซอร์ตัวอย่างตำแหน่ง
    • ใด ๆ ที่enter/overได้รับที่สอดคล้องกันleave/out(อาจจะช้า / น่ากลัว)
    • กิจกรรมไปที่องค์ประกอบที่มองเห็นได้ด้านล่างตัวชี้ (มองไม่เห็น→ไม่สามารถกำหนดเป้าหมายได้)
  • mouseenter/mouseleave
    • ถูกส่งไปยังองค์ประกอบที่ลงทะเบียน (เป้าหมาย)
    • เมื่อใดก็ตามที่องค์ประกอบหรือลูกหลานใด ๆ (เช่นโดยการกระโดด) ถูกป้อน / ซ้าย
    • มันไม่สามารถทำให้เกิดฟองได้เนื่องจากในความคิดลูกหลานได้รับการพิจารณาว่าเป็นส่วนหนึ่งขององค์ประกอบที่กล่าวถึงนั่นคือไม่มีเด็ก ๆ ที่เหตุการณ์อื่นอาจมาจาก (โดยมีความหมายว่า "ป้อน / ซ้าย" ผู้ปกครอง?!)
    • เด็กอาจมีตัวจัดการที่คล้ายกันที่ลงทะเบียนซึ่งเข้า / ออกอย่างถูกต้อง แต่ไม่เกี่ยวข้องกับวงจรการเข้า / ออกจากผู้ปกครอง
  • mouseover/mouseout
    • เป้าหมายคือองค์ประกอบจริงใต้ตัวชี้
      • เป้าหมายไม่สามารถเป็นสองสิ่ง: กล่าวคือไม่ใช่พ่อแม่และลูกในเวลาเดียวกัน
    • เหตุการณ์ไม่สามารถ“ ทำรัง”
      • ก่อนที่เด็กจะ“ overed” ผู้ปกครองจะต้อง“ ออก”
    • สามารถบับเบิลเนื่องจากเป้าหมาย / relatedTarget ระบุว่าเหตุการณ์เกิดขึ้นที่ใด

หลังจากการทดสอบบางอย่างมันแสดงให้เห็นว่าตราบใดที่คุณไม่ได้ใช้ jQuery“ ตัวจัดการผู้รับมอบสิทธิ์ด้วยการลงทะเบียนตัวเลือก” การจำลองนั้นไม่จำเป็น แต่สมเหตุสมผล: มันกรองmouseover/mouseoutเหตุการณ์ที่ a mouseenter/mouseleaveจะไม่ได้รับ แม้ว่าเป้าหมายจะยุ่งเหยิง ของจริงmouseenter/mouseleaveจะให้องค์ประกอบจัดการเป็นเป้าหมายการจำลองอาจบ่งบอกถึงเด็ก ๆ ขององค์ประกอบนั้นคือสิ่งที่mouseover/mouseoutดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.