2012-07-12 40 views
5

Tôi có một trường hợp lẻ cho các phần tử contenteditable trong HTML. Chúng tôi có một trình soạn thảo văn bản phong phú mà khách hàng tải các mẫu được tạo sẵn (bởi chúng tôi) vào, và sau đó có thể sửa đổi mẫu đó tuy nhiên họ muốn (chủ yếu).Dòng mới và có thể chỉnh sửa được bằng các thẻ lồng nhau không thể chỉnh sửa

Các phần của mẫu của chúng tôi đã được đánh dấu là không thể chỉnh sửa trực tiếp, nhưng vẫn có thể bị xóa, v.v. Tuy nhiên, dường như có vấn đề khi một phần tử đó là phần tử đầu tiên trên một dòng (ngay sau thẻ <br/>) và người dùng truy cập DEL trên dòng ở trên. Vì số contenteditable=false của mình, trình duyệt dường như không xóa <br/> nhưng toàn bộ khoảng không thể chỉnh sửa được.

HTML mẫu là như thế này

<div contenteditable=true> 
    <span>blah blah blah</span><br/> 
    <span contenteditable="false">You cant edit this value directly</span> 
</div> 

Nếu người dùng đặt con trỏ của họ sau khi blah blah blah, và truy cập DEL toàn có thể chỉnh sửa nội dung tiếp theo sẽ bị xóa, chứ không phải là ngắt dòng.

Có cách nào, javascript hoặc cách khác, để khắc phục hành vi này không?

Tôi bị lừa xung quanh với việc cố gắng phát hiện vị trí con trỏ (sử dụng khoảng trống) và chèn khoảng trắng tạm thời, v.v., nhưng dường như tôi không thể thực hiện hành vi mong muốn, mà chỉ là thẻ không thể chỉnh sửa được mang lên đến dòng trước đó.

Chúng tôi đã giới hạn việc sử dụng trình chỉnh sửa cho Chrome chỉ, vì vậy không cần phải lo lắng về IE hoặc FF.

jsfiddle of an example

+0

Là '
'một phần của mẫu của bạn? Nếu vậy, bạn có thể không chỉ sử dụng 3 'div' thay vì sử dụng'
'? –

+0

Có. Vì lý do tôi không hoàn toàn chắc chắn (có thể là để hiển thị), chúng tôi đã ghi đè phím enter để chèn ngắt dòng thay vì cho phép trình duyệt chèn, trong trường hợp này là div. –

+0

Một giải pháp khác có thể là kiểm soát hoàn toàn các sự kiện phím xóa. Bạn có thể sử dụng chức năng được thừa kế khi cần và chặn sự kiện khi không mong muốn. Hoặc thậm chí sử dụng 100% logic xóa tùy chỉnh. * Chỉnh sửa: * Thừa nhận nhận được vị trí caret có thể là một chút khôn lanh, nhưng nó chắc chắn là có thể. –

Trả lời

0

Hãy mỗi khoảng contenteditable, sau đó người dùng sẽ không thể xóa span bạn không muốn thay đổi nội dung, và thoát khỏi div là có thể chỉnh sửa.

Dưới đây là phiên bản của tôi về JSFiddle: http://jsfiddle.net/howderek/HgRsF/2/

+0

Đây là một giải pháp tiềm năng, nhưng không phù hợp với những gì chúng ta cần, vì đây là trong phạm vi của một trình soạn thảo văn bản phong phú và div là khối khu vực có thể chỉnh sửa. Các nhịp bên trong div là kết quả của một số hoạt động để tạo kiểu cho văn bản theo một cách nhất định. –

+0

Ok. Tôi có thể hỏi tại sao bạn muốn một khoảng thời gian để được an toàn từ chỉnh sửa ngay cả khi nó nằm trong khu vực chỉnh sửa? – howderek

+1

nó là một quyết định thiết kế xấu ngay từ đầu, và tiếc là sản phẩm là đủ xa dọc theo nó bị mắc kẹt.Những khoảng thời gian cụ thể đó là các giá trị có thể tái sử dụng, nội dung được quản lý khác nhau và có thể được cắm vào một số tài liệu khác nhau. Chúng không thể chỉnh sửa được từ phần nội dung để người dùng buộc phải sử dụng bản chất có thể sử dụng lại của chúng. Giải pháp thực sự ở đây là xử lý thủ công các phím nhấn enter/delete khi chúng tôi phải làm, và chúng tôi có một giải pháp ổn cho điều đó, nhưng vẫn không hoàn hảo –

0

Câu hỏi đặt ra là từ năm 2012, và kể từ đó vấn đề này đã được cố định và lồng contenteditable thẻ làm việc như dự định. Vẫn còn một số vấn đề như this bug, nhưng về tổng thể, tính năng này có thể sử dụng được.

+0

Điều này dường như vẫn hiển thị trong ví dụ JSFiddle được liên kết ở trên trên trình duyệt của tôi (Chrome 40) – Chris

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