Итак, у меня есть два поля ввода, и я пытаюсь сохранить значения в строку. Проблема в том, что я не уверен, как сохранить переменную в первом вводе. Например, если пользователь вводит только значение для p1, это должно быть "Партнер IN (" + document.getElementById("p1").value + ")", но если пользователь вводит оба значения для p1 и p2, это должно быть Partner IN (" + document.getElementById("p1").value + "," + document.getElementById("p2").value + ")". Я хочу убедиться, что переменная ep имеет обновленные значения ( т. е. если пользователь решает изменить значения несколько раз)
https://jsfiddle.net/Charan98/ynbh142x/
let ep;
document.getElementById("p1").addEventListener("blur", () => {
document.getElementById("p2").addEventListener("blur", () => {
if (document.getElementById("p2").value.length == 0) {
ep = "Partner IN (" + document.getElementById("p1").value + ")";
} else {
ep = "Partner IN (" + document.getElementById("p1").value + "," + document.getElementById("p2").value + ")";
}
});
ep = "Partner IN (" + document.getElementById("p1").value + ")";
console.info(ep)
});
<div>
<input id = "p1" type = "text" value = "" />
<br>
<br>
<input id = "p2" type = "text" value = "" />
</div>
@OskarGrosser p1 требуется
Я бы выслушал оба и создал функцию getContent, которая отвечает за создание отформатированного контента.
const getContent = (v1,v2) => "Partner IN (" + v1 + (v2 && v1 ? "," : "") + v2 + ")";
document.getElementById("p1").addEventListener('blur', () => {
console.info(getContent(document.getElementById("p1").value, document.getElementById("p2").value))
});
document.getElementById("p2").addEventListener('blur', () => {
console.info(getContent(document.getElementById("p1").value, document.getElementById("p2").value))
});
Вот пример в этой скрипте:https://jsfiddle.net/o1cwb6th/
Это отличный пример того, как массивы и их методы могут хорошо работать. Отправьте значения в массив по отдельности, а затем соедините их в строку с разделителями-запятыми.
const partnerValues = [];
if (document.getElementById("p1").value.trim() != "") {
partnerValues.push(document.getElementById("p1").value.trim());
}
if (document.getElementById("p2").value.trim() != "") {
partnerValues.push(document.getElementById("p2").value.trim());
}
ep = `Partner IN (${partnerValues.join(",")})`;
Я предполагаю, что вы хотите, чтобы слушатель #p2
был активен только после того, как #p1
получил событие blur
. Но ваш текущий код добавляет нового слушателя в #p2
всякий раз, когда #p1
получает событие blur
.
Вместо этого вы можете всегда подключать слушателя, но возвращаться раньше, если #p1
не содержит значения:
let ep;
document.getElementById("p1").addEventListener("blur", () => {
ep = "Partner IN (" + document.getElementById("p1").value + ")";
console.info(ep);
});
document.getElementById("p2").addEventListener("blur", () => {
if (document.getElementById("p1").value.length == 0) return;
if (document.getElementById("p2").value.length == 0) {
ep = "Partner IN (" + document.getElementById("p1").value + ")";
} else {
ep = "Partner IN (" + document.getElementById("p1").value + "," + document.getElementById("p2").value + ")";
}
console.info(ep);
});
<input id = "p1"><br>
<input id = "p2">
Вы также можете прикрепить один и тот же слушатель к обоим элементам. Затем этот слушатель может оценить, какие и сколько значений добавить динамически. (См. ответ mykaf.)
Если вы не хотите добавлять один и тот же слушатель дважды, вы также можете использовать делегирование событий: добавьте одного и того же слушателя к общему предку.
Примечание. Поскольку blur
не всплывает, вам придется прибегнуть к аналогичному событию focusout.
Редактировать: я не знал, что ответ был помечен как решенный, извините... В любом случае...
Я видел твой комментарий:
код не работает, если у меня есть значение как для p1, так и для p2, и я в конечном итоге изменить значение для p1, я не получаю обновленное значение для p1 и р2
Так что есть идея избежать этого, но я использую keyup
event.
window.addEventListener("DOMContentLoaded",run);
var partnerValues0,partnerValues1;
var p1, p2;
function run(e){
ep = document.getElementById("ep");
p1 = document.getElementById("p1");
p2 = document.getElementById("p2");
p1.addEventListener("keyup",fillForm);
p2.addEventListener("keyup",fillForm);
}
function fillForm(e){
if (document.getElementById("p1").value.trim() == ""){
ep.textContent = "field 1 is required";
}else{
partnerValues0 = "";
partnerValues0 = document.getElementById("p1").value.trim();
partnerValues1 = "";
partnerValues1 = document.getElementById("p2").value.trim();
if (document.getElementById("p1").value.trim() != ""){
ep.textContent = `Partner IN (${partnerValues0})`;
}
if (document.getElementById("p2").value.trim() != ""){
ep.textContent = `Partner IN (${partnerValues0}, ${partnerValues1})`;
}
}
}
<div>
<input id = "p1" type = "text" value = "" />
<br>
<br>
<input id = "p2" type = "text" value = "" />
</div>
<div>
<p id = "ep">field 1 is required</p>
</div>
Привет, есть ли способ сохранить его в переменной вместо .textContent?
обязательно просто объявите свой var let result;
, а затем измените все ep.textContent =
на result =
@Bob
Что, если пользователь вводит только
#p2
, но не#p1
?