Выполнить код Javascript в Оксид

Я ищу оксидную эквивалентность этой функции QtWebKit:

WebView.experimental.evaluateJavaScript()

Или WebKitGtk

WebView.execute_script()

У меня проблемы с поиском документации об оксиде. Эта статья содержит полезную информацию, но не совсем то, что я пытаюсь сделать: http://daker.me/2014/05/how-to-use-oxide-in-your-ubuntu-qml-application. HTML

2
задан 9 July 2014 в 14:06

1 ответ

Нет никакого встроенного эквивалента, но можно воспроизвести это поведение путем установки обработчика сообщений в пользовательском сценарии, который инициировал событие в DOM, который Вы обрабатываете в документе HTML. Для каждого из этих шагов проведен код, который будет выполняться. Для простого примера:

окись-test.qml

import QtQuick 2.0
import Ubuntu.Components 0.1
import com.canonical.Oxide 1.0

Rectangle {
    width: units.gu(50)
    height: units.gu(75)
    // Both the UserScript and the call to sendMessage need to share the same
    // context, which should be in the form of a URL.  It doesn't seem to matter
    // what it is, though.
    property string usContext: "messaging://"

    WebView {
        id: webview
        anchors {
            top: parent.top
            left: parent.left
            right: parent.right
            bottom: button.top
        }
        context: webcontext
        url: Qt.resolvedUrl("oxide-test.html")

        function executeJavascript(code) {
            var req = rootFrame.sendMessage(usContext, "EXECUTE", {code: code});
        }
    }

    WebContext {
        id: webcontext
        userScripts: [
            UserScript {
                context: usContext
                url: Qt.resolvedUrl("oxide-user.js")
            }
        ]
    }

    Button {
        id: button
        anchors {
            bottom: parent.bottom
            left: parent.left
            right: parent.right
        }
        text: "Press Me"
        onClicked: webview.executeJavascript("exampleFunc('Hello');")
    }
}

окись-user.js

oxide.addMessageHandler("EXECUTE", function (msg) {
    var event = new CustomEvent("ExecuteJavascript", {detail: msg.args.code});
    document.dispatchEvent(event);
});

oxide-test.html

<html>
<head>
<script>
    document.addEventListener("ExecuteJavascript", function (event) { eval(event.detail); });

    function exampleFunc(message) {
        document.body.innerHTML += "<p>" + message + "</p>";
    }
</script>
</head>

<body>
</body>
</html>

(Отмечают, что, если все Вы пытаетесь сделать, управляет DOM, можно сделать так из пользовательского сценария.)

Этот код не позволяет Вам получать результат выполнения. Можно быть в состоянии передать обратный вызов в, но я подозреваю, что это не будет на самом деле работать. Вместо этого необходимо будет настроить параллельную цепочку обмена сообщениями для возвращения результата к контексту QML.

4
ответ дан 9 July 2014 в 14:06

Другие вопросы по тегам:

Похожие вопросы: