GVKun编程网logo

javascript – 在contenteditable span中插入无法移动光标

13

对于想了解javascript–在contenteditablespan中插入无法移动光标的读者,本文将提供新的信息,并且为您提供关于DivwithcontentEditable不会使用Javascr

对于想了解javascript – 在contenteditable span中插入无法移动光标的读者,本文将提供新的信息,并且为您提供关于Div with contentEditable不会使用Javascript发布到表单中、HTML/JAVASCRIPT:在contentEditable = true中禁用HTML内容、Javascript Contenteditable-将Cursor / Caret设置为索引、javascript – contenteditable =“true”div字符限制的有价值信息。

本文目录一览:

javascript – 在contenteditable span中插入无法移动光标

javascript – 在contenteditable span中插入无法移动光标

我希望所有文本和中断都在跨越,以下代码执行.在IE11和Chrome中完美运行但在FF中存在严重问题.也就是说,如果输入的第一个键是<输入>,光标无法移动到插入后的< br>.插入符号位置似乎随着输入的下一个键位于下一行而移动,但闪烁的光标不会.此外,如果退格以移除字符,则光标返回到第一行.

最简单的演示方式:http://jsfiddle.net/jd2d7n3L/20/

>输入第一个字符<输入>
>预期结果(在chrome和IE10中发生的情况)是闪烁的光标向下移动一行.
>输入’a’然后退格.预期的结果是闪烁光标在第2行最左边

我在SO上已经阅读了许多与此相关的类似问题和答案,但没有具体处理这种情况.我怎样才能使FF表现出来?

HTML

<div id=bE contenteditable="true"><br></div>

JS

bE.addEventListener("keypress",KP);
bE.addEventListener("keypress",KU);

function getContainer()
  {
  var eC=window.getSelection().getRangeAt(0).endContainer;
  while(eC&&eC.nodeType==3)eC=eC.parentNode;
  return eC
  }

function insertElement(E)
  {
  var sel=window.getSelection(),range=sel.getRangeAt(0);
  range.deleteContents(); 
  range.collapse(true);
  range.insertNode(E);
  range.setStartAfter(E);
  range.collapse(true);
  sel.removeAllRanges();
  sel.addRange(range);     
  }

function KP(e)
  {
  var kc=e.which||e.keyCode;
  if(e.charCode||e.which===13)
    {
    var sel=window.getSelection(),range=sel.getRangeAt(0);
    var eC=getContainer();
    if(eC===bE)
      {
      eC=document.createElement("span");
      range.insertNode(eC);
      range.selectNodeContents(eC);
      sel.removeAllRanges();
      sel.addRange(range);
      }
    if(kc===13)insertElement(document.createElement("br"));
    else       insertElement(document.createTextNode(String.fromCharCode(kc)));

    e.preventDefault();
    }
  }

function KU(e) //ensures last element is br
  {
  if(!bE.lastChild||bE.lastChild.nodeName.toLowerCase()!=="br")bE.appendChild(document.createElement("br"))
  }

解决方法

好的,我终于把它钉了起来.似乎Firefox不喜欢< br>作为任何父级的最后一个子节点.如果你将一个空的textnode附加到每个尾随< br>,它的作品! Firefox<<>之后不会移动插入符号. br>如果它是最后一个childNode.

Div with contentEditable不会使用Javascript发布到表单中

Div with contentEditable不会使用Javascript发布到表单中

Okai,所以我有这个div:

// DESCRIPTION AREA
$body_html .= "<div id='seq-desc-".$seq_id_d."' contenteditable='true' data-text='Det som skal skje...'>";
$body_html .= $seq_desc_d;
$body_html .= "</div>&nbsp;";

而这个textarea:

$body_html .= "<textarea id='seq-desc-area-".$seq_id_d."' name='deta-".$seq_id_d."'></textarea></td>";

在我的表单中,我使用以下代码来激活我的Javascript代码:

"<form action='planner_seq_save.PHP' id='save-".$seq_id_d."' name='save-".$seq_id_d."' method='POST' onsubmit='return getContent".$seq_id_d."'>";

getContent定义如下:

function getContent'.$seq_id_d.'(){
    document.getElementById("seq-desc-area-'.$seq_id_d.'").value = document.getElementById("seq-desc-'.$seq_id_d.'").innerHTML;
}

为什么我在使用POST时在数据库中获得空返回?
我使用$_POST [‘deta-(id)’]来获取我的帖子.

此外,我使用此代码在标准按钮上保存我的表单.这可以使提交无效吗?

onclick='document.forms['save-".$seq_id_d."'].submit();'

一直试图找出问题是暂时的,我真的需要别人的意见.

更新:

使用console.log()我在函数中没有返回.所以该功能没有运行.

完整代码可以找到here

解决方法

看起来在触发submit()方法时不会触发提交事件,因此不会调用onsubmit处理程序. See another question for more info.

所以你可以尝试删除onsubmit处理程序并从onclick的一个触发getContent函数:

的onclick = ‘submitForm(ID)’

function submitForm(id){
    getContent(id);

    document.forms(id).submit();
}

HTML/JAVASCRIPT:在contentEditable = true中禁用HTML内容

HTML/JAVASCRIPT:在contentEditable = true中禁用HTML内容

我想要的是?

我想要一个像textarea一样工作的div,我不希望能够在div中编辑东西,并粘贴图像等等纯文本.

www.facebook.com
– 最好的例子是facebook的新闻源.

为什么我需要这种方式?

如果您查看Facebook的新闻源,您可以看到您可以撰写帖子的区域,在您撰写帖子或进行大量输入时进行扩展.

这就是为什么我想使用带有contentEditable的div的原因,因为在textarea中我不能这样做.
#

请不要只是JAVERY JAVASCRIPT

解决方法

使用纯JavaScript而不使用框架的可调整大小的Textarea:
<html>
    <head>
        <script>
            function taOninput()
            {
                var dis = this;
                setTimeout(
                    function(){
                        var span = document.createElement("div");
                        span.innerHTML = escape(dis.value).replace(/[%]0A/g,"<br/>")+"<br/>."; //Extra BR for padding... TextArea uses %0A,not \n
                        span.style.width = dis.offsetWidth+"px";
                        span.style.padding = "0px";
                        span.style.fontFamily = "Lucida Console";
                        document.body.appendChild(span); //Offset height doesnt work when not in DOM tree i guess =/? or is it a hack
                        dis.style.height = span.offsetHeight+"px";
                        document.body.removeChild(span);
                    },1
                ); //setTimeout=hack,since oKP is called BEFORE character append.  
            }
            window.onload = function()
            {
                var resizableTA = document.getElementById("resizableTA");
                resizableTA.onkeypress = taOnInput;
            }
        </script>
        <title>ItzWarty - Untitled Document</title>
    </head>
    <body>
        <textarea id="resizableTA">Trololololol</textarea>
    </body>
</html>

非常hackish,在不到10分钟内把它放在一起.希望它至少能给你一个想法.

仅在Google Chrome 5.0.308.0上测试过

代码解释,因为我在评论时失败了
1)在window.onload之前,已创建id为“resizableTA”的textarea并将其附加到DOM树的document.body.
2)window.onload附加一个事件处理程序,taOnInput [输入上的textarea].
3)输入上的textarea创建一个虚拟跨度,将其宽度强制为textarea的宽度,并将字体样式强制为“Lucida Console”,其中AFAIK是textareas的默认字体,将textarea的值复制到span的innerHTML,同时替换
[textareas使用的换行符]和[换行符] …
4)span的offsetHeight是跨度的高度,现在可用于强制textarea的高度.

任何人都可以确认Lucida Console是textarea的默认字体吗?是Consola?快递新?我假设任何固定宽度的字体都可以.我不使用Mac,所以我不知道它与windows共享的字体,不过我认为Courier New是更好的选择……

Javascript Contenteditable-将Cursor / Caret设置为索引

Javascript Contenteditable-将Cursor / Caret设置为索引

我该如何修改它如何在contenteditable元素(div)中设置caret(cursor)位置?使其接受数字索引和元素,并将光标位置设置为该索引?

例如:如果我有以下段落:

<p contenteditable="true">This is a paragraph.</p>

我打电话给:

setCaret($(this).get(0),3)

光标将移动到索引3,如下所示:

Thi|s is a paragraph.

我有这个,但是没有运气:

function setCaret(contentEditableElement,index)
{
    var range,selection;
    if(document.createRange)//Firefox,Chrome,Opera,Safari,IE 9+
    {
        range = document.createRange();//Create a range (a range is a like the selection but invisible)
        range.setStart(contentEditableElement,index);
        range.collapse(true);
        selection = window.getSelection();//get the selection object (allows you to change selection)
        selection.removeAllRanges();//remove any selections already made
        selection.addRange(range);//make the range you have just created the visible selection
    }
    else if(document.selection)//IE 8 and lower
    { 
        range = document.body.createTextRange();//Create a range (a range is a like the selection but invisible)
        range.moveToElementText(contentEditableElement);//Select the entire contents of the element with the range
        range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start
        range.select();//Select the range (make it the visible selection
    }
}

javascript – contenteditable =“true”div字符限制

javascript – contenteditable =“true”div字符限制

参见英文答案 > Limiting Number of Characters in a ContentEditable div10个
嗨,我试图限制contenteditable =“true”div中的文本:
var char = 500;
$("#counter").append("You have <strong>" + char + "</strong> chars left.");
$("#editor").keypress(function () {
    if ($(this).text().length > char) {
        $(this).text($(this).text().substr(1));
    }
    var rest = char - $(this).text().length;
    $("#counter").html("You have <strong>" + rest + "</strong> chars left.");
    if (rest <= 100) {
        $("#counter").css("color","#ff7777");
    }
    else {
        $("#counter").css("color","#111111");
    }
});

不幸的是,我面临以下问题:

>如果div默认包含任何文本,则在插入或删除任何文本之前,不会更新剩余的字符数.
>如果用户超过最大字符数,则滑架将转到文本框的开头并删除第一个字符而不是最近插入的字符.
>如果用户粘贴超过200个字符的文本,则不会缩短.

请找到代码:
http://jsfiddle.net/mmacin/A69tk/1/

解决方法

这是我提供解决方案的方法.它有一块拼图遗失,我很快就会完成.

这是fiddle

计数器现在可以正常工作.如果用户超出限制应该做什么,剩下的是什么.

如果你使用了twitter,你会看到他们没有删除额外的字符,但是高亮显示那些带有红色选择的字符向用户显示这些字符不会成为推文的一部分.也许这样的选择会更好

这是我使用的jQuery.

const limit = 200;
rem = limit - $('#editor').text().length;
$("#counter").append("You have <strong>" + rem + "</strong> chars left.");
$("#editor").on('input',function () {
    var char = $('#editor').text().length;
    rem = limit - char;
    $("#counter").html("You have <strong>" + rem + "</strong> chars left.");
    console.log(char)
    console.log(rem);
    if (char >= 100) {
        $("#counter").css("color","#ff7777");
    }
    else
        $("#counter").css("color","#111111");
    if(char>200)
    {
        //add code to either remove extra chars or highlight them.
    }

});

如果你看到我使用了$(“#editor”).on(‘input’,function()将检查textarea中的输入而不是按键,这样就可以处理文本内部的用户复制粘贴文本我也改变了计数器的工作方式.我相信你可以自己弄清楚逻辑.

关于javascript – 在contenteditable span中插入无法移动光标的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Div with contentEditable不会使用Javascript发布到表单中、HTML/JAVASCRIPT:在contentEditable = true中禁用HTML内容、Javascript Contenteditable-将Cursor / Caret设置为索引、javascript – contenteditable =“true”div字符限制的相关知识,请在本站寻找。

本文标签: