Khi người dùng thực hiện thao tác chạm và giữ để chọn một từ và sau đó kéo ngón tay của họ về phía cạnh trên hoặc dưới của màn hình, trang sẽ tự động cuộn để phù hợp với lựa chọn.
đây là một đoạn phim ngắn chứng minh điều đó
Tôi muốn ngăn chặn hành vi này trong a WKWebView
.
Đây là những gì tôi đã cố gắng cho đến nay:
trong một bridge.js
tệp có thể truy cập vào webview:
var shouldAllowScrolling = true;
document.addEventListener('selectionchange', e => {
shouldAllowScrolling = getSelectedText().length === 0;
window.webkit.messageHandlers.selectionChangeHandler.postMessage(
{
shouldAllowScrolling: shouldAllowScrolling
});
console.log('allow scrolling = ', shouldAllowScrolling);
});
và sau đó trong một WKScriptMessageHandler
thực hiện:
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
{
switch message.name
{
case "selectionChangeHandler":
let params = paramsDictionary(fromMessageBody: message.body)
let shouldEnableScrolling = params["shouldAllowScrolling"] as? Bool ?? true
cell?.webView.scrollView.isScrollEnabled = shouldEnableScrolling
cell?.webView.scrollView.isUserInteractionEnabled = shouldEnableScrolling // not together with the line above
default:
fatalError("\(#function): received undefined message handler name: \(message.name)")
}
}
Tương tự, tôi đã thử gọi preventDefault()
hàm trực tiếp trong tệp javascript cho một loạt các sự kiện, cụ thể là scroll
và touchmove
như vậy:
document.addEventListener('touchmove', e => {
if (!shouldAllowScrolling) {
e.preventDefault()
}
}, {passive: false});
cả hai phương pháp đều ngăn cuộn thành công khi một số văn bản được chọn nhưng không ghi đè hành vi được mô tả ở đầu câu hỏi của tôi.
Tôi có thể chấp nhận các giải pháp trong cả Swift và JavaScript hoặc kết hợp cả hai.