javascript - 如何使用 Javascript 操作突出显示的文本
问题描述
我正在尝试创建一个所见即所得的 HTML 编辑器。现在我们可以将文本左对齐、居中和右对齐。如果用户突出显示某些文本并单击粗体或斜体按钮,我想添加。我想让它变得大胆。
我得到像这样突出显示的文本
const getHighlightedText = () => {
let text = '';
if (window.getSelection) {
text = window.getSelection().toString();
} else if (
document.selection &&
document.selection.type != 'Control'
) {
text = document.selection.createRange().text;
}
return text;
};
现在如何在 strong 或 em 标签中添加文本。我想到了使用字符串替换。但如果我们多次使用相同的文本,它就不会正确。
我怎样才能做到这一点?
$(document).ready(() => {
const getHighlightedText = () => {
let text = '';
if (window.getSelection) {
text = window.getSelection().toString();
} else if (
document.selection &&
document.selection.type != 'Control'
) {
text = document.selection.createRange().text;
}
return text;
};
let activeElement = null;
$('#builder-content').on('click', (e) => {
activeElement = $(e.target);
console.log(activeElement);
});
$('#builder-align-text-left').on('click', (e) => {
if (activeElement.hasClass('text-end')) {
$(activeElement).removeClass('text-end');
}
if (activeElement.hasClass('text-center')) {
$(activeElement).removeClass('text-center');
}
activeElement.addClass('text-start');
});
$('#builder-align-text-left').on('click', (e) => {
if (activeElement.hasClass('text-end')) {
$(activeElement).removeClass('text-end');
}
if (activeElement.hasClass('text-center')) {
$(activeElement).removeClass('text-center');
}
activeElement.addClass('text-start');
});
$('#builder-align-text-center').on('click', (e) => {
if (activeElement.hasClass('text-end')) {
$(activeElement).removeClass('text-end');
}
if (activeElement.hasClass('text-start')) {
$(activeElement).removeClass('text-start');
}
activeElement.addClass('text-center');
});
$('#builder-align-text-right').on('click', (e) => {
if (activeElement.hasClass('text-center')) {
$(activeElement).removeClass('text-center');
}
if (activeElement.hasClass('text-start')) {
$(activeElement).removeClass('text-start');
}
$(activeElement).addClass('text-end');
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous" />
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.0/css/all.css" integrity="sha384-OLYO0LymqQ+uHXELyx93kblK5YIS3B2ZfLGBmsJaUyor7CpMTBsahDHByqSuWW+q" crossorigin="anonymous" />
<div class="container h-100">
<div class="row h-100">
<div class="d-flex justify-content-center align-items-center h-100">
<div class="card">
<div class="card-body p-4">
<div id="builder-editor">
<div id="builder-content" contenteditable="true">
<h3>Heading 3</h3>
<p>
In JavaScript, when an object is passed to a function expecting a string (like window.alert() or document.write()), the object's toString() method is called and the returned value is passed to the function. This can make the object appear to be a string
when used with other functions when it is really an object with properties and methods.
</p>
</div>
</div>
</div>
<div class="card-footer">
<div class="d-flex builder-toolbar">
<button class="btn btn-light shadow-none me-3">
<i class="fas fa-bold"></i>
</button>
<button class="btn btn-light shadow-none me-3">
<i class="fas fa-italic"></i>
</button>
<button id="builder-align-text-left" class="btn btn-light shadow-none me-3">
<i class="fas fa-align-left"></i>
</button>
<button id="builder-align-text-center" class="btn btn-light shadow-none me-3">
<i class="fas fa-align-center"></i>
</button>
<button id="builder-align-text-right" class="btn btn-light shadow-none me-3">
<i class="fas fa-align-right"></i>
</button>
<button id="builder-align-text-right" class="btn btn-light shadow-none me-3">
<i class="fas fa-cloud-upload-alt"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
解决方案
您可以尝试在单击事件上为粗体按钮添加强标记,如下所示:
<button class="btn btn-light shadow-none me-3" id="builder-text-bold">
<i class="fas fa-bold"></i>
</button>
$('#builder-text-bold').on('click', (e) => {
var range;
if (window.getSelection) {
range = window.getSelection().getRangeAt(0);
} else if (document.getSelection) {
range = document.getSelection().getRangeAt(0);
} else if (document.selection) {
range = document.selection.createRange();
}
if (range != null && range != '' ) {
var newNode = $('<strong> </strong>')[0];
range.surroundContents(newNode);
}
});
推荐阅读
- graphql - 使用 GraphQl+ReScript 上传文件
- r - 是否可以将我的 glmer 模型反向转换为 emmeans posthoc 测试?
- postgresql - 无法将 Aurora RDS Postgres 版本从 12 升级到 13
- rabbitmq - 每 10 分钟在 RabbitMQ 上发现错误“CRASH REPORT Process”
- dialogflow-es - Google Conversational Actions 中的verificationStatus、accountLinkingStatus、UserStorage 和用户ID 的管理
- spring - 无法将 Maven 配置文件绑定到 Spring Boot 配置文件
- java - 多个 ISO 8601 到 ZonedDateTime 解析方法之间的区别
- javascript - 如何制作具有相同高度内容元素的相同高度卡片
- r - R:为什么负索引不能创建补集?
- authentication - ASP.NET Core MVC 中的 cookie 身份验证有问题