#javascript #html
#javascript #HTML
Вопрос:
Я новичок в JavaScript и надеюсь, что смогу получить здесь некоторое руководство. Итак, моя задача — обновить содержимое в блоке HTML при выборе соответствующей опции.
Мне нужно использовать 2 функции в заданном javascript для генерации содержимого из javascript, содержащего массивы объектов.
Я настроил коды для выбора опции из Dropbox, и она работает хорошо. Проблема в том, что мне нужно обновить информацию (название фильма из movies.js , дата, время и дом) соответствующего кинотеатра. Всякий раз, когда я выбираю кинотеатр, содержимое должно быть изменено в соответствии с выбранным кинотеатром. Я попытался запустить цикл, и это действительно кажется глупым и не удалось, как и ожидалось. Как я могу отредактировать свои коды, чтобы содержимое можно было обновлять при выборе соответствующей опции (cinema)? СПАСИБО за ваше время, и мы высоко ценим вашу помощь. Я застрял на этом шаге очень долго: (
Это мой код (выбор связанного кинотеатра), и я попытался запустить цикл, но не удалось: ( :
<div id="Cinema">
<form id="cin" method="get" action="">
<fieldset>
<legend>Cinema</legend>
<select id="cinemaSelect">
<option value="default"></option>
</select>
<script>
var select = document.getElementById("cinemaSelect");
for(var i=0; i < cinemas.length; i ){
var option = document.createElement("OPTION"),
txt = document.createTextNode(cinemas[i].branchName);
option.appendChild(txt);
select.insertBefore(option,select.lastChild);
}
</script>
</fieldset>
</form>
</div>
<div id="lm">
<script>
function getMovieName(movieArray, id) {
for (let i=0; i<movieArray.length; i ) {
if (movieArray[i].id == id) return movieArray[i].name;
}
return undefined;
}
for (let i=0; i<cinemas.length; i ) {
let selected = document.getElementById("cinemaSelect").value;
if (selected == cinemas[i].branchName){
for (let j=0; j<cinemas[i].movies.length; j ) {
let img = document.createElement("img");
img.src= getMovieName(movies, cinemas[i].movies[j].id).thumbnail;
document.getElementById("lm").appendChild(img);
let aaa = document.createElement("P");
aaa.innerHTML = getMovieName(movies, cinemas[i].movies[j].id);
document.getElementById("lm").appendChild(aaa);
for (let k=0; k<cinemas[i].movies[j].shows.length; k ) {
let bbb = document.createElement("P");
bbb.innerHTML = "datetime " cinemas[i].movies[j].shows[k].datetime "<br/>" "House" cinemas[i].movies[j].shows[k].house;
document.getElementById("lm").appendChild(bbb);
}
}
}
}
</script>
</div>
Для cinema.js , заданный массив равен :
function getCinemas() {
return [
{
branchName:"City Cinema - New York",
movies:[
{ id:1,
shows:[
{
index:1,
datetime:"8 Nov, Sun - 9:00am",
house:3
},
{
index:2,
datetime:"10 Nov, Tue - 11:00am",
house:3
}
]
},
{ id:2,
shows:[
{
index:3,
datetime:"9 Nov, Mon - 2:00pm",
house:1
}
]
}
]
},
{
branchName:"City Cinema - Los Angeles",
movies:[
{
id:2,
shows:[
{
index:4,
datetime:"11 Nov, Wed - 9:00am",
house:4
},
{
index:5,
datetime:"11 Nov, Wed - 11:00am",
house:2
}
]
}
]
},
{
branchName:"City Cinema - Wisconsin",
movies:[
{
id:1,
shows:[
{
index:6,
datetime:"11 Nov, Wed - 9:00am",
house:4
}
]
}
]
}
]
}
Для movies.js , заданный массив равен :
function getMovies() {
return [
{
id:1,
type:"now",
thumbnail:"../xx.png",
src:"../yy.mp4",
name:"Casablanca",
cast:"Humphrey Bogart, Ingrid Bergmen",
director:"Michael Curtiz",
duration: 120
},
{
id:2,
type:"now",
thumbnail:"../xx.png",
src:"../xx.mp4",
name:"Chocalate",
cast:"Christiano Roland, Wayne Beckman",
director:"Alex Curtis",
duration: 110
},
{
id:3,
type:"now",
thumbnail:"../xx.png",
src:"../xx.mp4",
name:"Wildlife",
cast:"Marcus Randford",
director:"David De Geek",
duration: 100
},
{
id:4,
type:"upcoming",
thumbnail:"../xx.png",
src:"../xx.mp4",
name:"Barbecue",
cast:"Taylor Watson",
director:"Rolando Broom",
duration: 105
},
{
id:5,
type:"upcoming",
thumbnail:"../xx.png",
src:"../xx.mp4",
name:"BigBuck",
cast:"Mark Hughes",
director:"Tim Carlton",
duration: 115
},
{
id:6,
type:"upcoming",
thumbnail:"../xx.png",
src:"../xx.mp4",
name:"Nature",
cast:"Benjamin Crook",
director:"Memphis Delan",
duration: 100
}
]
}
Ответ №1:
Нужно изучить некоторые приемы JS…
const Cinemas =
[ { branchName: "City Cinema - New York"
, movies:
[ { id: 1, shows:
[ { index: 1, datetime: "8 Nov, Sun - 9:00am", house: 3 }
, { index: 2, datetime: "10 Nov, Tue - 11:00am", house: 3 }
]
}
, { id: 2, shows:
[ { index: 3, datetime: "9 Nov, Mon - 2:00pm", house: 1 }
] } ]
}
, { branchName: "City Cinema - Los Angeles"
, movies:
[ { id: 2, shows:
[ { index: 4, datetime: "11 Nov, Wed - 9:00am", house: 4 }
, { index: 5, datetime: "11 Nov, Wed - 11:00am", house: 2 }
] } ]
}
, { branchName: "City Cinema - Wisconsin"
, movies:
[ { id: 1, shows:
[ { index: 6, datetime: "11 Nov, Wed - 9:00am", house: 4}
] } ] } ]
const Movies =
[ { id : 1
, type : "now"
, thumbnail : "../xx.png"
, src : "../yy.mp4"
, name : "Casablanca"
, cast : "Humphrey Bogart, Ingrid Bergmen"
, director : "Michael Curtiz"
, duration : 120
}
, { id : 2
, type : "now"
, thumbnail : "../xx.png"
, src : "../xx.mp4"
, name : "Chocalate"
, cast : "Christiano Roland, Wayne Beckman"
, director : "Alex Curtis"
, duration : 110
}
, { id : 3
, type : "now"
, thumbnail : "../xx.png"
, src : "../xx.mp4"
, name : "Wildlife"
, cast : "Marcus Randford"
, director : "David De Geek"
, duration : 100
}
, { id : 4
, type : "upcoming"
, thumbnail : "../xx.png"
, src : "../xx.mp4"
, name : "Barbecue"
, cast : "Taylor Watson"
, director : "Rolando Broom"
, duration : 105
}
, { id : 5
, type : "upcoming"
, thumbnail : "../xx.png"
, src : "../xx.mp4"
, name : "BigBuck"
, cast : "Mark Hughes"
, director : "Tim Carlton"
, duration : 115
}
, { id : 6 // <--
, type : "upcoming"
, thumbnail : "../xx.png" // <--
, src : "../xx.mp4"
, name : "Nature"
, cast : "Benjamin Crook"
, director : "Memphis Delan"
, duration : 100
}
]
const DomParser = new DOMParser()
, cinemaSlct = document.getElementById("cinemaSelect")
, div_lm = document.querySelector('div#lm')
Cinemas.forEach((cinema,index) =>
{ cinemaSlct.add( new Option( cinema.branchName, index )) });
cinemaSlct.onchange = () =>
{
div_lm.innerHTML = ""
Cinemas[cinemaSlct.value].movies.forEach(movieC=>
{
movieC.shows.forEach(show=>
{
let movie = Movies.find(x=>x.id===show.index)
if (!movie) throw 'no movie reference'
let newSection = `
<section>
<hr>
<img src="${movie.thumbnail}" alt="${movie.name}">
<p>name : ${movie.name} <br>
cast : ${movie.cast} <br>
director : ${movie.director} </p>
<hr>
<p> datetime:${show.datetime} <br> house:${show.house} </p>
<hr>
</section>`;
div_lm.appendChild( (DomParser.parseFromString( newSection, 'text/html')).body.firstChild )
})
})
}
<div id="Cinema">
<form id="cin" method="get" action="">
<fieldset>
<legend>Cinema</legend>
<select id="cinemaSelect">
<option value="" selected disabled> select one</option>
</select>
</fieldset>
</form>
</div>
<div id="lm"></div>
Комментарии:
1. Привет, спасибо за ваш ответ! Но если jQuery не разрешен, есть ли у вас какие-либо идеи о том, как запустить цикл массива, используя только JavaScript? Спасибо!
2. @Kevin в моем коде нет jQuery. Все это чистый JS. смотрите developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach и developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
3. Я вижу, я вижу. Спасибо за ваши разъяснения! Я новичок в этом языке и все еще немного смущен этим lmao. Большое вам спасибо: D Хорошего дня.