根据偏好绘制用户界面

发布于 2024-07-10 15:23:23 字数 215 浏览 11 评论 0原文

我想为我的 xulrunner (Firefox) 应用程序使用内置首选项系统。 但我不知道如何根据偏好轻松驱动用户界面。

用户可以指定主页列表,每个主页将显示在不同的选项卡中。 因为选项卡位于表示层,所以我想使用 xul 代码中的模板来创建它们。 这可能吗?

我还没有找到使用 xul 模板执行此操作的方法。 是否有替代模板系统允许我根据用户偏好更改 UI?

I want to use the built-in preference system for my xulrunner (Firefox) application. But I can't figure out how to easily drive the user interface based on preferences.

The user can specify a list of home pages, and each home page will show up in a different tab. Because the tabs are in the presentation layer, I'd like to create them using a template in the xul code. Is this possible?

I haven't seen a way to do this with xul templates. Is there an alternative templating system that would allow me to change the UI based on user preferences?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

慕烟庭风 2024-07-17 15:23:23

不,XUL 中的模板不够强大,因此您必须编写 JavaScript 代码来读取首选项并打开所需的选项卡。

No, templating in XUL is not powerful enough, so you're stuck with writing JavaScript code that reads the preferences and opens the needed tabs.

孤独陪着我 2024-07-17 15:23:23

XML.prototype.function::domNode = function domNode() {
    function addPrefix(prefix, name) {
        if (typeof(prefix) == "undefined" || prefix == null || prefix == "") {
            return name;
        } else {
            return prefix + ":" + name;
        }
    }

    function recurse(xml) {
        var domNode = document.createElementNS(xml.namespace().uri, addPrefix(xml.namespace().prefix, xml.localName()));

        for each (let attr in xml.@*::*) {
            let attrNode = document.createAttributeNS(attr.namespace().uri, addPrefix(attr.namespace().prefix, attr.localName()));
            attrNode.nodeValue = attr;
            domNode.setAttributeNode(attrNode);
        }
        if (xml.hasComplexContent()) {
            for each (let node in xml.*) {
                domNode.appendChild(recurse(node));
            }
        } else if (xml.hasSimpleContent()) {
            domNode.appendChild(document.createTextNode(xml));
        }
        return domNode;
    }

    return recurse(this);
};

var name = "example"
var xml = {name};

document.querySelector("#example-statusbar-panel").appendChild(xml.domNode());

尽管命名空间存在一些小故障,但它确实很有魅力。

你总是可以将 dom 转换回 XML

var str = serializer.serializeToString( xml.domNode() );

XML.prototype.function::domNode = function domNode() {
    function addPrefix(prefix, name) {
        if (typeof(prefix) == "undefined" || prefix == null || prefix == "") {
            return name;
        } else {
            return prefix + ":" + name;
        }
    }

    function recurse(xml) {
        var domNode = document.createElementNS(xml.namespace().uri, addPrefix(xml.namespace().prefix, xml.localName()));

        for each (let attr in xml.@*::*) {
            let attrNode = document.createAttributeNS(attr.namespace().uri, addPrefix(attr.namespace().prefix, attr.localName()));
            attrNode.nodeValue = attr;
            domNode.setAttributeNode(attrNode);
        }
        if (xml.hasComplexContent()) {
            for each (let node in xml.*) {
                domNode.appendChild(recurse(node));
            }
        } else if (xml.hasSimpleContent()) {
            domNode.appendChild(document.createTextNode(xml));
        }
        return domNode;
    }

    return recurse(this);
};

var name = "example"
var xml = {name};

document.querySelector("#example-statusbar-panel").appendChild(xml.domNode());

works as a charm, there's some minor glitches with namespaces though.

You could always convert dom back to XML with

var str = serializer.serializeToString( xml.domNode() );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文