2010-01-26 31 views
26

Tôi đang mở rộng trình soạn thảo HTML WYSIWYG (dành cho Firefox), tôi muốn thêm các thẻ xung quanh lựa chọn. Tôi không thể tìm thấy chức năng để thực hiện điều này trong Mozilla Midas specification.window.getSelection() cho tôi văn bản đã chọn, nhưng tôi muốn HTML

Có lệnh để thay thế lựa chọn bằng HTML.
Vì vậy, nếu tôi có thể đọc nội dung lựa chọn, tôi có thể thêm các thẻ của mình vào chuỗi này.

window.getSelection() hầu hết hoạt động, nhưng nó mang lại cho tôi nsISelection mà chuyển đến một chuỗi văn bản đơn giản.

PS: document.getSelection() trả về chuỗi văn bản thuần túy không phải là nsISelection.

+0

Hey Bob Fanger đã u tìm thấy bất kỳ giải pháp cho this.If u có u có thể chỉ cho tôi biết. – Warrior

+0

Không, chúng tôi đã chuyển sang TinyMCE, giải quyết vấn đề (doanh nghiệp). PS. TinyMCE có một api tuyệt vời để mở rộng trình soạn thảo htmleditor của họ. Bạn có thể kiểm tra việc thực hiện http://wiki.moxiecode.com/index.php/TinyMCE:API/tinymce.Editor/selection –

+0

Tôi khuyên bạn nên xem xét một số (trình phát triển HTML) WYSIWYG - tinymce, được phát triển tốt ví dụ - để tìm ra. :) –

Trả lời

34

Hãy xem qua số DOM Range spec. Bạn có thể có được một Range từ sự chọn lựa sử dụng trong Firefox sử dụng:

var range = window.getSelection().getRangeAt(0); 

Lưu ý rằng một số trình duyệt như Firefox, cho phép nhiều lựa chọn, có thể được truy cập thông qua các phương pháp getRangeAt() của vùng chọn.

Range được thể hiện dưới dạng các nút DOM và khoảng bù trong các nút đó. Khi bạn đã có Range, không đơn giản để thực hiện chính xác những gì bạn muốn, vì ranh giới của phạm vi có thể ở các nút khác nhau ở các cấp khác nhau của cây DOM, vì vậy chỉ cần bao quanh nội dung của Phạm vi bằng thẻ không phải lúc nào cũng có thể. Bạn có thể làm điều gì đó như sau, mặc dù nó sẽ tạo ra một yếu tố khối mới để chứa các nội dung được lựa chọn:

var range = window.getSelection().getRangeAt(0); 
var selectionContents = range.extractContents(); 
var div = document.createElement("div"); 
div.style.color = "yellow"; 
div.appendChild(selectionContents); 
range.insertNode(div); 

khác, hacky, thay thế là sử dụng phương pháp execCommand() của document để thay đổi lựa chọn (ví dụ: bằng cách đặt nó thành một màu cụ thể) và sau đó sử dụng document.querySelectorAll hoặc một số thư viện bộ chọn để chọn các phần tử có màu đó và sau đó áp dụng kiểu cho chúng.

+0

có lỗi đánh máy nhỏ trên dòng cuối cùng, bạn cần s/span/div/ –

+0

@Will: Ah yes.Cảm ơn, cố định ngay bây giờ. –

+0

@tim vấn đề là nếu tôi sẽ cố gắng để trích xuất bắt đầu và kết thúc từ phạm vi đối tượng này không phải là quay trở lại vị trí chính xác mà là cho tôi qua ** window.getSelection() ** đối tượng .. bất kỳ cách nào để có được và nếu tôi sử dụng cả hai sau đó ** window.getSelection(). getRangeAt (0) ** phạm vi bắt đầu và kết thúc ghi đè ** window.getSelection() ** đối tượng bắt đầu và kết thúc giá trị. bất kỳ cách nào để biết thêm xin vui lòng theo liên kết này tôi đã đăng ở đây http://stackoverflow.com/questions/42113694/how-to-get-selected-text-range-and-add-color-to-the-particular-selected- text/42114215 # 42114215 –

10

Câu trả lời của Tim Down đang đi đúng hướng. Tuy nhiên một vấn đề là extractContents() sẽ loại bỏ các lựa chọn từ dom. Bạn có thể sử dụng

window.getSelection().getRangeAt(0).cloneContents(); 

để chỉ nhận bản sao của những gì được chọn. Sau đó, bạn có thể bọc thẻ đó bằng thẻ mới của mình và sau đó thay thế lựa chọn bằng thẻ đó. Mối quan tâm của Tim Down về phạm vi bao trùm nhiều phần tử HTML chắc chắn là một yếu tố hợp lệ. Tôi nghĩ rằng một khi bạn nhận được phạm vi, nó 'sửa' lên html, nhưng khi bạn đặt nó trở lại trong nó có thể gây ra vấn đề. Here là một nguồn tài nguyên tốt trên đối tượng Phạm vi.

+0

Tôi đã không hoàn thành khi tôi đăng. Bây giờ tôi đã hoàn thành câu trả lời của tôi. Sử dụng 'extractContents' là cố ý vì bạn cần xóa nội dung khỏi tài liệu trước khi chèn lại. –

+0

Vâng, tôi nghĩ rằng sẽ có một cách khá tốt đẹp để sử dụng extractContents để giải quyết điều này, tôi chỉ nghĩ rằng tôi nên chỉ ra rằng nó 'phá hoại' và có một phương pháp khác để có được html đã chọn. Dù sao, câu trả lời hay, +1. – rosscj2533

2

window.getSelection() sẽ trả về một đối tượng. Bạn có thể sử dụng đối tượng selection được trả về như một chuỗi bằng cách gọi phương thức .toString() của đối tượng.

var selObj = window.getSelection(); 
var selectedText = selObj.toString(); 

https://developer.mozilla.org/en/DOM/window.getSelection

+0

Câu trả lời cũ, nhưng trả về một chuỗi trống, không có đánh dấu. Tôi đã thử nghiệm với 'alert()'. – cst1992

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