contentEditable and lastChild IE, Firefox & Chrome LastC
contentEditable and lastChild IE, Firefox & Chrome LastChild
长问题表示歉意,但我尝试了很多东西,做了一些研究,但没有找到太多的解决方案。我有一个内容可编辑的div。
<div contentEditable=true onkeyup='showResult(this.lastChild.textContent)'></div>
当用户在此div中键入某些内容时,showResult javascript运行,这基本上是一个ajax请求,它返回匹配的项目列表。当用户单击其中一个建议时,说出名称"John",带有建议的跨度将添加到此内容可编辑的div 中,如下所示:
<div contentEditable=true onkeyup='showResult(this.lastChild.textContent)'>
<span id='uniqueId1' class='SpanClass' contentEditable='false'>John</span>
</div>
选择一个名称后,用户可能想要搜索另一个名称。它是HTML术语,这意味着他们将输入以下内容:
<div contentEditable=true onkeyup='showResult(this.lastChild.textContent)'>
<span id='uniqueId1' class='SpanClass' contentEditable='false'>John</span>
New User Text Goes Here
</div>
在 Chrome 上,当用户继续尝试在div 中键入内容时,就会发生正确的行为 - showResult 函数在用户键入的新文本上运行,并忽略 span 元素。例如,如果用户键入"Fr"并且已经选择了 John,它将忽略第一个子项 (John(,并通过 ajax 发送用户键入的内容并返回 Fred 和 Frankie 等建议。
但是,在IE中,跨度仍然是内容可编辑的,用户不能添加除跨度之外的任何文本,这似乎没有意义,因为它显然是contentEditable=false 因此,ajax请求在"John"文本以及用户接下来键入的任何内容上运行,这不是我想要实现的。
最后,在 Firefox 中,跨度不是 contentEditable,而是 lastChild 位只拾取跨度内的文本,并忽略用户输入的文本。
我已经控制台记录了showResult(this.lastChild.textContent(的结果,以查看发送到ajax请求的内容。
在Chrome中,在"John"跨度后的框中输入"Fr"会将"Fr"发送到ajax并返回正确的结果。
在IE中,在框中输入"Fr"会发送"JohnFr">
在 Firefox 中,输入"Fr"只会发送"John"。
由于问题出在这个 lastChild 和 span 上,我还包含了创建 span 元素的 Javascript。这仅在返回成功结果并单击结果后激活。(请原谅非常混乱的Javascript/Jquery(
$('body').on("click", '.TagHints', function(){
//Once you click on the suggestion
var ThisData = $(this).data("id");
var ThisId = $(this).attr("id");
var ThisTag = $(this).data("tag");
//delete the text that the user typed in
elementToRemove = document.getElementById("FakeInput").lastChild;
document.getElementById("FakeInput").removeChild(elementToRemove);
var TagDiv = document.createElement('span');
TagDiv.className = 'SpanClass';
TagDiv.id = ThisId;
TagDiv.innerHTML = ThisTag;
TagDiv.contentEditable=false;
//append the Span to the contentEditable div
document.getElementById("FakeInput").appendChild(TagDiv);
var TagHints = document.getElementsByClassName("TagHints");
while(TagHints.length > 0){
TagHints[0].parentNode.removeChild(TagHints[0]);
}
});
为什么这三种浏览器的行为完全不同,我如何让它们都像 Chrome 一样运行?有没有更好的方法让文本不在跨度中?
我读到另一个答案,在这种情况下,Firefox 喜欢输入,IE 喜欢中断,但两者似乎都不适合我。
良好解决方案的一大障碍是jQuery在第6行之后停止工作,这也完全让我感到困惑。如果有人能解释为什么它不起作用,那也很酷。也许与它是一个 ajax 查询和加载 jquery 后创建的内容有关?
感谢您的帮助!
所以,虽然我没有任何回应,但我想出了一个解决方法。但是,lastChild 在三个浏览器之间的行为仍然不同,因此希望有任何进一步的输入。
答案是在文档就绪部分有一个函数,该函数克隆原始div,剥离其子级,并使用Jquery抓取键上的文本。然后将结果传递给 showResult 函数,如下所示:
$('#FakeInput').keyup(function(){
var ThisClone = $('#FakeInput').clone()
.children()
.remove()
.end()
.text();
showResult(ThisClone);
});
同样,当用户进行选择时,我不会尝试从div 中删除用户键入的文本,我只是使用它们的类克隆了跨度中的项目,然后清空了div 的内容并重新附加这些克隆的div。
var TagItems = $('.TagItems').clone();
$('#FakeInput').empty();
$('#FakeInput').append(TagItems);
此解决方案适用于三种浏览器。
- Javascript链接-试图设置元素值-奇怪的行为chrome&安卓
- 如何在chrome中使用jquery操作剪贴板数据,IE 8&9
- CSS:禁用页眉&Chrome打印预览页脚
- 桌面Chrome&Firefox浏览器
- 为什么以下javascript在InternetExplorer&Mozilla,但在谷歌chrome中运行良好
- 访问V8 JavaScript中的行号(Chrome&Node.js)
- 将数组的值存储到Chrome本地存储&取回它们
- Node.js-样式没有't应用于页面&谷歌Chrome表示:未捕获语法错误:意外的令牌<
- chrome&safari会将内容作为字符串插入
- 放大&缩小在chrome中不起作用
- Node.js的子进程套接字写入在Chrome&FF
- 滚动到不在Chrome中工作&歌剧
- Chrome扩展:显示&隐藏元素
- 定时器JavaScript未在Chrome&最小化窗口时的Mozilla
- 点击提交按钮禁用然后表单提交在firefox上工作,但不在chrome&狩猎
- 拖动&将Json放入Chrome
- Chrome中的错误&Safari在向下滚动时向导航添加一个粘性固定类,使其滚动到顶部
- 鼠标悬停事件显示:none(隐藏)元素(chrome&opera)
- 表单提交&JavaScript无法在IE、Firefox或Safari中工作;在Chrome中运行良好
- Chrome&Firefox日期功能不同.(新日期)