【问题标题】:Catching newlines in textbox in XUL在 XUL 的文本框中捕捉换行符
【发布时间】:2012-02-17 05:27:08
【问题描述】:

问题:如何获取输入到如下所述创建的文本框中的字符串中的换行符?

动机:我正在尝试对 FireFox 扩展 (Zotero) 进行一些非常简单的修改,以使其更易于使用。此扩展程序允许您通过将标签输入文本框并按 Enter 来输入项目的标签。我希望能够一次输入一堆标签,方法是将它们作为字符串粘贴到文本框中,换行符作为标签之间的分隔符。选择换行符是因为其他字符是在标签本身中使用的可行选择。

问题:当我现在将一个字符串粘贴到输入文本框中时,它会删除所有换行符并用单个空格替换它们。我在扩展代码中找不到发生这种情况的任何地方,所以我认为它是文本框本身的属性。我正在尝试查找此文本框的文档,以查看是否有一些我可以使用的属性以便我可以捕捉换行符,但我对 JavaScript 和 HTML 不是很熟悉,并且找不到任何东西。我想找到可能侵入性最小的解决方案(一种不会改变文本框当前用于输入新条目并按 Enter 的方式的解决方案),以便可以将这种修改应用于扩展的核心版本。

资源: 到目前为止,我在网上发现的唯一一个讨论类似问题的是 this other question 关于在文本框中允许制表符而不是换行符。我不确定这是 HTML 问题(是否可以设置一个属性以允许保留换行符?)还是 JavaScript 问题(我需要重写下面引用的代码吗?)。我一直在尝试查看两者的文档,但到目前为止还没有找到任何东西(大多数 HTML 教程讨论的是文本区域而不是文本框)。

代码:这是创建文本框对象的代码(或者是方法还是表单?)我正在处理:

        <method name="showEditor">
            <parameter name="elem"/>
            <body>
            <![CDATA[
                // Blur any active fields
                /*
                if (this._dynamicFields) {
                    this._dynamicFields.focus();
                }
                */

                Zotero.debug('Showing editor');

                var fieldName = 'tag';
                var tabindex = elem.getAttribute('ztabindex');

                var tagID = elem.parentNode.getAttribute('id').split('-')[1];
                var value = tagID ? Zotero.Tags.getName(tagID) : '';
                var itemID = Zotero.getAncestorByTagName(elem, 'tagsbox').item.id;

                var t = document.createElement("textbox");
                t.setAttribute('value', value);
                t.setAttribute('fieldname', fieldName);
                t.setAttribute('ztabindex', tabindex);
                t.setAttribute('flex', '1');

                // Add auto-complete
                t.setAttribute('type', 'autocomplete');
                t.setAttribute('autocompletesearch', 'zotero');
                var suffix = itemID ? itemID : '';
                t.setAttribute('autocompletesearchparam', fieldName + '/' + suffix);

                var box = elem.parentNode;
                box.replaceChild(t, elem);

                // Prevent error when clicking between a changed field
                // and another -- there's probably a better way
                if (!t.select) {
                    return;
                }

                t.select();

                t.addEventListener('blur', function () {
                    document.getBindingParent(this).blurHandler(this);
                }, false);
                t.setAttribute('onkeypress', "return document.getBindingParent(this).handleKeyPress(event)");

                this._tabDirection = false;
                this._lastTabIndex = tabindex;

                return t;
            ]]>
            </body>
        </method>

【问题讨论】:

  • JavaScript(以及许多其他编程语言)中的换行符是\r\n(参见此处:jsfiddle.net/QmMPN)。尝试在扩展代码中搜索\r\n。这种情况也可能是 HTML 代码中的换行符在浏览器中显示为空格,除非您在 HTML 中放置 &lt;br&gt; 标记(或将 HTML 元素显示为块而不是内联)。我在代码中看不到任何与换行相关的内容。

标签: javascript firefox textbox firefox-addon xul


【解决方案1】:

这个问题实际上是关于 XUL,而不是 HTML。文本框对象的文档可以在这里找到:

https://developer.mozilla.org/en/XUL/textbox

需要设置的属性是换行符。通过将其设置为 'pasteintact' 可以保留换行符。

【讨论】:

    【解决方案2】:

    我不熟悉 Firefox 扩展,但常规文本框不会删除换行符。

    那里还有其他事情发生。可能是用于创建验证字符的标签。

    您需要更仔细地阅读源代码以找到它发生的位置,但这不是由于文本框(除非扩展程序有异常)。

    【讨论】:

    • 我查看了添加标签的代码。有一个方法叫做 addTag()。我在这个方法的开头添加了一个 alert(tagString) 来显示标签字符串。此时换行符已被剥离。上面引用的代码中的 document.createElement("textbox") 是否创建标准 HTML 文本框?我觉得找到有关此对象的更多信息可能会帮助我发现换行符被剥离的位置。在扩展的其他地方定义了一个函数,可以从文本中删除换行符,但我没有看到它在与标签相关的任何地方被调用。
    • 对该函数发出警报,看看它是否真的没有被调用。
    • 我试过了,没有弹出,所以我猜它至少没有使用那个功能。
    • 两个选项:联系插件的作者,或者剥离所有内容并做一个非常简单的插件,只是为了测试textarea,然后开始慢慢添加东西。
    • 感谢您的建议。我在原始帖子之前尝试了选项一,但仍然没有收到回复。选项二很棘手,因为插件非常复杂,所以很难撕掉所有东西,但我需要的部分已经不知道我的问题的答案,但我会继续玩它。我尝试打印出文本框元素的属性——它有很多。我需要一段时间才能弄清楚它们的全部用途,但我想我接下来会尝试检查它们。
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2010-09-22
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多