const htmlString = `<table>
<tr><td>Apple</td><td>12</td></tr>
<tr><td>Banana</td><td>34</td></tr>
</table>`;
const tmpl = document.createElement('template');
tmpl.innerHTML = htmlString;
const df = tmpl.content;
const rows = df.querySelectorAll('tr');
const result = [];
rows.forEach(row => {
result.push([...row.children].map(td => td.textContent));
});
result // [["Apple","12"],["Banana","34"]]
<div>
<p>Text</p>
<ul>
<li>Apple</li>
<li>Banana</li>
</ul>
</div>
И примерно такой код:const tmpl = document.createElement('template');
tmpl.innerHTML = msg; // строка с HTML
const df = tmpl.content; // DocumentFragment
df.children // массив из одного элемента: наружний div
df.children[0].children // массив с двумя эл.: параграфом и списком
df.children[0].children[1].children[1].textContent // "Banana"
[
['text', 'lorem ipsum dolor'],
['copy', 1],
['text', 'sit amet'],
['copy', 2],
]
если я правильно понял, что каждый из плейсхолдеров копирует значение после вертикальной черты – первый копирует 1, второй 2.<template v-for="item in items">
<component :is="text" v-if="item[0] === 'text'">{ item[1] }</component>
<component :is="copy" v-if="item[0] === 'copy'" :value="item[1]" />
</template>
index
deleteEl()
index
уже указывает на следующий элемент и не отрисовывает его.forEach()
render()
не место для изменения данных. Пусть каждый занимается своим делом: render()
только рисует что есть. delete() только удаляет элемент из массива (и вызывает render()
) $('.table_body').on('change', '.input_ptp_tema', function() {
change
добавьте проверку на число выбранных файлов:if (event.target.files.length !== 3) {
// как-то сообщить, что ждём именно 3 файла
return;
}
а когда всё ок, то либо сразу в разметке создать вместо 1 целых 3 тега с img, у каждого свой уникальный id. Либо генерить разметку трёх img на лету и заменять HTML у div.profile-images
function findWord() {
const text = document.getElementById('text_34').value;
const word = document.getElementById('word_34').value;
const outputElement = document.getElementById('output_34');
const re = new RegExp(word, 'gi'); // в word хорошо бы экранировать спец-символы RegExp'ов
function wrapInSpan(match) {
return '<span>' + match + '</span>';
}
outputElement.innerHTML = text.replace(re, wrapInSpan);
}
value
текстового поля ввода это просто строка текста, что бы там ни вводили.const str = '1,2, 3, 4'; // то, что забрали из value инпута
const separator = /,\s*/; // рег. выражение: запятая и потом 0 или больше пробелов
const arr = str.split(separator); // [ "1", "2", "3", "4" ]
тут ешё один подвох: элементы массива по-прежнему строки. Не число 1, а строка "1".const arr = str
.split(separator)
.map(Number); // [ 1, 2, 3, 4 ]
вот теперь больше похоже на желаемый, наверное, результат? const a = {};
const b = {};
a.b = b;
b.a = a;
cloneDeep(a); // бесконечный цикл
\.
const str = '1 августа 2022 г.';
str.replace(' г.', '') // "1 августа 2022"
replace()
использовать метод replaceAll()
arr.filter()
будет передавать по очереди каждое из чисел массива arr
в функцию,true
. См. документацию Array.prototype.filter()true
для чисел, у которых первая цифра 1, 2 или 5."Habr"[0] // "H"
вот тут такой вариант и используют.[0]
короче. new Promise()
куда-то сдвинулся,new Promise((resolve, reject) => {
// что угодно происходит
// и в какой-то момент
resolve(value);
});
setAttribute()
или removeAttribute()
для управления атрибутом disabled
id
элементов должны начинался только с буквы. <template>
— из него можно забирать готовый DocumentFragment, который клонировать и наполнять данными.const number = 123456.789;
new Intl.NumberFormat('ru-RU').format(number);
// "123 456,789"
по умолчанию { style: 'decimal' }
new Intl.NumberFormat('ru-RU', { minimumFractionDigits: 6 })
.format(123456.789012345);
// "123 456,789012" - после запятой не разделяет