2012-01-24 26 views
13

Về cơ bản tôi cần biết khi nào window.getSelection() đã thay đổi và ràng buộc một trình xử lý cho sự kiện này. Ý tưởng?Làm thế nào để ràng buộc một trình xử lý để thay đổi lựa chọn trên cửa sổ?

OBS: Xin lưu ý rằng tôi không tìm cách ràng buộc thay đổi lựa chọn trên INPUT hoặc TEXTAREA. Tôi đang nói về bất kỳ lựa chọn nào trong cửa sổ.

+0

thể trùng lặp của [Làm thế nào để giám sát cửa sổ thay đổi lựa chọn sự kiện trong javascript] (http://stackoverflow.com/questions/5139623 –

+2

không phải là bản sao vì tôi cần theo dõi sự kiện chọn cửa sổ, không phải cho đầu vào –

+0

Thực ra tôi cho rằng đó là một bản sao, như một câu hỏi khác dường như đang hỏi điều tương tự chứ không phải là không chính xác, nhưng câu trả lời có không hữu ích. Bản sao tốt hơn là bản sao này: http://stackoverflow.com/questions/8442158/selection-change-event-in-contenteditable –

Trả lời

-1

Tôi nghĩ rằng nó sẽ giúp

function foo() { 
    var selObj = window.getSelection(); 
    alert(selObj); 
    var selRange = selObj.getRangeAt(0); 
    // work something with selObj 
} 
+0

Làm thế nào điều này sẽ được gọi khi lựa chọn thay đổi? Đó là vấn đề, không nhận được lựa chọn. –

17

Không có cách nào qua trình duyệt phát hiện thay đổi đối với lựa chọn. IE (kể từ phiên bản 5.5, tôi nghĩ) và trình duyệt WebKit/Blink (Chrome, Safari và Opera phiên bản từ vài năm qua), hỗ trợ sự kiện selectionchange trên document thực hiện chính xác những gì bạn muốn.

Firefox và trước Blink Opera không có sự kiện như vậy và tất cả những gì bạn có thể làm là phát hiện các thay đổi lựa chọn được thực hiện thông qua các sự kiện bàn phím và chuột, không đạt yêu cầu (không có cách nào phát hiện "Chọn tất cả" từ ngữ cảnh hoặc menu chỉnh sửa, ví dụ) hoặc chỉ đơn giản là thăm dò đối tượng Selection được trả lại bởi window.getSelection() (kiểm tra các lựa chọn của anchorNode, anchorOffset, focusNodefocusOffset thuộc tính so với các giá trị trước đó của chúng là đủ).

+1

Cập nhật: Opera hiện hỗ trợ selectionchange (kể từ khi chuyển sang Blink). Đối với công việc, gần đây tôi đã viết một polyfill selectionchange nhẹ cho Firefox. https://github.com/2is10/selectionchange-polyfill Yêu cầu tính năng của Firefox, cho mục đích theo dõi: https://bugzilla.mozilla.org/show_bug.cgi?id=571294 – jaredjacobs

+0

@jaredjacobs: Cảm ơn. Tôi đã kết hợp điều đó vào câu trả lời của mình. –

+1

Nó đã vào FF43, nhưng bạn vẫn cần phải thay đổi một lá cờ. Nên sớm có mặt. https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange#Browser_compatibility –

9

Không có sự kiện trên trình duyệt cho điều đó.

Tuy nhiên, có sự kiện được gọi là selectionchange, kích hoạt mọi thay đổi trong lựa chọn trong tài liệu nhưng chỉ được hỗ trợ trong IE và WebKit gần đây (Chrome/Safari), vì vậy không có Firefox/Opera.

Bạn có thể sử dụng các sự kiện selectionchange như thế này:

$(document).on('selectionchange', function(e) { 
    console.log('selectionchange', e.originalEvent); 
}); 

jsfiddle example

+0

^Điều này. Tuy nhiên, nó rất tham lam và có thể bắn nhiều lần trong một giây, tương tự như 'window.onresize'. – Kafoso

Các vấn đề liên quan