วิธีรับองค์ประกอบที่เน้นกับ jQuery


345

เมื่อใช้ jQuery ฉันจะได้รับองค์ประกอบอินพุตที่มีจุดโฟกัส (เคอร์เซอร์) ได้อย่างไร

หรือกล่าวอีกนัยหนึ่งว่าจะมีการป้อนข้อมูลอย่างไรหากมีโฟกัสของคาเร็ต?



ซ้ำซ้อนที่เป็นไปได้: stackoverflow.com/questions/516152/…
Sam Shiles

คำตอบ:


740
// Get the focused element:
var $focused = $(':focus');

// No jQuery:
var focused = document.activeElement;

// Does the element have focus:
var hasFocus = $('foo').is(':focus');

// No jQuery:
elem === elem.ownerDocument.activeElement;

คุณควรใช้อันไหน อ้างถึงเอกสาร jQuery :

เช่นเดียวกับตัวเลือกคลาสหลอกอื่น ๆ (ตัวที่ขึ้นต้นด้วย ":") ขอแนะนำให้นำหน้า: โฟกัสด้วยชื่อแท็กหรือตัวเลือกอื่น ๆ ไม่เช่นนั้นตัวเลือกสากล ("*") จะบอกเป็นนัย ในคำอื่น ๆ เปลือย$(':focus')$('*:focus')เทียบเท่ากับ หากคุณกำลังมองหาองค์ประกอบที่มุ่งเน้นในปัจจุบัน $ (document.activeElement) จะดึงข้อมูลได้โดยไม่ต้องค้นหาแผนผัง DOM ทั้งต้น

คำตอบคือ:

document.activeElement

และถ้าคุณต้องการให้วัตถุ jQuery ห่อองค์ประกอบ:

$(document.activeElement)

2
แต่เดี๋ยวก่อนฉันจะได้รับองค์ประกอบที่มีเครื่องหมายรูปหมวกได้อย่างไร
dave

@dave คุณหมายถึงอะไร"มีเครื่องหมายรูปหมวก" ? มุ่งเน้น? เมาส์อยู่บนนั้น?
gdoron ให้การสนับสนุนโมนิกา

นี่คือสถานการณ์ของฉัน: เมื่อฉันคลิกองค์ประกอบเฉพาะฉันต้องการวางอักขระในองค์ประกอบข้อความอินพุตที่โฟกัสล่าสุด โดยทั่วไปองค์ประกอบที่มีการโฟกัสสุดท้ายหรือขวาก่อนที่จะคลิกองค์ประกอบนั้น
dave

1
@dave ไม่สามารถทำได้ ฉันคิดว่ามีเพียง IE เท่านั้นที่มีคุณสมบัตินี้ แต่คุณกำลังถามคำถามอื่นตอนนี้คุณควรทำในคำถามใหม่
gdoron ให้การสนับสนุนโมนิกา

3
ฉันชอบวิธีที่คุณใช้ชื่อตัวแปร $ prefixed $focusedเนื่องจากฉันคิดว่าคุณทำเช่นนั้นเพื่อแสดงว่า var เป็นวัตถุ jquery TYVM
Valamas


6

ฉันทดสอบสองวิธีใน Firefox, Chrome, IE9 และ Safari

(1) $(document.activeElement)ทำงานได้ตามที่คาดไว้ใน Firefox, Chrome และ Safari

(2) $(':focus')ทำงานตามที่คาดไว้ใน Firefox และ Safari

ฉันย้ายไปที่เมาส์เพื่อป้อน 'ชื่อ' และกด Enter บนแป้นพิมพ์จากนั้นฉันพยายามหาส่วนประกอบที่โฟกัส

(1) $(document.activeElement)ส่งคืนอินพุต: ข้อความ: ชื่อตามที่คาดไว้ใน Firefox, Chrome และ Safari แต่จะส่งกลับอินพุต: ส่ง: addPassword ใน IE9

(2) $(':focus')ส่งคืนอินพุต: text: ชื่อตามที่คาดไว้ใน Firefox และ Safari แต่ไม่มีอะไรใน IE

<form action="">
    <div id="block-1" class="border">
        <h4>block-1</h4>
        <input type="text" value="enter name here" name="name"/>            
        <input type="button" value="Add name" name="addName"/>
    </div>
    <div id="block-2" class="border">
        <h4>block-2</h4>
        <input type="text" value="enter password here" name="password"/>            
        <input type="submit" value="Add password" name="addPassword"/>
    </div>
</form>

5

ลองสิ่งนี้:

$(":focus").each(function() {
    alert("Focused Elem_id = "+ this.id );
});

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

เป็นไปได้อย่างไรที่จะมุ่งเน้นมากกว่าหนึ่งองค์ประกอบ
Andreas Furster

@ AndreFurster คุณพูดถูก จะมีการวนซ้ำเพียงครั้งเดียวในลูปนี้เสมอ นี่อาจไม่ใช่วิธีที่ดีที่สุดในการบรรลุเป้าหมาย แต่มันได้ผล
Adil Malik

ดูคำตอบที่ยอมรับเพื่อเรียนรู้ว่าทำไมนี่เป็นวิธีที่แย่ที่สุด / มีประสิทธิภาพน้อยที่สุด (ไม่จำเป็นต้อง.eachทนไม่ได้)
แบรดเคนต์

2

ไม่มีใครพูดถึงมันได้ยังไง ..

document.activeElement.id

ฉันใช้ IE8 และยังไม่ได้ทดสอบบนเบราว์เซอร์อื่น ในกรณีของฉันฉันใช้มันเพื่อให้แน่ใจว่ามีอย่างน้อย 4 ตัวอักษรและมุ่งเน้นไปที่การแสดงก่อน เมื่อคุณป้อนหมายเลขที่ 4 มันจะทริกเกอร์ ฟิลด์นี้มีรหัส 'ปี' ฉันใช้..

if( $('#year').val().length >= 4 && document.activeElement.id == "year" ) {
    // action here
}

1

$(':focus')[0] จะให้องค์ประกอบจริง

$(':focus') จะทำให้คุณมีองค์ประกอบมากมายโดยปกติจะมีเพียงองค์ประกอบเดียวเท่านั้นที่มุ่งเน้นในแต่ละครั้งดังนั้นจะเป็นการดีกว่าถ้าคุณมีองค์ประกอบหลายอย่างที่มุ่งเน้น



0

หากคุณต้องการยืนยันว่ามีการโฟกัสด้วยองค์ประกอบหรือไม่

if ($('#inputId').is(':focus')) {
    //your code
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.