#javascript #json
#javascript #json
Вопрос:
Я пытаюсь настроить обучающий файл json-hero из https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON . Мне не нужен длинный список «полномочий». Я хочу отобразить его как короткий текст с разрывами строк. Я заменил document.createElement(‘li’) на document.createElement(‘br’). Почему document.createElement(‘br’) из файла .json (superheroes.json) не отображается, а только скрыт? (Если document.createElement(‘p’) используется для замены, он отображается нормально.) https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json Вот сценарий:
<script>
const header = document.querySelector('header');
const section = document.querySelector('section');
let requestURL = 'superheroes.json';
let request = new XMLHttpRequest();
request.open('GET', requestURL);
request.responseType = 'json';
request.send();
request.onload = function() {
const superHeroes = request.response;
populateHeader(superHeroes);
showHeroes(superHeroes);
}
function populateHeader(obj) {
const myH1 = document.createElement('h1');
myH1.textContent = obj['squadName'];
header.appendChild(myH1);
const myPara = document.createElement('p');
myPara.textContent = 'Hometown: ' obj['homeTown'] ' // Formed: ' obj['formed'];
header.appendChild(myPara);
}
function showHeroes(obj) {
const heroes = obj['members'];
for(let i = 0; i < heroes.length; i ) {
const myArticle = document.createElement('article');
const myH2 = document.createElement('h2');
const myPara1 = document.createElement('p');
const myPara2 = document.createElement('p');
const myPara3 = document.createElement('p');
//const myList = document.createElement('ul'); > replaced by:
const myDiv = document.createElement('div');
myH2.textContent = heroes[i].name;
myPara1.textContent = 'Secret identity: ' heroes[i].secretIdentity;
myPara2.textContent = 'Age: ' heroes[i].age;
myPara3.textContent = 'Superpowers:';
const superPowers = heroes[i].powers;
var x = "";
for(let j = 0; j < superPowers.length; j ) {
//const listItem = document.createElement('li'); > replaced by br
//problem - the following is hidden and not displayed:
const newlineItem = document.createElement('br');
newlineItem.textContent = superPowers[j];
myDiv.appendChild(newlineItem);
}
myArticle.appendChild(myH2);
myArticle.appendChild(myPara1);
myArticle.appendChild(myPara2);
myArticle.appendChild(myPara3);
//content of myDiv is hidden - why?
myArticle.appendChild(myDiv);
section.appendChild(myArticle);
}
}
</script>
Комментарии:
1.
<br>
теги не имеют содержимого. Что вы ожидаете сделатьnewlineItem.textContent = superPowers[j];
?2. Вы делаете
newlineItem.textContent = superPowers[j];
, но это не приводит к допустимому содержимому DOM. Он должен выдавать<br>some text</br>
, однако это на самом деле невозможно.3.
br
является пустым элементом, он не может содержать никакого содержимого.4. Я просто хочу отобразить текст с разрывами строк
5. Почему бы не использовать
div
then? Обратите внимание, что вы можете стилизовать adiv
, чтобы он больше походил на ali
, просто установите для него некоторый запас с помощью CCS.
Ответ №1:
Вы сталкиваетесь с этой проблемой, потому что теги br не отображаются на экране, если вы проверяете свой код, вы должны увидеть что-то вроде <br>Content of superPowers[j]</br>
, но это не видно на вашем экране.
Чтобы получить желаемый результат, вы можете попробовать изменить тег br на тег p (если вы хотите вернуться к следующей строке в следующей суперспособности) или с помощью тега span (если вы хотите поместить свои суперспособности в ту же строку).).
Ваш код должен выглядеть следующим образом:
//each element in a new line method
const newlineItem = document.createElement('p');
newlineItem.textContent = superPowers[j];
myDiv.appendChild(newlineItem);
//same line method
const newlineItem = document.createElement('span');
newlineItem.textContent = superPowers[j];
myDiv.appendChild(newlineItem);
Комментарии:
1. Спасибо, мне нужен метод новой строки — div вместо span будет лучше, как предложил Teemu в комментариях.