.getText()
, который возвращает текст поля ввода, где эмоджи являются простым текстом.const el = $('.emojionearea-editor');
el.emojioneArea({});
const text = el[0].emojioneArea.getText();
document.getElementById('cards').innerHTML = ...
Cannot set property 'innerHTML' of null
, логично.$('#cityFilter').on('input', function() {
const value = this.value.toLowerCase();
$('#city-list .city')
.hide()
.filter((i, n) => $(n).text().toLowerCase().includes(value))
.show();
$('#city-list .state')
.hide()
.filter((i, n) => $(n).nextUntil('.state').is(':visible'))
.show();
});
document.querySelector('#cityFilter').addEventListener('input', e => {
const value = e.target.value.toLowerCase();
document.querySelectorAll('#city-list li').forEach(function(n) {
if (n.matches('.state')) {
this.splice(0, 2, n, true);
} else {
const hide = n.textContent.toLowerCase().indexOf(value) === -1;
this[1] &&= hide;
n.classList.toggle('hidden', hide);
if (!n.nextElementSibling?.matches('.city')) {
this[0].classList.toggle('hidden', this[1]);
}
}
}, [ null, true ]);
});
const dragndropReasons = $('.drag-and-drop .choices')
.filter(c => c.find('input:checkbox:checked').length == 0)
.map(() => 'select at least one correct answer for each <b>drag & drop</b> question');
const multipleReasons = $('.multiple-choice .choices')
.filter(c => c.find('input:checkbox:checked').length == 0)
.map(() => 'select at least one correct answer for each <b>multiple choice</b> question');
return _.uniq(dragndropReasons.concat(multipleReasons))
$('#publish-activity').change(function () {
var reasons = [];
if (!$('#activity_activity_group_id').val()) {
reasons.push("select activity group");
}
if ($('.activity-content .items .activity-content-item').length == 0) {
reasons.push("add quiz questions");
}
var requiredField = $('.activity-content').find('[required=required]');
var cnt = 0;
for (var i = 0; i < requiredField.length; i++) {
if ($(requiredField[i]).val() == '') {
$(requiredField[i]).addClass('error');
cnt++;
}
}
if (cnt > 1) {
reasons.push("you must fill enter value for all added multiple choice question options");
}
if (this.checked && reasons.length) {
$('#unpublish-activity')[0].checked = true;
sweetAlert({
showCancelButton: false,
confirmButtonText: 'OK',
title: 'Cannot publish quiz',
text: 'In order to publish quiz, ' + _.join(reasons, ', '),
type: "warning"
});
}
})
(function(selector) {
// не дублируем код
function save(data) {
localStorage.setItem(selector, JSON.stringify(data));
}
// и не создаем тысячи функций в цикле
// а используем одну общую
function onChange(event) {
var element = event.target,
name = element.name,
value = element.value;
data[name] = value;
save(data);
}
var elements = document.querySelectorAll(selector),
data = localStorage.getItem(selector);
if(data) { // если в сторадже что-то есть
// то можем и распарсить
data = JSON.parse(data);
} else {
// иначе парсить нельзя, будет ошибка
// присвоим дефолтное значение и сохраним
save(data = {});
}
// вместо ненужного создания массива
// обратимся напрямую к прототипу
Array.prototype.forEach.call(elements, function(element) {
var name = element.name,
value = element.value;
if(data[name] === value) { // если текущий элемент отмечен в сторадже
// то отметим и на странице
element.checked = true;
}
// навесим созданый вне цикла хандлер на событие
element.addEventListener("change", onChange);
});
})(/* ".stat_inp_r"
А еще к селектору вопрос, мы только с этим классом радио будем запоминать?
или же у нас каждый будет помнится?
если каждый, то может имеет смысл обработать их все за раз:
*/ "input[type=radio]");
bem create my-block.{js,css,pug} -l components
bem create my-block__{header,content,footer}.{js,css,pug} -l components
./components
my-block__content/
my-block__content.js
my-block__content.css
my-block__content.pug
my-block__footer/
my-block__footer.js
my-block__footer.css
my-block__footer.pug
my-block__header/
my-block__header.js
my-block__header.css
my-block__header.pug