друзья! Помогите решить вопрос. Суть, у меня есть инпут, куда пользователь вводит слова и по нажатию на кнопку, они записываються в строку , также есть текстареа, куда пользователь тоже вводить слова.При нажатии на кнопку Cenzor, слова которые идентичны словам, которые есть в строке от инпута должны замениться на ****, где * - это каждая буква. Я написал, код который заменяет целое слово на одну *, побывал делать перебор каждой буквы в внутреннем цикле, но тогда заменяется первое совпадение букв. Пожалуйста, помогите решить вопрос, буду при много благодарен, за ваше внимание!
window.onload = function() {
createWrapper();
};
function createWrapper() {
const wrapper = document.createElement('div');
wrapper.id = 'wrapper';
document.body.append(wrapper);
wrapper.append(div(), input(), btnAdd(), textarea(), cenzor());
return wrapper;
}
function div () { // div for h1 and paragraph
const div = document.createElement('div');
div.append(p());
return div;
}
function p() {
const p = document.createElement('p');
p.id = 'p';
return p;
}
function btnAdd () {
const btn = document.createElement('button');
btn.innerHTML = 'Add';
btn.id = 'add';
btn.onclick = add;
return btn;
}
function input() {
const inp = document.createElement('input');
inp.id = 'inp';
return inp;
}
function textarea() {
const textarea = document.createElement('textarea');
textarea.style.display = 'block';
textarea.id = 'textarea';
return textarea;
}
function cenzor() { // кнопка, при нажатии на которою, должно происходить изменение тексареа
const btn = document.createElement('button');
btn.innerHTML = 'Cenzore';
btn.onclick = cenzorCheck;
return btn;
}
function add () { // обработчиик, которая добавляет слова из инпута в строку
const inp = document.getElementById('inp');
const p = document.getElementById('p');
if (inp.value) {
p.innerHTML += inp.value + ' ';
}
}
function cenzorCheck() { //обработчик, для изменения слов,
const p = document.getElementById('p');
const textarea = document.getElementById('textarea');
// метод, который, возвращает совпадающие слова в строке инпута и текстареа
let match = textarea.value.split(' ').filter(elem =>
p.textContent.split(' ').includes(elem));
// ну и собственно, цикл, который делает не правильные изменения
for (let i = 0; i < match.length; i++) {
textarea.value = textarea.value.replace(match[i], '*');
}
}
У строк есть встроенный метод repeat()
, "умножающий" данную строку N раз:
console.log( "Строка ".repeat(3) ); // "Строка Строка Строка "
Ну можно было добавить это сюда:
textarea.value = textarea.value.replace(match[i], "*".repeat( match[i].length ) );
Но случайно по инерции переписал всё))
initHTML();
setEventListeners();
function initHTML() {
document.body.insertAdjacentHTML("beforeend",
`<div id="wrapper">
<p class="p"></p>
<input class="inp">
<button class="add">Add</button>
<hr>
<textarea class="textarea"></textarea>
<hr>
<button class="censore">Censore</button>
</div>`
);
// Незачем усложнять себе жизнь. Одной строкой это сильно проще, а разницы особо нет.
}
function setEventListeners(){
let keyWords = []; // Вообще полезно хранить данные в переменных,
// А HTML использовать только для их вывода.
let elem = new Elements();
elem.add.addEventListener('click', function(){
let word = elem.inp.value;
if( !word || keyWords.includes( keyWords ) ) return;
keyWords.push(word);
elem.p.textContent = keyWords.join(" ");
});
elem.censore.addEventListener('click', function(){
let reg = new RegExp( keyWords.join("|"), "ig" );
elem.textarea.value = elem.textarea.value.replace(reg, function(match){
return "*".repeat(match.length);
});
// Функция внутри replace получает в качестве аргумента совпадение целиком.
});
function Elements(){
const root = document.getElementById('wrapper');
const qs = str => root.querySelector(str);
return {
p: qs('.p'),
inp: qs('.inp'),
add: qs('.add'),
censore: qs('.textarea'),
textarea: qs('.textarea'),
};
}
}
Если бы в JS не было repeat, его не трудно повторить:
String.prototype.repeat = function(times){
var str = String(this);
for( var i = 0, s = ""; i < times; i++ ){
s += str;
}
return s;
}
console.log( "Bubu_".repeat(5) );
Вы из textarea value получаете, насколько я понял, надо из inp получать value.
window.onload = function() {
createWrapper();
};
function createWrapper() {
const wrapper = document.createElement('div');
wrapper.id = 'wrapper';
document.body.append(wrapper);
wrapper.append(div(), input(), btnAdd(), textarea(), cenzor());
return wrapper;
}
function div () { // div for h1 and paragraph
const div = document.createElement('div');
div.append(p());
return div;
}
function p() {
const p = document.createElement('p');
p.id = 'p';
return p;
}
function btnAdd () {
const btn = document.createElement('button');
btn.innerHTML = 'Add';
btn.id = 'add';
btn.onclick = add;
return btn;
}
function input() {
const inp = document.createElement('input');
inp.id = 'inp';
return inp;
}
function textarea() {
const textarea = document.createElement('textarea');
textarea.style.display = 'block';
textarea.id = 'textarea';
return textarea;
}
function cenzor() { // кнопка, при нажатии на которою, должно происходить изменение тексареа
const btn = document.createElement('button');
btn.innerHTML = 'Cenzore';
btn.onclick = cenzorCheck;
return btn;
}
function add () { // обработчиик, которая добавляет слова из инпута в строку
const inp = document.getElementById('inp');
const p = document.getElementById('p');
if (inp.value) {
p.innerHTML += inp.value + ' ';
}
}
function cenzorCheck() { //обработчик, для изменения слов,
const p = document.getElementById('p');
const textarea = document.getElementById('textarea')
// Здесь была ошибка, вы перебирали textarea, и получали пустой массив
let match = textarea.value.split(' ').filter(elem =>
p.textContent.split(' ').includes(elem));
// из-за пустого массива на предыдущем шаге здесь на выходе получали 1 звезду.
//тут укажите, как добавлять новые значения, просто заменять старые или добавлять к старым =+
match.forEach((item)=> {
textarea.value = item.split("").map(()=>'*').join("");
})
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
имеется массив содержащий массивы var arr = {spb:[78,98,178,198], msk:[77, 97, 99, 177]}; как произвести в нем поиск по значениям и вернуть ключ? если это в корне...
Есть таймер обратного отсчетаСейчас он работает, но выводит цифры в одном блоке, нужно что бы выводил каждую цифру отдельным блоком для оформления
Не могу понять как прередать src img в другой блок с картинкой, в консоль лог выводится srcА в src вставляется [Object Object]