В моем приложении есть поле поиска. Мне нужно клонировать это поле поиска с теми же функциями. Одно поле поиска в левой части страницы, а другое, такое же поле поиска, в правой части страницы.
Как сделать клон с помощью 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'>×</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 + "°C</h3>" +
"<h3><strong>Wind Direction</strong>: " + data.wind.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>
Вам не нужно все это клонировать, просто объявите функцию один раз, а затем назначьте ее дважды. Сначала сделайте function getWeather = function (e) { ... };, затем используйте document.querySelector('#city').addEventListener('keyup', getWeather);. Теперь добавьте вторую строку addEventListener для второго поля поиска.
Алексей, дело не в «клонировании», а в том, чтобы вы хотели, чтобы они могли входить в город в двух областях. Во-первых, вам нужно перестать напрямую ссылаться на id в коде и либо переключиться на class, либо передать функциям ссылку на объект.



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


Как вариант, я бы предложил создать некоторую функцию или класс, который создает узлы ввода и описания и добавляет их к любому идентификатору контейнера (или классу), который вы ему передаете. В 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 + "°C</h3>" +
"<h3><strong>Wind Direction</strong>: " + data.wind.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'>×</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>
К сожалению, ваш вопрос на самом деле не соответствует рекомендациям по переполнению стека, изложенным в центр помощи. Stack Overflow предназначен для более конкретных вопросов, и вопрос
How I can make the clone using JS?на самом деле не соответствует рекомендациям, поскольку предполагает, что вы хотите, чтобы мы просто выполняли вашу работу за вас. Как только вы прочитаете центр помощи и получите более конкретный вопрос, возвращайтесь, и мы сделаем все возможное, чтобы вам помочь!