如何使 div 元素可编辑(就像单击时的 textarea 一样)?

IT技术 javascript jquery
2021-01-24 11:58:20

这是我的代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
        <meta name="viewport" content="width=device-width, user-scalable=no"> 
    </head> 
<body> 
        <style type="text/css" media="screen"> 

        </style> 

        <!--<div id="map_canvas" style="width: 500px; height: 300px;background:blue;"></div>-->

        <div class=b style="width: 200px; height: 200px;background:pink;position:absolute;left:500px;top:100px;"></div>
        <script src="jquery-1.4.2.js" type="text/javascript"></script>
        <script src="jquery-ui-1.8rc3.custom.min.js" type="text/javascript"></script>
        <script type="text/javascript" charset="utf-8"> 

        </script> 
    </body> 
</html>

谢谢

6个回答

让我们解决它。

您不能使 div 可编辑。至少目前没有可编辑的 div 之类的东西。所以问题是找出用于编辑的内容。一个 textarea 完美地工作。所以这个想法是以某种方式获得一个 div 当前所在的文本区域。

问题是我们如何以及从哪里获得 textarea。有多种方法,但其中一种方法是动态创建一个文本区域:

var editableText = $("<textarea />");

并将其替换为 div:

$("#myDiv").replaceWith(editableText);

textarea 现在就位。但它是空的,我们刚刚替换了 div 并失去了一切。所以我们需要以某种方式保留 div 的文本。一种方法是在替换之前复制 div 中的 text/html:

var divHtml = $("#myDiv").html(); // or text(), whatever suits.

一旦我们从 div 中获得了 html,我们就可以填充 textarea 并安全地用 textarea 替换 div。并在 textarea 内设置焦点,因为用户可能想要开始编辑。结合到目前为止的所有工作,我们得到:

// save the html within the div
var divHtml = $("#myDiv").html();
// create a dynamic textarea
var editableText = $("<textarea />");
// fill the textarea with the div's text
editableText.val(divHtml);
// replace the div with the textarea
$("#myDiv").replaceWith(editableText);
// editableText.focus();

它是有功能的,但是当用户单击 div 时没有任何react,因为我们没有设置任何事件。让我们把事件联系起来。当用户单击任何 div 时$("div").click(..),我们创建一个单击处理程序,并执行上述所有操作。

$("div").click(function() {
    var divHtml = $(this).html(); // notice "this" instead of a specific #myDiv
    var editableText = $("<textarea />");
    editableText.val(divHtml);
    $(this).replaceWith(editableText);
    editableText.focus();
});

这很好,但我们想要一种在用户点击或离开 textarea 时恢复我们的 div 的方法。blur当用户离开控件时会触发表单控件事件。这可用于检测用户何时离开 textarea,并替换回 div。这次我们完全相反。保留textarea的值,创建一个动态div,设置为html,替换掉textarea。

$(editableText).blur(function() {
    // Preserve the value of textarea
    var html = $(this).val();
    // create a dynamic div
    var viewableText = $("<div>");
    // set it's html 
    viewableText.html(html);
    // replace out the textarea
    $(this).replaceWith(viewableText);
});

一切都很好,除了这个新的 div 将不再在点击时转换为 textarea。这是一个新创建的 div,我们必须click再次设置该事件。我们已经有了完整的代码,但比重复两次要好,最好是用它来制作一个函数。

function divClicked() {
    var divHtml = $(this).html();
    var editableText = $("<textarea />");
    editableText.val(divHtml);
    $(this).replaceWith(editableText);
    editableText.focus();
    // setup the blur event for this new textarea
    editableText.blur(editableTextBlurred);
}

由于整个操作是双向可逆的,我们需要对 textarea 执行相同的操作。让我们也把它转换成一个函数。

function editableTextBlurred() {
    var html = $(this).val();
    var viewableText = $("<div>");
    viewableText.html(html);
    $(this).replaceWith(viewableText);
    // setup the click event for this new div
    $(viewableText).click(divClicked);
}

将所有内容连接在一起,我们有 2 个函数,divClickededitableTextBlurred下面的行触发了所有内容:

$("div").click(divClicked);

http://jsfiddle.net/GeJkU/查看此代码无论如何,这都不是编写可编辑 div 的最佳方式,而只是一种开始并逐步解决解决方案的方式。老实说,在写这篇长篇文章时,我和你学到的一样多。注销,再见!

为什么我们需要遵循所有这些?我们不能使用属性 contenteditable="true" 使 div 可编辑。我已经使用它很多次了,从来没有遇到过任何问题。
2021-03-24 11:58:20
解释得好!!谢谢 !!
2021-03-26 11:58:20
我根据你的想法做了一个 jquery 插件:jquery-html-editable
2021-03-30 11:58:20
还有其他各种现有的在位编辑器的jQuery在这个线程上市插件- stackoverflow.com/questions/708801/...EditableJeditable作为Sarfaraz已经提到的是一些好的,但我不知道是什么就地编辑得到任何与星球大战:d
2021-04-08 11:58:20
contenteditable="true"确实允许此功能。IE 从 5.5 开始支持,HTML5 为此提供
2021-04-09 11:58:20

要使<div>(或任何与此相关的元素)可编辑,您可以使用contenteditableHTML 属性。

例如:

<div contenteditable="true">Anything inside this div will be editable!</div>

更多信息在这里:https : //developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable

使链接保持活动状态的方法如下所示:stackoverflow.com/questions/12059211/...
2021-03-21 11:58:20
当 contenteditable="true" 与变为非活动状态的链接相关时,div 不再表现得像普通 div。
2021-04-10 11:58:20

使用contenteditable="true"属性进行划分。

根据 Anurag 的回答,我写了一个小的 jquery 插件:

https://github.com/zevero/jquery-html-editable

它允许您使所有 'div.myDiv' 元素可编辑:

$('body').html_editable('div.myDiv');

contenteditable有一些严重的缺陷。在我看来,最糟糕的是 Enter 使用上的跨浏览器不兼容。有关说明,请参阅此文章在 Firefox 中单击 Enter 回车会创建一个新段落,有效地将每行不够长的行间距加倍以换行。非常难看。

这不能回答 OP 的问题。这应该是一个评论。
2021-04-01 11:58:20