#javascript #html #textarea
#javascript #HTML #текстовая область
Вопрос:
Я не могу заставить этот скрипт работать, и я застрял с этим на несколько дней. Предполагается изменить регистр текста только для выделенных слов (выделенных курсором), а не для всех текстов одновременно.
На самом деле это потому, что я не знаю, как правильно использовать строку выделения, которую я где-то видел. Любой другой учебник, который я вижу онлайн, либо будет иметь только 1 из 4 функций, которые мне нужны, либо у них будут все, но они преобразуют весь текст, а не только выделенный.
Мой текущий скрипт выглядит следующим образом:
var stringbox = document.getElementById('textarea2')
$(document).ready(function () {
var selection;
$(textarea2).select(function () {
selection = window.getSelection().toString();
});
function convertstring(textarea, action){
if (action == 'sentencecase'){
textarea.value = sentenceCase(textarea.value)
}
else if (action == 'titlecase'){
textarea.value = toTitleCase(textarea.value)
}
else if (action == 'capitalcase'){
textarea.value = CapitalCase(textarea.value)
}
else if (action == 'lowercase'){
textarea.value = lowerCase(textarea.value)
}
else if (action == 'uppercase'){
textarea.value = upperCase(textarea.value)
}
return false
}
function sentenceCase(str){
var str = str.toLowerCase().replace(/sis/g, ' I ');
str = str.charAt(0).toUpperCase() str.slice(1);
return str
}
function toTitleCase(str){
var smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?.?|via)$/i;
var str = str.toLowerCase()
return str.replace(/[A-Za-z0-9u00C0-u00FF] [^s-]*/g, function(match, index, title){
if (index > 0 amp;amp; index match.length !== title.length amp;amp;
match.search(smallWords) > -1 amp;amp; title.charAt(index - 2) !== ":" amp;amp;
(title.charAt(index match.length) !== '-' || title.charAt(index - 1) === '-') amp;amp;
title.charAt(index - 1).search(/[^s-]/) < 0) {
return match.toLowerCase();
}
if (match.substr(1).search(/[A-Z]|../) > -1) {
return match;
}
return match.charAt(0).toUpperCase() match.substr(1);
});
};
function CapitalCase(str){
return str.toLowerCase().split(' ').map(function(word) {
return (word.charAt(0).toUpperCase() word.slice(1));
}).join(' ');
}
function lowerCase(str){
return str.toLowerCase();
}
function upperCase(str){
return str.toUpperCase();
}
<textarea id="textarea2" spellcheck="true" placeholder="Use as your notepad.."></textarea>
<button title="Convert to Title Case" class="sbtn" onclick="return convertstring(stringbox, 'titlecase')">Title Case</button>
<button title="Convert to Sentence Case" class="sbtn" onclick="return convertstring(stringbox, 'sentencecase')">Sentence Case</button>
<button title="Convert to Upper Case" class="sbtn" onclick="return convertstring(stringbox, 'uppercase')">Upper Case</button>
<button title="Convert to Lower Case" class="sbtn" onclick="return convertstring(stringbox, 'lowercase')" string.="" the="">Lower Case</button>
Я не силен в javascript, поэтому, пожалуйста, извините за приведенный ниже код: (
Комментарии:
1. что вы называете «выделенными словами»?
2. Я имею в виду, что это «выделенные слова» курсором
Ответ №1:
Лучший способ для этих операций — использовать «execCommand()«
здесь я использовал execCommand("insertText", false, <textToReplaceWith>)
, чтобы просто заменить выделение нужным текстом.
Я прокомментировал нежелательный код, поскольку он приводил к ошибкам
Я полагаю, это устранило бы проблему.
var stringbox = document.getElementById('textarea2')
//$(document).ready(function () {
// var selection;
//$(textarea2).select(function () {
// selection = window.getSelection().toString();
//});
function convertstring(textarea, action){
var selectedText = '';
// window.getSelection
if (window.getSelection) {
selectedText = window.getSelection();
}
// document.getSelection
else if (document.getSelection) {
selectedText = document.getSelection();
}
// document.selection
else if (document.selection) {
selectedText =
document.selection.createRange().text;
} else return;
if (action == 'sentencecase'){
alteredText = sentenceCase(selectedText.toString())
document.execCommand('insertText', false, alteredText)
}
else if (action == 'titlecase'){
alteredText = toTitleCase(selectedText.toString())
document.execCommand('insertText', false, alteredText)
}
else if (action == 'capitalcase'){
alteredText = CapitalCase(selectedText.toString())
document.execCommand('insertText', false, alteredText)
}
else if (action == 'lowercase'){
alteredText = lowerCase(selectedText.toString())
document.execCommand('insertText', false, alteredText)
}
else if (action == 'uppercase'){
alteredText = upperCase(selectedText.toString())
document.execCommand('insertText', false, alteredText)
}
return false
}
function sentenceCase(str){
var str = str.toLowerCase().replace(/sis/g, ' I ');
str = str.charAt(0).toUpperCase() str.slice(1);
return str
}
function toTitleCase(str){
var smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?.?|via)$/i;
var str = str.toLowerCase()
return str.replace(/[A-Za-z0-9u00C0-u00FF] [^s-]*/g, function(match, index, title){
if (index > 0 amp;amp; index match.length !== title.length amp;amp;
match.search(smallWords) > -1 amp;amp; title.charAt(index - 2) !== ":" amp;amp;
(title.charAt(index match.length) !== '-' || title.charAt(index - 1) === '-') amp;amp;
title.charAt(index - 1).search(/[^s-]/) < 0) {
return match.toLowerCase();
}
if (match.substr(1).search(/[A-Z]|../) > -1) {
return match;
}
return match.charAt(0).toUpperCase() match.substr(1);
});
};
function CapitalCase(str){
return str.toLowerCase().split(' ').map(function(word) {
return (word.charAt(0).toUpperCase() word.slice(1));
}).join(' ');
}
function lowerCase(str){
return str.toLowerCase();
}
function upperCase(str){
return str.toUpperCase();
}
<textarea id="textarea2" spellcheck="true" placeholder="Use as your notepad.."></textarea>
<button title="Convert to Title Case" class="sbtn" onclick="convertstring(stringbox, 'titlecase')">Title Case</button>
<button title="Convert to Sentence Case" class="sbtn" onclick="convertstring(stringbox, 'sentencecase')">Sentence Case</button>
<button title="Convert to Upper Case" class="sbtn" onclick="convertstring(stringbox, 'uppercase')">Upper Case</button>
<button title="Convert to Lower Case" class="sbtn" onclick="convertstring(stringbox, 'lowercase')" string.="" the="">Lower Case</button>
Комментарии:
1. Большое вам спасибо! Вы избавили меня от этой головной боли! Теперь я понимаю ошибку того, что я делаю.