- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
事情是这样的:
内容编辑很糟糕。 Firefox 使用类似 div1
的方式处理它,而 Chrome 则使用 div2
的方式处理它。
两者具有相同的文本内容(从用户的 Angular 来看),但它们的结构方式不同。
当我使用 innerText
获取两个文本内容时,我会得到不同的结果,因为它们的结构方式不同。
有没有办法获取这些文本并返回相同的字符串(因为它们在屏幕上生成完全相同的文本)?
类似于:
div1 = div2 = "Line1\nLine2\n\nLine3\n\n\nLine4"
(事实上,这是 div1
结果,因为它仅由文本和中断)。在本例中,div2
就是问题所在。
我需要的伪代码:
“根据屏幕上显示的内容获取这些 div
的文本内容以及中断数量。”
最终目标:
为了在两个结构中一致地粘贴新文本,我需要一种以相同方式处理它们的方法。
const div1 = document.getElementById('div1');
const div2 = document.getElementById('div2');
const p1 = document.getElementById('p1');
const p2 = document.getElementById('p2');
p1.innerText = JSON.stringify(div1.innerText);
p2.innerText = JSON.stringify(div2.innerText);
#div1 {
border: 1px dotted blue;
}
#div2 {
margin-top: 40px;
border: 1px dotted red;
}
<div id="div1" contenteditable>
Line1
<br>
Line2
<br>
<br>
Line3
<br>
<br>
<br>
Line4
</div>
<p><b>Div1 innerText:</b></p>
<p id="p1"></p>
<div id="div2" contenteditable>
<div>Line1</div>
<div>Line2</div>
<div><br></div>
<div>Line3</div>
<div><br></div>
<div><br></div>
<div>Line4</div>
</div>
<p><b>Div2 innerText:</b></p>
<p id="p2"></p>
最佳答案
我在评论中建议您改造您的 <div>
的内容变成 <textarea>
元素。此解决方案避免了 Firefox 和 Chrome 之间的行为差异。
下面是一个关于如何实现它的简单示例。我想您将能够根据您想要的内容进行调整(例如将 <p>
切换为 <div>
)。
const contentEditable = document.querySelector('#content-editable'),
htmlPreview = document.querySelector('#html-preview');
htmlPreview.innerText = contentEditable.innerHTML;
contentEditable.addEventListener('click', contentEditableHtmlToTextarea);
/**
* Converts HTML of #content-editable into <textarea>.
*/
function contentEditableHtmlToTextarea() {
const textarea = document.createElement('textarea'),
height = contentEditable.offsetHeight;
// Converts <p> tags to \r\n.
textarea.value = this.innerHTML
.replace(/^\s*/gm, '')
.replace(/<p>(.*?)<\/p>/g, '$1\r\n')
.trim();
// Updates #content-editable HTML.
this.innerHTML = '';
this.appendChild(textarea);
textarea.style.height = `${height}px`;
htmlPreview.style.display = 'none';
this.removeEventListener('click', contentEditableHtmlToTextarea);
// A bit tricky, but without timeout, the callback is directly called.
setTimeout(() => {
document.addEventListener('click', contentEditableTextareaToHtml);
}, 0);
}
/**
* Converts <textarea>'s value into HTML for #content-editable.
*/
function contentEditableTextareaToHtml(e) {
const textarea = contentEditable.querySelector('textarea'),
// Converts lines into <p> tags.
html = textarea.value.replace(/^(.+?)$/gm, '<p>$1</p>');
// Checks if the mouse click is outside the <textarea>.
if (e.target !== textarea) {
// Updates #content-editable HTML.
textarea.remove();
contentEditable.innerHTML = html;
htmlPreview.innerText = contentEditable.innerHTML;
htmlPreview.style.display = 'block';
document.removeEventListener('click', contentEditableTextareaToHtml);
contentEditable.addEventListener('click', contentEditableHtmlToTextarea);
}
}
div {
padding: 3px;
border: 1px solid #000;
}
textarea {
margin: 0 auto;
display: block;
width: 98%;
}
<div id="content-editable">
<p>Line 1</p>
<p>Line 2</p>
<p>Line 3</p>
</div>
<pre id="html-preview"></pre>
关于javascript - 如何从这两个内容相同但结构不同的 contenteditable div 中获取相同的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55843903/
我希望能够将包裹在跨度中的图像插入到可编辑的 div 中。我可以做到这一点没问题,但是当我开始打字时,在图像之后,它会将我的文本插入到图像跨度中。如何在刚刚插入的跨度之后定位光标? Here是我的 f
我正在尝试将一些 MathJax 代码插入到 contentEditable div 中,如下所示: 和 JS $(document).ready(funct
我对父级 contenteditable="true"中的嵌套 contenteditable="false"元素有非常不同的行为: I'm supposed to be edit
问题: 我在 Chrome 和 Opera 中观察到一个不受欢迎的行为,当一个连接两个 p通过删除它们之间的分隔来标记。 Chrome 和 Opera 删除 contenteditable=false
我在渲染我的组件时收到以下警告: Warning: A component is contentEditable and contains children managed by React. It
我们已经使用单列网格实现了 React-Vitualized,其中的行为键盘事件 (onKeyUp/onKeyDown/onKeyPress) 启用。我们正在使用 Arrow-Key-Stepper
我有一个 contenteditable div,它包含几个 dontEdit 类的 span。有没有一种方法可以使 span 不可编辑,而 div 的其余部分保持可编辑。 editable
我正在尝试绑定(bind)一个 vue.js 事件以通过 contenteditable=true 检测元素上的更改。 这触发了我的vue.js vue中的trigger方法,但是我好像抓不到模型值
请参阅以下示例: Codepen example Some more text here not editable Hi this is my content $(document).on(
奇怪的是,这只在 Firefox 和 Opera 中被破坏(IE、Chrome 和 Safari 可以正常工作)。 有什么快速修复的建议吗? http://ajax.googleapis.co
无论如何我可以使用这样的东西: console.log(e)}>Testing 内部react-contenteditable处理 Testing 的点击关键字? 当我使用 html 属性时,它只需
我的插入符不在跨度之间,下面的例子 REPLY||stick together||CONFIRM||stick together||Name||stick together||Office 我所有的跨
我在使用 contenteditable 元素时遇到了不希望的行为。在 contenteditable=true 的父元素中嵌套 contenteditable=false 的 block 元素时,我
我有一个 div,它通过使用 contenteditable 用作“输入”,并且在启用时效果很好。但是在一种情况下,我需要通过设置 contenteditable='false' 来禁用“输入”,这会
目标:将 keydown 事件处理程序附加到作为 contenteditable div 子元素的 contenteditable span。 问题:如果您输入跨度,则会触发父事件而不是子事件。我想要
我有以下 HTML 旨在确保内部 span 不可编辑。这适用于其他浏览器,但不适用于 IE8。 Luke, I am your father. I'm your son?! Ewww!
我的网页中有一个 contenteditable div,但现在我需要的是,当超过 div 的最大高度时,将自动创建相同的新 div。 div 看起来也和之前的一样。不仅一个 div 会出现,它会是
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
从我读到的内容来看,浏览器在处理 contenteditable 元素方面存在相当多的差异。 (即 link )。当“contenteditable=true”元素包含“contenteditable
当我清除一个contenteditable div的内容时,光标立即丢失,我无法通过点击将其恢复。所以如果我清除一次就无法添加任何内容。 在这里检查一下: asdasd x 删除第一行的“
我是一名优秀的程序员,十分优秀!