Я пытаюсь создать динамический фильтр для одного iframe с двумя полями ввода. Назовем поля ввода «Box 1» и «Box 2». Когда оба поля не заполнены, я хотел бы, чтобы iframe отображал всю информацию. Когда поле A заполнено, я хочу, чтобы оно отображало информацию о поле A. Когда поле B также заполнено, я хотел бы, чтобы оба фильтра применялись. Когда заполняется только Box B, я бы хотел, чтобы iframe отображал только ввод Box B.
Одно ограничение, которое у меня есть, - это изменяющийся характер пустого поля ввода. Я ограничен назначением числа для ввода в URL-адресе (например, - col1, op1, val1). Например, если «salModBox» пуст, он должен быть достаточно динамичным, чтобы назначать «serNumPrefBox» с col1, op1, val1). Если оба заполнены, это должно быть col1, op1, val1 для "salModBox" и col2, op2, val2 для "serNumPrefBox". Если ни один из них не заполнен, ну, в этом отношении ему не нужно иметь col1 или 2.
Ожидаемый вывод URL-адреса в конечном итоге будет выглядеть так, если оба заполнены:
https://example.com/#/embed/viz/longID/?col1=Variable%20Number%20One&op1=EQ&val1="+salesMod+"&col2=Variable%20Number%20Two&op2=EQ&val2="+serNoPre+"#/moreinfo/anotherID
Ожидаемый результат URL с одной заполненной переменной:
https://example.com/#/embed/viz/longID/?col1=Variable%20Number%20One&op1=EQ&val1="+salesMod (или serNoPre) +"#/moreinfo/anotherID
Если они оба пусты, это будет просто ссылка на исходный URL-адрес. Это будет широкий открытый поиск. Пользователь технически не ограничен значениями, которые он может ввести в любое поле ввода.
function salModSnpFilter() {
var salModInput = document.getElementById('salModBox').value;
var serNumPrefInput = document.getElementById('serNumPrefBox').value;
var smSnp = '';
if (salModInput = ' ' and serNumPrefInput = ' ') {"https://en.wikipedia.org/wiki/IFrame"
} else if (salModInput = ' ' and serNumPrefInput != ' ') {"https://en.wikipedia.org/wiki/IFrame" + serNumPrefInput
} else if (serNumPrefInput = ' ' and salModInput != ' ') {"https://en.wikipedia.org/wiki/IFrame" + salModInput
} else if (salModInput != ' ' and serNumPrefInput != ' ' {"chttps://en.wikipedia.org/wiki/IFrame"+salModInput+serNumPrefInput
} else {"https://en.wikipedia.org/wiki/IFrame"
}
var salModString = "https://en.wikipedia.org/wiki/IFrame" + salModInput";
var serNumPrefString = "https://en.wikipedia.org/wiki/IFrame" + serNumPrefInput";
var bothString = "https://en.wikipedia.org/wiki/IFrame" + serNumPrefInput + salModInput";
document.getElementById('SM_SNPiFrame').src = salModString;
document.getElementById('SM_SNPiFrame').src = serNumPrefString;
document.getElementById('SM_SNPiFrame').src = bothString;
}<div>
<input name = "textfield" type = "text" class = "guidedQueryEntry" placeholder = "Box A" name = "Box A" id = "salModBox">
</div>
<div>
<input name = "textfield" type = "text" class = "guidedQueryEntry" placeholder = "Box B" name = "Box B" id = "serNumPrefBox">
</div>
<div>
<iframe src = "https://en.wikipedia.org/wiki/IFrame"
width = "100%" height = "600" style = "border-color:#FFCD11" id = "SM_SNPiFrame" allowfullscreen></iframe>
</div>В конечном итоге я использовал этот код, и он сработал:
function filterSelection() {
var smBoxValue = document.getElementById("salModBox").value;
var snpBoxValue = document.getElementById("serNumPrefBox").value;
if (smBoxValue != "" && snpBoxValue != "") {var combinedModString =
"https://example.com/col1=Serial%20Number%20Prefix&op1=EQ&val1 = " +
snpBoxValue +"&col2=Sales%20Model%20BOM%20EDS&op2=EQ&val2 = " +
smBoxValue";
document.getElementById('SM_SNPiFrame').src = combinedModString;
}
else if (smBoxValue == "" && snpBoxValue != "") {var snpModString =
"https://example.com/#/col1=Serial%20Number%20Prefix&op1=EQ&val1 = "
+ snpBoxValue;
document.getElementById('SM_SNPiFrame').src = snpModString;
}
else if (smBoxValue != "" && snpBoxValue == "") {var salModString =
"https://example/col1=Sales%20Model%20BOM%20EDS&op1=EQ&val1 = " +
smBoxValue;
document.getElementById('SM_SNPiFrame').src = salModString;
}
else {document.getElementById('SM_SNPiFrame').src =
"https://example.com/";
}
}
Добавлено больше деталей.
Вы до сих пор не указали, какой ввод связан с каким запросом в URL-адресе, я до сих пор не понимаю, в чем ваша проблема прямо сейчас.
@k3llydev - я смог использовать модифицированный код, и это сработало. Не уверен, что это самый эффективный код или нет.
О, хорошо. Если мой ответ помог вам, не стесняйтесь проголосовать и принять его, чтобы ваш вопрос был помечен как «отвеченный».
@ k3llydev - проголосовал и принял ответ. Это помогло мне прийти к выводу. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш код кажется немного сложнее, чем ваша проблема, я объясню вам, как это исправить, и использую некоторые передовые методы в JavaScript.
Поскольку вам нужно обрабатывать значения внутри входных тегов и использовать их в теге iFrame, мы сделаем следующее:
Поскольку нам, вероятно, нужно будет определить только один раз, какой элемент DOM является тегом iFrame, а какой — тегами input, давайте их в самом начале:
var iframe = document.getElementById('SM_SNPiFrame'),
elements = [
document.getElementById('salModBox'),
document.getElementById('serNumPrefBox')
],
strings = [];
Кроме того, мы определяем переменную strings, которая поможет нам хранить входные значения в том же индексе, что и массив elements.
Определив, какие элементы мы хотим использовать, теперь мы должны обработать изменение их значения. Самый быстрый эффект — использовать событие keyup, оно будет передавать значение каждый раз, когда пользователь вводит:
elements.forEach((e,index)=>{
e.addEventListener("keyup",event=>{
strings[index] = event.target.value;
salModSnpFilter();
});
});
В этом прослушивателе событий вам нужно настроить, что будет происходить каждый раз, когда это событие запускается. Я только что сделал простую функцию для сохранения нового значения в том же индексе, но в другом массиве (массиве строк).
И после этого вызовите функцию, которая обновит тег iFrame.
Функция salModSnpFilter() не требует большого количества операторов if и одной и той же строки, появляющейся несколько раз для обработки нового источника iFrame. Давайте сохраним код простым:
const salModSnpFilter = () => {
let source = "https://en.wikipedia.org/wiki/IFrame",
finalString = "/"; //You can set it to empty: "" if you dont want slashes.
strings.forEach(string => {
if (string !== "") {
finalString += string; //You can add a slash with by adding: + "/" between the s and the semicolon.
}
});
iframe.src = source + finalString;
};
Мы определяем базовый URL-адрес в переменной вверху и в переменной, которая будет содержать строку, которую мы добавим к базовому источнику.
Мы перебираем массив strings и добавляем эту строку в массив finalString в том же порядке, что и входные данные.
После этого остается только установить источник тега iFrame.
var iframe = document.getElementById('SM_SNPiFrame'),
elements = [
document.getElementById('salModBox'),
document.getElementById('serNumPrefBox')
],
strings = [];
elements.forEach((e,index)=>{
e.addEventListener("keyup",event=>{
strings[index] = event.target.value;
salModSnpFilter();
});
});
const salModSnpFilter = () =>{
let source = "https://en.wikipedia.org/wiki/IFrame",
finalString = "/";//You can set it to empty: "" if you dont want slashes.
strings.forEach(string=>{
if (string !== ""){
finalString += string; //You can add a slash with by adding: + "/" between the s and the semicolon.
}
});
iframe.src = source + finalString;
};<div>
<input name = "textfield" type = "text" class = "guidedQueryEntry" placeholder = "Box A" name = "Box A" id = "salModBox">
</div>
<div>
<input name = "textfield" type = "text" class = "guidedQueryEntry" placeholder = "Box B" name = "Box B" id = "serNumPrefBox">
</div>
<div>
<iframe src = "https://en.wikipedia.org/wiki/IFrame" width = "100%" height = "600" style = "border-color:#FFCD11" id = "SM_SNPiFrame" allowfullscreen></iframe>
</div>Примечание: Порядок строк и то, как они используются в iFrame, совпадают с порядком добавления входных данных в массив elements. Это означает, что значение inputA всегда будет идти перед значением inputB. Если вы не измените порядок в массиве elements.
Это действительно полезно, и я ценю, что вы нашли время, чтобы подробно объяснить мне это. Одна вещь, которую я упустил, — это изменяющийся характер пустого поля ввода. Я ограничен назначением числа для ввода в URL-адресе (например, - col1, op1, val1). Например, если «salModBox» пуст, он должен быть достаточно динамичным, чтобы назначать «serNumPrefBox» с col1, op1, val1). Если оба заполнены, это должно быть col1, op1, val1 для "salModBox" и col2, op2, val2 для "serNumPrefBox". Если ни один из них не заполнен, ну, в этом отношении ему не нужно иметь col1 или 2.
@ jvelt17 Вы все еще можете отредактировать свой вопрос и указать то, что вы не упомянули, чтобы я мог внести соответствующие коррективы в свой ответ. Просто не забудьте оставить комментарий здесь, когда вы это сделаете, чтобы я получил уведомление :)
Звучит здорово. Я смог изменить свой вопрос с этой информацией. Пожалуйста, не стесняйтесь обращаться за разъяснениями. Я пробовал несколько разных вещей без везения. Мне удалось заставить ввод для Box A работать должным образом, но я не мог понять, как заставить A и B работать вместе или только B, если уж на то пошло, из-за меняющихся значений на основе пустого ввода или нет.
Кроме того, это может помочь: то, как я обрабатывал это раньше, ограничивало меня вводом обоих значений следующим образом: var urlstring7_2 = "example.com/#/embed/viz/longID/…";
Как будет выглядеть ваш URL-адрес iframe? (Примеры ожидаемых результатов) Будет ли всегда только два поля ввода? Есть ли у него только определенные допустимые значения для одного (или обоих) входов? Если вы можете отредактировать свой вопрос с этими деталями, будет очень полезно дать вам необходимое исправление.