Как передать данные в DOM с помощью querySelector - PullRequest
0 голосов
/ 05 февраля 2019

Я использую querySelectorAll для доступа к id и классам в моем файле index.html.Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь передать данные в мой класс p.source, который имеет два дочерних диапазона, и когда я использую innerText или innerHTML, данные не передаются в DOM, несмотря на мой журнал консоли, показывающийправильные данные, которые должны быть переданы в DOM.Не могли бы вы помочь мне понять, что происходит, и как я могу передать данные в этот исходный класс.Я новичок в использовании querySelector, и документация по MDN не так тиха, как хотелось бы.Ниже приведен мой код.

До сих пор, используя консоль, я пытался получить доступ к свойствам childeNodes, и они работают правильно, просто передавая эти данные в DOM

function myQuotes() {
  var quotes = [{
      quote: "Seven billion souls that move around the sun.",
      source: "Childish Gambino",
      citation: "Feels like summer"
    },
    {
      quote: "Don't wait for your world to begin crumbling to make a change.",
      source: "Josh",
      citation: "Past midnight thoughts"
    },
    {
      quote: "The only time we will ever have is right now, no other time exist.",
      source: "Josh",
      citation: "Past midnight thoughts",
      year: 2018
    },
    {
      quote: "Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.",
      source: "Patrick McKenzie",
      citation: "Twitter"

    }
  ];

  console.log('quotes', quotes);

  return quotes;
}

var myQuotesLength = myQuotes().length;
var quotes = myQuotes();

function getRandomQuote(maxNum) {
  var randomNum = Math.floor(Math.random() * maxNum);
  var randomQuote = quotes[randomNum];
  // console.log('random quote', randomQuote );
  return randomQuote;
}



function printQuote() {
  //data call to grab quotes from array of objects
  var message = getRandomQuote(myQuotesLength);
  console.log('message', message);

  //using querySelectors to dynamically pass the data from 'message' into the DOM. Each field works except for sourceField.
  var quoteField = document.querySelectorAll('.quote')[0].innerText = message.quote;
  var source_Parent = document.querySelectorAll('.source');
  console.log('parent', source_Parent);
  var sourceField = source_Parent[0].childNodes[0].innerHTML = message.source;
  console.log('source', sourceField);
  var citationField = source_Parent[0].childNodes[1].innerText = message.citation;
  var yearField = source_Parent[0].childNodes[2].innerText = message.year;
  if (yearField === undefined) {
    yearField = document.getElementsByClassName('year')[0].innerHTML = ' ';
  }
}

document.getElementById('loadQuote').addEventListener("click", printQuote, false);
body {
  background-color: #36b55c;
  color: white;
  font-family: 'Playfair Display', serif;
}

#quote-box {
  position: absolute;
  top: 20%;
  left: 10%;
  right: 10%;
  width: 80%;
  line-height: .5;
}

.quote {
  font-size: 4rem;
  font-weight: 400;
  line-height: 1.1;
  position: relative;
  margin: 0;
}

.quote:before,
.quote:after {
  font-size: 6rem;
  line-height: 2.5rem;
  position: absolute;
}

.quote:before {
  content: "“";
  top: .25em;
  left: -.5em;
}

.quote:after {
  content: "”";
  bottom: -.1em;
  margin-left: .1em;
  position: absolute;
}

.source {
  font-size: 1.25rem;
  ;
  letter-spacing: 0.05em;
  line-height: 1.1;
  text-align: right;
  margin-right: 4em;
}

.source:before {
  content: "—";
}

.citation {
  font-style: italic;
}

.citation:before {
  content: ", ";
  font-style: normal;
}

.year:before {
  content: ", ";
  font-style: normal;
}

#loadQuote {
  position: fixed;
  width: 12em;
  display: inline-block;
  left: 50%;
  margin-left: -6em;
  bottom: 150px;
  border-radius: 4px;
  border: 2px solid #fff;
  color: #fff;
  background-color: #36b55c;
  padding: 15px 0;
  transition: .5s;
}

#loadQuote:hover {
  background-color: rgba(255, 255, 255, .25);
}

#loadQuote:focus {
  outline: none;
}

@media (max-width: 420px) {
  .quote {
    font-size: 2.5rem;
  }
  .quote:before,
  .quote:after {
    font-size: 3rem;
  }
  .source {
    font-size: 1rem;
  }
}
<link href='https://fonts.googleapis.com/css?family=Playfair+Display:400,400italic,700,700italic' rel='stylesheet' type='text/css'>

<div class="container">
  <div id="quote-box">
    <p class="quote">Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.</p>
    <p class="source">Patrick McKenzie<span class="citation">Twitter</span><span class="year">2016</span></p>
  </div>
  <button id="loadQuote">Show another quote</button>
</div>

Конечный результат:

-Я хотел бы передать данные message.quote во внутренний HTML-код цитаты-box id (это работает)

-Я хотел бы передать данные message.source во innerText исходного класса (это не работает)

-Я хотел бы передатьданные message.citation во innerText класса цитирования (это работает)

-Я хотел бы передать данные message.year во внутренний текст класса года (это работает)

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вы сталкиваетесь с именем как childNode, но это не childNode .source div, это innerText.Если вы поместите имя и в <span>, оно тоже станет childNode и будет работать как шарм.

Вот ваш «фиксированный» кодовый блок, где я только что добавил <span> вокруг имени: https://codepen.io/anon/pen/pGrBEo?editors=1010#0

Или взгляните на этот рабочий пример:

function myQuotes() {
  var quotes = [{
      quote: "Seven billion souls that move around the sun.",
      source: "Childish Gambino",
      citation: "Feels like summer"
    },
    {
      quote: "Don't wait for your world to begin crumbling to make a change.",
      source: "Josh",
      citation: "Past midnight thoughts"
    },
    {
      quote: "The only time we will ever have is right now, no other time exist.",
      source: "Josh",
      citation: "Past midnight thoughts",
      year: 2018
    },
    {
      quote: "Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.",
      source: "Patrick McKenzie",
      citation: "Twitter"

    }
  ];
  return quotes;
}

var myQuotesLength = myQuotes().length;
var quotes = myQuotes();

function getRandomQuote(maxNum) {
  var randomNum = Math.floor(Math.random() * maxNum);
  var randomQuote = quotes[randomNum];
  return randomQuote;
}



function printQuote() {
  var message = getRandomQuote(myQuotesLength);

  var quoteField = document.querySelectorAll('.quote')[0].innerText = message.quote;
  var source_Parent = document.querySelectorAll('.source');
  var sourceField = source_Parent[0].childNodes[0].innerHTML = message.source;
  var citationField = source_Parent[0].childNodes[1].innerText = message.citation;
  var yearField = source_Parent[0].childNodes[2].innerText = message.year;
  if (yearField === undefined) {
    yearField = document.getElementsByClassName('year')[0].innerHTML = ' ';
  }
}

document.getElementById('loadQuote').addEventListener("click", printQuote, false);
body {
  background-color: #36b55c;
  color: white;
  font-family: 'Playfair Display', serif;
}

#quote-box {
  position: absolute;
  top: 20%;
  left: 10%;
  right: 10%;
  width: 80%;
  line-height: .5;
}

.quote {
  font-size: 4rem;
  font-weight: 400;
  line-height: 1.1;
  position: relative;
  margin: 0;
}

.quote:before,
.quote:after {
  font-size: 6rem;
  line-height: 2.5rem;
  position: absolute;
}

.quote:before {
  content: "“";
  top: .25em;
  left: -.5em;
}

.quote:after {
  content: "”";
  bottom: -.1em;
  margin-left: .1em;
  position: absolute;
}

.source {
  font-size: 1.25rem;
  ;
  letter-spacing: 0.05em;
  line-height: 1.1;
  text-align: right;
  margin-right: 4em;
}

.source:before {
  content: "—";
}

.citation {
  font-style: italic;
}

.citation:before {
  content: ", ";
  font-style: normal;
}

.year:before {
  content: ", ";
  font-style: normal;
}

#loadQuote {
  position: fixed;
  width: 12em;
  display: inline-block;
  left: 50%;
  margin-left: -6em;
  bottom: 150px;
  border-radius: 4px;
  border: 2px solid #fff;
  color: #fff;
  background-color: #36b55c;
  padding: 15px 0;
  transition: .5s;
}

#loadQuote:hover {
  background-color: rgba(255, 255, 255, .25);
}

#loadQuote:focus {
  outline: none;
}

@media (max-width: 420px) {
  .quote {
    font-size: 2.5rem;
  }
  .quote:before,
  .quote:after {
    font-size: 3rem;
  }
  .source {
    font-size: 1rem;
  }
}
<link href='https://fonts.googleapis.com/css?family=Playfair+Display:400,400italic,700,700italic' rel='stylesheet' type='text/css'>

<div class="container">
  <div id="quote-box">
    <p class="quote">Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.</p>
    <p class="source"><span>Patrick McKenzie</span><span class="citation">Twitter</span><span class="year">2016</span></p>
  </div>
  <button id="loadQuote">Show another quote</button>
</div>
0 голосов
/ 05 февраля 2019

Вы можете сделать это с помощью методов createTextNode и insertBefore, например:

const source = message.source;
const sourceNode = document.createTextNode(source);

const sourceEl = document.querySelectorAll(".source")[0];
const citationEl = document.querySelectorAll(".citation")[0];

sourceEl.insertBefore(sourceNode, citationEl);
0 голосов
/ 05 февраля 2019

Проблема в том, что вы используете childNodes, который также включает текст.

Вот примечание от MDN

childNodes включает все дочерние узлы,включая неэлементные узлы, такие как узлы текста и комментариев.Чтобы получить коллекцию только элементов, используйте ParentNode.children.

...