Как создать клон поля поиска?

В моем приложении есть поле поиска. Мне нужно клонировать это поле поиска с теми же функциями. Одно поле поиска в левой части страницы, а другое, такое же поле поиска, в правой части страницы.

Как сделать клон с помощью JS?

Под моим кодом JS

document.querySelector('#city').addEventListener(click,'keyup', function(e) {
  if (e.keyCode === 13) {

        var city = $(this).val();
        if (city !== '') {

            $.ajax({

                url: 'http://api.openweathermap.org/data/2.5/weather?q=' + city + "&units=metric" +
                    "&APPID=bb037310921af67f24ba53f2bad48b1d",
                type: "GET",
                dataType: "json",
                success: function (data) {
                    var widget = show(data);

                    $("#show").html(widget);

                    $("#city").val(' ');

                }

            });

        } else {
            $("#error").html("<div class='alert alert-danger text-center'><a href='#' class='close' data-dismiss='alert' aria-label='close'>&times;</a>Field cannot be empty</div>");
        }

    };
});


function show(data) {
    return "<h2>Current Weather for " + data.name + "," + data.sys.country + "</h2>" +
    "<h3><strong>Wind Speed</strong>: " + data.dt + "</h3>" +
        "<h3><strong>Weather</strong>: <img src='http://openweathermap.org/img/w/" + data.weather[0].icon + ".png'>" + data.weather[0].main + "</h3>" +
        "<h3><strong>Description</strong>: " + data.weather[0].description + "</h3>" +
        "<h3><strong>Temperature</strong>: " + data.main.temp + "&deg;C</h3>" +
        "<h3><strong>Wind Direction</strong>: " + data.wind.deg + "&deg;</h3>";

}

и часть HTML-кода

<body>
    <div class = "jumbotron" id = "jumbo">
        <h2 class = "text-center" id = "th2">Weather</h2>
    </div>

    <div class = "container" id = "cont">
        <div class = "row">
            <h2 class = "text-center text-primary">Your City</h2>
            <span id = "error"></span>
        </div>

        <div class = "row form-group form-inline" id = "rowDiv">
            <input type = "text" name = "city" id = "city" class = "form-control" placeholder = "City Name">
            <button id = "submitWeather" class = "btn btn-primary">Search City</button>
        </div>

        <div id = "show"></div>

        </div>

К сожалению, ваш вопрос на самом деле не соответствует рекомендациям по переполнению стека, изложенным в центр помощи. Stack Overflow предназначен для более конкретных вопросов, и вопрос How I can make the clone using JS? на самом деле не соответствует рекомендациям, поскольку предполагает, что вы хотите, чтобы мы просто выполняли вашу работу за вас. Как только вы прочитаете центр помощи и получите более конкретный вопрос, возвращайтесь, и мы сделаем все возможное, чтобы вам помочь!

Charlie Fish 28.12.2018 00:33

Вам не нужно все это клонировать, просто объявите функцию один раз, а затем назначьте ее дважды. Сначала сделайте function getWeather = function (e) { ... };, затем используйте document.querySelector('#city').addEventListener('keyup', getWeather);. Теперь добавьте вторую строку addEventListener для второго поля поиска.

Chris G 28.12.2018 00:38

Алексей, дело не в «клонировании», а в том, чтобы вы хотели, чтобы они могли входить в город в двух областях. Во-первых, вам нужно перестать напрямую ссылаться на id в коде и либо переключиться на class, либо передать функциям ссылку на объект.

Bibberty 28.12.2018 00:39
Поведение ключевого слова "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
3
24
2

Ответы 2

Как вариант, я бы предложил создать некоторую функцию или класс, который создает узлы ввода и описания и добавляет их к любому идентификатору контейнера (или классу), который вы ему передаете. В html вам понадобится только элемент с идентификатором rowDiv. Очевидно, вы можете адаптировать его под свои нужды, но это всего лишь идея. Думал примерно так:

// rough example based of your code
class citySearch {
    constructor(parentContainerId) {
        this.searchField;
        this.displayArea;
        this.setStage(parentContainerId);
        this.hookListener();
    }

    setStage(parentContainerId) {
        this.searchField = document.createElement('input');
        this.displayArea = document.createElement('div');
        var parentContainer = document.getElementById(parentContainerId)

        parentContainer.appendChild(this.searchField);
        parentContainer.appendChild(this.displayArea);
    }

    show(data) {
        return "<h2>Current Weather for " + data.name + "," + data.sys.country + "</h2>" +
            "<h3><strong>Wind Speed</strong>: " + data.dt + "</h3>" +
            "<h3><strong>Weather</strong>: <img src='http://openweathermap.org/img/w/" + data.weather[0].icon + ".png'>" + data.weather[0].main + "</h3>" +
            "<h3><strong>Description</strong>: " + data.weather[0].description + "</h3>" +
            "<h3><strong>Temperature</strong>: " + data.main.temp + "&deg;C</h3>" +
            "<h3><strong>Wind Direction</strong>: " + data.wind.deg + "&deg;</h3>";

    }

    hookListener() {
        this.searchField.addEventListener('keypress', this.onClick.bind(this));
    }

    onClick(e) {
        if (e.keyCode === 13) {
            var city = this.searchField.value;
            if (city !== '') {
                fetch('http://api.openweathermap.org/data/2.5/weather?q=' + city + "&units=metric" + "&APPID=bb037310921af67f24ba53f2bad48b1d")
                .then( async(res) => {
                    const data = await res.json();
                    var widget = this.show(data);
                    this.displayArea.innerHTML = widget;
                    this.searchField.value = '';
                })

            } else {
            this.displayArea.innerHTML = "<div class='alert alert-danger text-center'><a href='#' class='close' data-dismiss='alert' aria-label='close'>&times;</a>Field cannot be empty</div>";
            }
        }
    }
}
var firstSearch = new citySearch('rowDiv');
var secondSearch = new citySearch('rowDiv');

HTML

 <div class = "row form-group form-inline" id = "rowDiv"></div>

Вот пример кода, который позволяет использовать 1 базу кода, 2 окна поиска и синхронизировать два окна поиска.

const searchBoxes = () => document.getElementsByClassName('searchbox');

document.addEventListener('DOMContentLoaded', function() {

  Array.from(searchBoxes()).forEach(element => {
    console.info(element.id);
    element.addEventListener('keyup', function(event) {
      let text = event.target.value;
      // This is just a demo
      document.getElementById("searchResult").innerHTML = text;
      // Loop other search boxes
      Array.from(searchBoxes()).forEach(e => {
        if (e.id != event.target.id) e.value = text;
      });

      // ANY CODE HERE TO APPLY SEARCH
    });
  });

});
.searchbox {
  border: 1px solid black;
  background-color: wheat;
}

#searchResult {
  height: 100px;
  width: 100px;
  background-color: yellow;
  font-weight: bold;
}
<div>
  <span>Some Text Here</span>
  <input id = "search1" class = "searchbox" type = "text" />
</div>
<div id = "searchResult">ALL MY PAGE STUFF</div>
<div>
  <span>Some Text Here</span>
  <input id = "search2" class = "searchbox" type = "text" />
</div>

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