2011-11-14 23 views
18

Tôi muốn có thể chuyển đổi vị trí chuột hiện tại thành một phạm vi, trong CKEditor nói riêng.JavaScript chuyển đổi vị trí chuột thành phạm vi lựa chọn

Các ckeditor cung cấp một API để thiết lập con trỏ theo một khoảng:

var ranges = new CKEDITOR.dom.range(editor.document); 
editor.getSelection().selectRanges([ ranges ]); 

Kể từ ckeditor cung cấp API này, vấn đề có thể được đơn giản hóa bằng cách loại bỏ yêu cầu này và chỉ cần tìm một cách để tạo ra khoảng từ chuột tọa độ trên một div chứa các phần tử HTML khác nhau. Tuy nhiên, điều này không giống như chuyển đổi tọa độ chuột thành vị trí con trỏ trong vùng văn bản vì textareas có độ rộng cột cố định và chiều cao hàng nơi CKEditor hiển thị HTML thông qua khung nội tuyến.

Dựa trên this, có vẻ như phạm vi có thể được áp dụng cho các phần tử.

Bạn sẽ tìm ra phạm vi bắt đầu/kết thúc gần nhất với vị trí chuột hiện tại như thế nào?

Chỉnh sửa: Ví dụ về cách người dùng có thể sử dụng API ckeditor để chọn phạm vi trên sự kiện di chuột.

editor.document.on('mouseup', function(e) { 
    this.focus(); 
    var node = e.data.$.target; 

    var range = new CKEDITOR.dom.range(this.document); 
    range.setStart(new CKEDITOR.dom.node(node), 0); 
    range.collapse(); 

    var ranges = []; 
    ranges.push(range); 
    this.getSelection().selectRanges(ranges); 
}); 

Vấn đề với ví dụ trên là nút mục tiêu sự kiện (e.data. $. Mục tiêu) chỉ bắn cho các nút như HTML, BODY, hoặc IMG nhưng không cho các nút văn bản. Ngay cả khi nó đã làm, các nút này đại diện cho khối của văn bản mà sẽ không hỗ trợ thiết lập con trỏ đến vị trí của con chuột trong đoạn văn bản đó.

Trả lời

1

Có hai cách để thực hiện việc này, giống như mọi WYSIWYG thực hiện.

Đầu tiên: - bạn bỏ cuộc vì quá khó và nó sẽ trở thành kẻ giết người trình duyệt;

Thứ hai: - bạn cố gắng để phân tích văn bản và đặt nó ở vị trí chính xác trong một textarea bán trong suốt hoặc div trên bản gốc, nhưng ở đây chúng ta có hai vấn đề:

1) làm thế nào bạn sẽ phân tích năng động khối dữ liệu chỉ nhận được văn bản và để chắc chắn bạn ánh xạ nó qua vị trí chính xác của nội dung thực tế

2) cách bạn giải quyết cập nhật phân tích cho mọi ký tự darn bạn nhập hoặc mọi hành động bạn thực hiện trong biên tập viên.

Cuối cùng, đây chỉ là "một cuộc phiêu lưu tàn bạo đến mặt tối của cây DOM", nhưng nếu bạn chọn cách thứ hai, mã của bài đăng của bạn sẽ hoạt động như một nét duyên dáng.

2

Điều bạn đang cố gắng thực sự thực sự khó khăn trong trình duyệt. Tôi không phải là familar với ckeditor nói riêng, nhưng javascript thường xuyên cho phép bạn chọn văn bản bằng cách sử dụng một phạm vi vì vậy tôi không nghĩ rằng nó thêm bất cứ điều gì đặc biệt. Bạn phải tìm phần tử trình duyệt có chứa lần nhấp, sau đó tìm ký tự trong phần tử được nhấp.

Phát hiện phần tử trình duyệt là một cách dễ dàng: bạn cần phải đăng ký trình xử lý của mình trên mọi phần tử hoặc sử dụng trường mục tiêu của sự kiện. Có rất nhiều thông tin về điều này, hỏi một câu hỏi cụ thể hơn về stackoverflow nếu đó là những gì bạn đang gặp rắc rối với.

Khi bạn có phần tử, bạn cần phải tìm ra ký tự nào trong phần tử được nhấp, sau đó tạo một phạm vi thích hợp để đặt con trỏ ở đó. Khi bài đăng bạn đã liên kết đến được nêu, các biến thể của trình duyệt làm cho điều này thực sự khó khăn. Trang này hơi lỗi, nhưng có một cuộc thảo luận tốt về các phạm vi: http://www.quirksmode.org/dom/range_intro.html

Phạm vi không thể cho bạn biết vị trí của chúng trên trang, vì vậy bạn sẽ phải sử dụng một kỹ thuật khác để tìm hiểu xem văn bản nào đã được nhấp .

Tôi chưa bao giờ thấy giải pháp hoàn chỉnh về điều này trong javascript. Một vài năm trước, tôi đã làm việc trên một nhưng tôi đã không đưa ra một câu trả lời tôi đã hài lòng với (một số trường hợp thực sự khó khăn cạnh). Cách tiếp cận mà tôi sử dụng là một hack khủng khiếp: chèn các đoạn văn bản vào sau đó sử dụng chúng để thực hiện tìm kiếm nhị phân cho đến khi bạn tìm thấy khoảng thời gian nhỏ nhất có thể chứa nhấp chuột. Các nhịp không thay đổi bố cục, vì vậy bạn có thể sử dụng thuộc tính position_x/y của span để tìm ra chúng chứa nhấp chuột.

Ví dụ: giả sử bạn có văn bản sau trong một nút:

<p>Here is some paragraph text.</p> 

Chúng tôi biết nhấp chuột ở đâu đó trong đoạn này. Chia đoạn này thành một nửa với một khoảng:

<p><span>Here is some p</span>aragraph text.</p> 

Nếu khoảng chứa tọa độ nhấp chuột, tiếp tục tìm kiếm nhị phân trong nửa đó, nếu không tìm kiếm nửa thứ hai.

Điều này phù hợp với các dòng đơn, nhưng nếu văn bản kéo dài nhiều dòng, trước tiên bạn phải tìm ngắt dòng hoặc các nhịp có thể trùng lặp. Bạn cũng phải tìm ra những việc cần làm khi nhấp chuột không nằm trên bất kỳ văn bản nào nhưng nằm trong phần tử --- qua cuối dòng cuối cùng trong một đoạn văn chẳng hạn.

Vì tôi đã làm việc trên các trình duyệt này nhanh hơn rất nhiều. Chúng có lẽ đủ nhanh để thêm s xung quanh mỗi ký tự, sau đó xoay quanh hai ký tự vv để tạo một cây nhị phân dễ tìm kiếm. Bạn có thể thử cách tiếp cận này - nó sẽ làm cho nó dễ dàng hơn nhiều để làm việc ra dòng bạn đang làm việc trên.

TL; DR đây là một vấn đề thực sự khó khăn và nếu có câu trả lời, nó có thể không có giá trị thời gian của bạn để đến với nó.

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