Динамический фильтр iframe с двумя входными полями

Я пытаюсь создать динамический фильтр для одного 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-адрес iframe? (Примеры ожидаемых результатов) Будет ли всегда только два поля ввода? Есть ли у него только определенные допустимые значения для одного (или обоих) входов? Если вы можете отредактировать свой вопрос с этими деталями, будет очень полезно дать вам необходимое исправление.

k3llydev 08.05.2019 20:15

Добавлено больше деталей.

jvelt17 08.05.2019 21:12

Вы до сих пор не указали, какой ввод связан с каким запросом в URL-адресе, я до сих пор не понимаю, в чем ваша проблема прямо сейчас.

k3llydev 12.05.2019 01:01

@k3llydev - я смог использовать модифицированный код, и это сработало. Не уверен, что это самый эффективный код или нет.

jvelt17 14.05.2019 16:10

О, хорошо. Если мой ответ помог вам, не стесняйтесь проголосовать и принять его, чтобы ваш вопрос был помечен как «отвеченный».

k3llydev 14.05.2019 16:49

@ k3llydev - проголосовал и принял ответ. Это помогло мне прийти к выводу. Спасибо!

jvelt17 14.05.2019 22:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
189
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код кажется немного сложнее, чем ваша проблема, я объясню вам, как это исправить, и использую некоторые передовые методы в 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 08.05.2019 19:59

@ jvelt17 Вы все еще можете отредактировать свой вопрос и указать то, что вы не упомянули, чтобы я мог внести соответствующие коррективы в свой ответ. Просто не забудьте оставить комментарий здесь, когда вы это сделаете, чтобы я получил уведомление :)

k3llydev 08.05.2019 20:01

Звучит здорово. Я смог изменить свой вопрос с этой информацией. Пожалуйста, не стесняйтесь обращаться за разъяснениями. Я пробовал несколько разных вещей без везения. Мне удалось заставить ввод для Box A работать должным образом, но я не мог понять, как заставить A и B работать вместе или только B, если уж на то пошло, из-за меняющихся значений на основе пустого ввода или нет.

jvelt17 08.05.2019 20:08

Кроме того, это может помочь: то, как я обрабатывал это раньше, ограничивало меня вводом обоих значений следующим образом: var urlstring7_2 = "example.com/#/embed/viz/longID/…";

jvelt17 08.05.2019 20:15

Другие вопросы по теме