当前位置: 首页 > 面试题库 >

从contentEditable div提取文本

郎恺
2023-03-14
问题内容

我将div设置为,contentEditable并设置了“ white-space:pre
样式,以便保留换行符。在Safari,FF和IE中,div的外观和工作原理几乎相同。一切都很好。我想做的是从该div中提取文本,但要确保其格式不会丢失-
特别是换行符。

我们使用的是jQuery,它的text()功能基本上是执行预定的DFS,并将DOM分支中的所有内容粘合在一起。这会丢失格式。

我看过该html()函数,但似乎所有这三种浏览器都使用contentEditablediv
幕后生成的实际HTML来执行不同的操作。假设我在div中输入以下内容:

1
2
3

结果如下:

Safari 4:

1
<div>2</div>
<div>3</div>

Firefox 3.6:

1
<br _moz_dirty="">
2
<br _moz_dirty="">
3
<br _moz_dirty="">
<br _moz_dirty="" type="_moz">

IE 8:

<P>1</P><P>2</P><P>3</P>

啊。这里没有什么非常一致的。令人惊讶的是,MSIE看起来最理智!(大写的P标签和全部)

div将使用CSS完成动态设置的样式(字体,颜色,大小和对齐方式),因此我不确定是否可以使用pre标签(在使用Google找到的某些页面上已经提到过)。

有谁知道任何JavaScript代码和/或jQuery插件,或会从contentEditable div中提取文本以保留换行符的方式吗?
如果不需要的话,我不想重塑解析轮。

更新:我getText从jQuery 1.4.2 抄写了该函数,并对其进行了修改,以便使用几乎完整的空格将其提取(我只在添加换行符的地方换了一行);

function extractTextWithWhitespace( elems ) {
    var ret = "", elem;

    for ( var i = 0; elems[i]; i++ ) {
        elem = elems[i];

        // Get the text from text nodes and CDATA nodes
        if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
            ret += elem.nodeValue + "\n";

        // Traverse everything else, except comment nodes
        } else if ( elem.nodeType !== 8 ) {
            ret += extractTextWithWhitespace2( elem.childNodes );
        }
    }

    return ret;
}

调用此函数,并使用其输出使用jQuery将其分配给XML节点,例如:

var extractedText = extractTextWithWhitespace($(this));
var $someXmlNode = $('<someXmlNode/>');
$someXmlNode.text(extractedText);

最终将生成的XML通过AJAX调用发送到服务器。

这在Safari和Firefox中效果很好。

在IE上,似乎只保留了第一个’\ n’。进一步研究,看起来jQuery正在像这样设置文本(jQuery-1.4.2.js的第4004行):

return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );

阅读createTextNode,看来IE的实现可能会混用空白。这是真的还是我做错了什么?


问题答案:

直到现在,当Nico对其悬赏时,我都忘记了这个问题。

我通过编写自己需要的功能,从现有的jQuery代码库中编写一个功能并对其进行修改以根据需要工作来解决了该问题。

我已经使用Safari(WebKit),IE,Firefox和Opera对该功能进行了测试。因为整个contentEditable都是非标准的,所以我没有费心检查其他任何浏览器。如果任何浏览器的更新更改了实现contentEditable的方式,也可能会破坏该功能。所以程序员要当心。

function extractTextWithWhitespace(elems)
{
    var lineBreakNodeName = "BR"; // Use <br> as a default
    if ($.browser.webkit)
    {
        lineBreakNodeName = "DIV";
    }
    else if ($.browser.msie)
    {
        lineBreakNodeName = "P";
    }
    else if ($.browser.mozilla)
    {
        lineBreakNodeName = "BR";
    }
    else if ($.browser.opera)
    {
        lineBreakNodeName = "P";
    }
    var extractedText = extractTextWithWhitespaceWorker(elems, lineBreakNodeName);

    return extractedText;
}

// Cribbed from jQuery 1.4.2 (getText) and modified to retain whitespace
function extractTextWithWhitespaceWorker(elems, lineBreakNodeName)
{
    var ret = "";
    var elem;

    for (var i = 0; elems[i]; i++)
    {
        elem = elems[i];

        if (elem.nodeType === 3     // text node
            || elem.nodeType === 4) // CDATA node
        {
            ret += elem.nodeValue;
        }

        if (elem.nodeName === lineBreakNodeName)
        {
            ret += "\n";
        }

        if (elem.nodeType !== 8) // comment node
        {
            ret += extractTextWithWhitespace(elem.childNodes, lineBreakNodeName);
        }
    }

    return ret;
}


 类似资料:
  • 问题内容: 我正在开发一个程序,该程序可以下载HTML页面,然后选择一些信息并将其写入另一个文件。 我想提取段落标签之间的信息,但是我只能获得段落的一行。我的代码如下: 我试图添加另一个while循环,这样可以告诉程序继续写入文件,直到该行包含该标记为止; 问题答案: so 我真正喜欢使用的另一个html解析器是jsoup。您可以 在2行代码中获得所有元素。 然后再将其写到文件中 或者,如果您希望

  • 问题内容: AJAX调用返回的响应文本包括JSON字符串。我需要: 提取JSON字符串 修改它 然后重新插入以更新原始字符串 我不太担心步骤2和3,但是我不知道如何执行步骤1。我当时在考虑使用正则表达式,但是我不知道该怎么做,因为我的JSON可能具有嵌套对象的多个级别或数组。 问题答案: 您不能使用正则表达式从任意文本中提取JSON。由于正则表达式通常不够强大,无法验证JSON(除非可以使用PCR

  • 我需要从大文件中提取文本(最大限制50MB)文件可能是doc、ppt、xls、txt或pdf格式。到目前为止,我使用了ApachePOI'http://poi.apache.org/' 用于Microsoft Office文档和PDFBox从PDF中提取文本。然而,随着文件变大,提取过程变得缓慢,特别是以下文件。到目前为止我取得的成果: 1. PPTX-45MB-3分钟apx 2.PDF-62MB

  • 问题内容: 我想知道是否可以仅使用Javascript将文本包含在PDF文件中?如果是,谁能告诉我如何? 我知道有一些服务器端的Java,C#等库,但我宁愿不使用服务器。谢谢 问题答案: 这是一个古老的问题,但是由于pdf.js多年来一直在发展,所以我想给出一个新的答案。也就是说,它可以在本地完成,而无需涉及任何服务器或外部服务。新的pdf.js具有一个函数:page.getTextContent

  • 对于任何给定的问题,很可能已经有人把答案写在某个地方了。以电子形式提供的自然语言文本的数量真的惊人,并且与日俱增。然而,自然语言的复杂性使访问这些文本中的信息非常困难。NLP目前的技术水平仍然有很长的路要走才能够从不受限制的文本对意义建立通用的表示。如果我们不是集中我们的精力在问题或“实体关系”的有限集合,例如:“不同的设施位于何处”或“谁被什么公司雇用”上,我们就能取得重大进展。本章的目的是要回

  • 问题内容: 我只想从汤中最上面的元素中提取文本;但是汤.text也会给出所有子元素的文本: 我有 输出为。我只想“是”。 实现此目标的最佳方法是什么? 编辑 :我也想在解析’ ‘时输出。 问题答案: 那又如何呢? 编辑: 我想我已经了解了你现在想要的。尝试这个: