2011-02-03 38 views
25

Tôi đang gặp một số sự cố khi chọn lựa từ một WebView trong Android.Android WebView Javascript getSelection

Tôi có thể đưa WebView vào chế độ chọn. Tôi thậm chí có thể lấy nó để sao chép văn bản vào Clipboard. Nhưng điều tôi thực sự muốn làm là làm nổi bật vùng chọn vĩnh viễn.

Vì vậy, ý tưởng đặt WebView ở chế độ được chọn. Cho phép người dùng chọn văn bản và sau đó kích hoạt nội dung nào đó để đánh dấu văn bản đó. Tôi có thể làm cho nó hoạt động bằng cách lấy văn bản đã chọn từ clipboard, sau đó tìm kiếm nó trong Javascript và tô sáng nó. Sự cố xảy ra khi người dùng chọn một từ phổ biến thực sự. Tôi phải làm nổi bật tất cả hoặc bằng cách nào đó tìm ra nơi lựa chọn là để có được một trong những quyền.

Tôi đã thử JavaScript này hoạt động trên iPhone. Bu getSelection() dường như không hoạt động trên Android.

function highlight(colour) { 
    var range, sel; 
    if (window.getSelection) { 
      // Non-IE case 
     sel = window.getSelection(); 
     if (sel.getRangeAt) { 
      range = sel.getRangeAt(0); 
     } 
     document.designMode = "on"; 
     if (range) { 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } 
      // Use HiliteColor since some browsers apply BackColor to the whole block 
     if (!document.execCommand("HiliteColor", false, colour)) { 
      document.execCommand("BackColor", false, colour); 
     } 
     document.designMode = "off"; 
    } else if (document.selection && document.selection.createRange) { 
      // IE case 
     range = document.selection.createRange(); 
     range.execCommand("BackColor", false, colour); 
    } 
} 

Mọi đề xuất?

+0

Làm thế nào để bạn nhận được nó để sao chép văn bản vào clipboard? Bạn có làm điều này theo lập trình hay không, hoặc bạn có dựa vào người dùng để thực hiện việc lựa chọn theo cách thủ công hay không. –

Trả lời

0

Bạn nên thử rangy - Thư viện lựa chọn và phạm vi JavaScript trên nhiều trình duyệt.

+0

cách sử dụng nó trong android – Ravi

+0

@Dainel giống như cách bạn sử dụng trên bất kỳ nền tảng nào khác - rangy chỉ là một tập hợp các tệp JavaScript. – spektom

+0

trong android getSelection() không trả lại bất cứ điều gì vì vậy nó có thể được rangy ?? – Ravi

9

Khi WebView đi vào "Chế độ lựa chọn", WebView không thực sự được sử dụng để chọn ... Nó đang được đẩy theo "WebTextView" (lớp riêng trong kho của Android) bắt chước vị trí văn bản, nhưng vẫn cho phép hình ảnh hiển thị qua và cho phép bạn "chọn" văn bản xuất hiện trong HTML thực tế. Sự cố xảy ra khi bạn cố gắng tương tác với WebView sau khi "chọn" văn bản. Đánh dấu và con trỏ xử lý ở đúng vị trí, nhưng chúng thực sự nằm trong WebTextView đặc biệt mà tôi đã đề cập, do đó bạn không thực sự có lựa chọn để nhận thông qua getSelection của JavaScript hoặc bất kỳ phương tiện nào khác trong JavaScript. Tôi đang làm việc để tạo ACTION_DOWN (của LongPress) kích hoạt lựa chọn và kéo và ACTION_UP của bản phát hành từ công việc kéo cho tôi qua JavaScript, nhưng nó rất lông, và không thân thiện với người dùng tại thời điểm này ...

http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/webkit/WebTextView.java.htm

kiểm tra nguồn gốc (đó là rất nhiều công việc để bắt chước lựa chọn văn bản thay vì cung cấp cho nó) nó là buồn, và hiện đang rất đau đớn cho một dự án nhóm chúng tôi đã thực hiện - đặc biệt là sau khi làm cùng ứng dụng cho iPad ...

+0

Bất kỳ tiến bộ nào về điều này? Làm thế nào để bạn có được một thể hiện của WebTextView cho việc lựa chọn? – Brian

+0

Bạn không thể. Đó là trình bao để cung cấp văn bản sống trong WebView, nhưng không truy cập vào WebView ... http: // stackoverflow.com/questions/6948447/android-3-0-webview-text-selection-javascript Tôi đã sử dụng Java để chụp chuyển động trong quá trình lựa chọn và JavaScript để cho phép lựa chọn trong chính WebView. – Dan

+0

Dan xin vui lòng gửi cho tôi một số mã tôi cần id và tagname của từ được chọn trong webview – Ravi

2

Cuối cùng, trong Android 4.4 KitKat, WebView hiện được dựa trên Chromium.

Vì vậy, chúng tôi có quyền truy cập vào window.getSelection() !!

wv.evaluateJavascript("console.log(window.getSelection().baseNode.nodeValue);", null); 

Thử nghiệm trên Nexus 5 & Nexus 7.

+0

Nếu sử dụng 'evalJavascript' tại sao không sử dụng giá trị trả về từ' ValueCallback'? 'EvaluateJavascript ("(function() {return window.getSelection(). BaseNode.nodeValue})()", mới ValueCallback () { @ Override public void onReceiveValue (String value) { Log.v (TAG, "CHỌN:" + giá trị); } }); } ' – Stan

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