2

我有一个 webkit-sharp WebView,我用它来通过 LoadString 方法显示 HTML。

webview 放置在 ScrolledWindow 中, ScrolledWindow 放置在 Gtk Window 中。

我希望能够告诉 WebView 滚动到 HTML 的特定部分。通常,人们会使用锚来执行此操作。

我已经定义了一个锚点和一些 JavaScript 来跳转到该锚点,我通过 ExecuteScript 方法调用 JavaScript。这根本没有任何作用。

我还尝试向调用 JavaScript 的 HTML 添加一个按钮。这也无济于事。

我可以做些什么来完成这项工作,以便我可以滚动到页面中的已知位置?

更新:我可以通过将 HTML 保存到文件然后使用告诉它滚动的 URL 从那里加载来完成这项工作。但是我想避免这样做,因为在显示之前将页面写入磁盘会影响性能。

4

3 回答 3

0

你是如何添加到 ScrolledWindow 的?我不是 GTK 专家,但我发现如果你调用“add”方法它会起作用,如果你调用 add_with_viewport 就不起作用

此外,您可能不需要执行 javascript。看起来您可以控制 html 页面,并且可以轻松访问 dom 元素并在元素上调用 click 方法。以下示例 python 代码查找 id 为“one”的锚点并滚动到所需位置而不调用 javascript。

from gi.repository import WebKit 
from gi.repository import Gtk 
from gi.repository import GLib, GObject

class WebkitApp:
    def exit(self, arg, a1):
        Gtk.main_quit()

    def onLoad(self, view, frame):
        doc = view .get_dom_document()
        a = doc.get_element_by_id("one")
        a.click()

    def __init__(self):
        win = Gtk.Window()
        self.view = WebKit.WebView()

        # Signal Connections
        self.view.connect("onload-event", self.onLoad)
        file = open("/tmp/epl-v10.html")
        html = file.read()
        self.view.load_string(html, "text/html", "UTF-8", "file:///tmp")
        sw = Gtk.ScrolledWindow() 
        # sw.add_with_viewport(self.view)
        sw.add(self.view);
        win.add(sw)
        win.maximize()
        win.connect("delete-event", self.exit)
        win.show_all()

app = WebkitApp()

Gtk.main()      
于 2013-03-31T15:43:33.913 回答
0

跳转到该锚点的 JavaScript 在页面仍在加载时不起作用,通过等待页面加载完成(有一个事件)然后运行脚本我使它工作。

于 2013-04-23T11:27:41.037 回答
0

给定一个元素:

<a id='myElement'>I want to scroll to this line</a>

这可以用这个 JavaScript 滚动到:

document.getElementById('myElement').scrollIntoView();

可以使用 ExecuteScript 方法在 WebView 中执行,例如:

_webView.ExecuteScript("document.getElementById('myElement').scrollIntoView();");
于 2015-10-14T14:59:08.770 回答