7

Tôi đang che phủ văn bản ẩn trên đầu hình ảnh. Có một plugin jQuery (hoặc tương tự) mà sẽ cho phép người dùng chọn một khu vực trên hình ảnh (cũng chọn văn bản phủ lên) và có thể sao chép nội dung.jQuery - chọn văn bản ẩn được phủ trên hình ảnh, trình xem PDF của GMail

Hiện tại, tôi đã đặt từng ký tự trong thẻ <span /> của riêng nó. Vấn đề là khi người dùng chọn, đôi khi chọn tất cả văn bản phủ (trừ khi người dùng cực kỳ chính xác với con chuột của mình), đôi khi hình ảnh trở thành lựa chọn, v.v.

Một giải pháp tương tự như trình xem PDF của GMail sẽ rất tuyệt. Gợi ý?

+3

"vô hình" có nghĩa là gì? là nó hiển thị không, forecolor = backcolor, có thể nhìn thấy sai? Có một plugin hình ảnh jquery cho phép bạn chọn một khu vực trên một hình ảnh, nhưng phần văn bản bạn sẽ phải viết mã một chút. –

Trả lời

8

Google dường như biết từ một pdf có số chênh lệch văn bản x,y khác nhau có trong tệp. Khi bạn chọn một loạt các dòng, nó đặt một tập hợp các div "lựa chọn" vị trí hoàn toàn trên hình ảnh mà "văn bản" là (chúng có lớp highlight-pane). Khi bạn chọn văn bản, văn bản sẽ điền vào văn bản #selection-content với nội dung của những gì bạn đã chọn và chọn văn bản trong đó (hãy thử sử dụng window.getSelection().anchorNode trong Chrome, ví dụ:). Bên cạnh những lớp phủ lựa chọn đó, chỉ có một hình ảnh .page-image. Tôi đặt cược họ thực sự sử dụng cửa sổ để nắm bắt tất cả các cử chỉ con chuột mà họ quan tâm (Tôi giả sử mousedownmouseup). (Here's an example pdf document)

Nếu bạn đang tuyệt đối-định vị các yếu tố, bạn có thể phát hiện mousedown, mousemovemouseup, tìm ra các yếu tố khoảng chuột đã qua (hoặc gần), và điền vào một textarea với các nội dung của tất cả các nội dung giữa hai yếu tố đó. Nếu bạn muốn chỉ sử dụng từ chi tiết, tôi nghi ngờ bất cứ ai sẽ phàn nàn (bao quanh mỗi từ với một khoảng, thay vì mỗi chữ cái).

Chỉnh sửa: Tôi đã rất tò mò đêm qua và đã mã hóa thực sự phiên bản ngây thơ. Nó chỉ làm mousedownmouseup, và nó không hoạt động trong IE (Tôi không có cảm giác như gỡ lỗi nó :)

Check it out on jsfiddle.

tính năng bạn có thể muốn thêm:

  1. Một số tốt hơn cách kiểm tra các trận đấu dựa trên vị trí; Tôi chỉ làm cho dù nó được bao gồm trong hộp.
  2. cập nhật động trên mousemove
  3. Line-dựa chứ không phải là khoảng thời gian dựa trên
  4. Bạn vẫn có thể làm chọn bởi màu nền, nhưng tùy thuộc vào cách yếu tố của bạn được sắp xếp nó có thể không nhìn rất tốt. Cũng cần phải hỗ trợ minh bạch.
+0

+1 cho sự tận tụy và trả lời ace :) – hookd

+0

@hookd Cảm ơn! Nó kinda nối tôi, ít nhất là cho các bằng chứng nhanh chóng của khái niệm. – theazureshadow

1

Dưới đây là một ví dụ đơn giản sử dụng câu trả lời của tôi cho câu hỏi trước đây của bạn: http://www.jsfiddle.net/yijiang/83W7X/2/embedded/result

var selected = []; 

function drawSelection(){ 
    if(selected.length){ 
     selected.sort(function(a, b){ 
      if(a.sourceIndex){ 
       return a.sourceIndex - b.sourceIndex; 
      } else if(a.compareDocumentPosition){ 
       if(a.compareDocumentPosition(b) == Node.DOCUMENT_POSITION_PRECEDING){ 
        return 1; 
       } else { 
        return -1; 
       } 
      } 
     }); 
     var range = rangy.createRange(), 
      sel = rangy.getSelection(); 

     range.setStart(selected[0].children[0], 0); 
     range.setEnd(selected[selected.length - 1].children[0], 1); 
     sel.setSingleRange(range); 
    } 
} 

$('ul').selectable({ 
    delay: 100, 
    selecting: function(event, ui) { 
     if(ui.selecting.getAttribute('class').indexOf('wrapper') !== -1 && $.inArray(ui.selecting, selected) === -1) { 
      selected.push(ui.selecting); 
      drawSelection(); 
     } 
    }, 
    unselecting: function(event, ui){ 
     if(ui.unselecting.getAttribute('class').indexOf('wrapper') !== -1 && $.inArray(ui.unselecting, selected) > -1){ 
      selected.splice($.inArray(ui.unselecting, selected), 1); 
      drawSelection(); 
     } 
    } 
}); 

Nó pha trộn Selectable jQuery UI với thư viện Rangy tuyệt vời Tim Down để tạo ra một cái gì đó tương tự như những gì bạn yêu cầu. Tôi nghĩ. Những gì bạn yêu cầu không rõ ràng.

Mã giữ một mảng các thành phần hiện tại được chọn li. Phần thứ hai của mã thêm vào các trình xử lý sự kiện có liên quan và các tùy chọn.Hàm drawSelection được gọi mỗi lần một phần tử được chọn hoặc bỏ chọn. Hàm đầu tiên sắp xếp tất cả các phần tử theo vị trí của chúng trong DOM, sau đó tiến hành vẽ một vùng chọn từ lần chọn đầu tiên được chọn li đến cuối cùng.

Mã, như theazureshadow's, chỉ là bằng chứng-khái niệm, vì tôi đang trừu tượng những gì thực sự là nhiệm vụ đơn giản khi chọn thư viện Rangy khá nặng nề. Nó cũng không hoạt động tốt và có thể thực hiện với một số phép tái cấu trúc.

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