Как распечатать результат функции javascript в HTML

У меня есть функция, в которой я хочу напечатать строку в html из функции в javascript, которая использует каждую вторую букву в строке.

JavaScript:

function crazyCaps(s){
    let result  = ""
    for (let i = 0; i < s.length; i++)
        if (i%2 == 0){
            result += s[i].toLowerCase();
            else {
                result += s[i].toUpperCase();
            }
        }
        console.info(result);
    }
    crazyCaps("helloworld");
    window.onload = crazyCaps();

HTML:

<!DOCTYPE html>
<html>
<head>
<script src  = "crazycaps.js" type = "text/javascript"></script>
</head>

    <body>
    crazyCaps();

    </body>
</html>

Я думаю, что в вашем коде отсутствуют фигурные скобки. Во-вторых, вы назначаете возвращаемое значение из своей функции в качестве обработчика onload окна. Тем не менее, ваша функция ничего не возвращает.

user47589 01.03.2019 22:59
Поведение ключевого слова "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
2
6 915
7

Ответы 7

Используйте document.body.textContent += result, чтобы записать результат на страницу. И вам не нужно иметь оператор window.onload, вам просто нужна функция:

 

function crazyCaps(s) {
    let result  = ""
    for (let i = 0; i < s.length; i++) {
        if (i%2 == 0) {
            result += s[i].toLowerCase();
        } else {
            result += s[i].toUpperCase();
        }
    }
    document.body.textContent += result;
}
crazyCaps("helloworld");
 

<body></body>
document.write() следует использовать только тогда, когда это необходимо, то есть когда новый документ создается динамически на лету. При неправильном использовании он может перезаписать текущий документ и привести к его удалению. При правильном использовании вы должны строить выходные данные линейным образом, что обычно невозможно. Вместо этого используйте DOM API для заполнения/изменения уже существующих элементов DOM или создания новых по мере необходимости.
Scott Marcus 01.03.2019 23:13

Извините, @ScottMarcus, исправлю с помощью innerHTML

Jack Bashford 01.03.2019 23:15

Не используйте .innerHTML, когда нет HTML для чтения или записи. Это влияет на производительность и безопасность. Используйте .textContent для строк, отличных от HTML.

Scott Marcus 01.03.2019 23:15

Ладно, еще раз извините @ScottMarcus

Jack Bashford 01.03.2019 23:16

Не хотелось бы вас ломать, но прямо сейчас ваш код создает функцию на веб-странице. И, как у вас есть, результаты всегда будут добавляться внизу страницы. Что, если результаты нужно отправить куда-то еще?

Scott Marcus 01.03.2019 23:22

У вас есть небольшие ошибки в вашем коде, вы не можете вызывать функции javascript между вашими тегами html. написание CrazyCaps(); просто выводит "crazyCaps();" в открытом тексте. Вам нужно вернуть строку, которую вы создаете, а затем назначить этот результат элементу в вашем html, что можно сделать с помощью document.getElementById('IDGOESHERE').textContent. Ваше предложение if else вам нужно структурировать так, чтобы фигурные скобки заканчивались, а оператор else начинался, if (){} else{} вы разместили оператор else внутри оператора if.

function crazyCaps(s) {
  let result = ""
  for (let i = 0; i < s.length; i++)
    if (i % 2 == 0) {
      result += s[i].toLowerCase();
    } else {
      result += s[i].toUpperCase();
    }
  console.info(result);
  return result;
}
document.getElementById('crazyoutput').textContent = crazyCaps("helloworld");
<body>
  <div id = "crazyoutput">
  </div>
</body>

https://jsfiddle.net/zeonfrost/4q01x68z/1/

Не используйте .innerHTML, когда нет HTML для чтения или записи. Это влияет на производительность и безопасность. Используйте .textContent для строк, отличных от HTML.

Scott Marcus 01.03.2019 23:15

@ScottMarcus, вы совершенно правы, здесь нет причин использовать innerHTML, я отредактировал свой ответ, чтобы отразить ваше улучшение.

Nils Kähler 02.03.2019 00:02
function weird_string_format(string){
  let temp = "";
  for(let i = 0; i < string.length; i++){
    temp += (i % 2 === 0) ? string[i] : string.charAt(i).toUpperCase() 
  }
  return temp;
}

document.write(temp);

Это не делает то, о чем спрашивает вопрос.

Scott Marcus 01.03.2019 23:17

Современный подход состоит в том, чтобы настроить пустой HTML-элемент в качестве заполнителя для результатов, а затем заполнить его при необходимости. Кроме того, вам действительно не нужен обработчик событий window.onload, просто переместите <script> непосредственно перед закрытием элемента body. К этому моменту весь HTML-код был проанализирован в DOM и готов к взаимодействию.

<!DOCTYPE html>
<html>
  <head>

  </head>
  <body>
    <!-- JavaScript will access this element and populate it.-->
    <div id = "results"></div>
    
    
    <!-- Placing the script just before the closing body tag ensures
         that by the time the parser reaches this point, all the HTML
         will have been read into memory. -->
    <script src  = "crazycaps.js" type = "text/javascript"></script>
           
    <script>
      // Get a reference to the element where the output will go
      let output = document.getElementById("results");
      
      function crazyCaps(s){
        let result  = "";
        for (let i = 0; i < s.length; i++){
          if (i%2 == 0){
            result += s[i].toLowerCase();
          } else {
            result += s[i].toUpperCase();
          }
        }
        output.textContent = result;  // Populate the element
      }
      crazyCaps("helloworld");  
    </script>
  </body>
</html>

Не тестировалось, но должно работать:

JS:

function crazyCaps(s){
    let result  = ""
    for (let i = 0; i < s.length; i++) {
        if (i%2 == 0){
            result += s[i].toLowerCase();
        } else {
            result += s[i].toUpperCase();
        }
    }
    document.getElementById("text").innerText=result;
}
window.onload = crazyCaps('helloworld');

HTML

    <!DOCTYPE html>
    <html>
    <head>
    <script src  = "crazycaps.js" type = "text/javascript"></script>
    </head>
        <body>
          <div id = "text"></div>
        </body>
    </html>
.innerText нестандартный. Используйте .textContent.
Scott Marcus 01.03.2019 23:21

// INSIDE crazycaps.js

function crazyCaps(s){
    let result = "";
    for (let i = 0; i < s.length; i++){
      if (i%2 == 0){
         result += s[i].toLowerCase();
      } else {
         result += s[i].toUpperCase();
      }
    }
    return result;
    // the string is returned as a result
 }

console.info(crazyCaps("helloworld"));
// the console.info now occurs OUTSIDE of the crazyCaps function
    
window.onload = () => 
        document.body.textContent = crazyCaps( "example crazy capitals");
// window.onload is assigned to a CALL BACK FUNCTION, which is executed onload
<!DOCTYPE html>
<html>
<head>
<script src = "crazycaps.js" type = "text/javascript"></script>
</head>
    <body>
    </body>
</html>

Это заменит весь текст в body результатами функции.

Scott Marcus 01.03.2019 23:21

@ScottMarcus В чем проблема? How to print a javascript function result in HTML. document.body — это произвольный элемент, используемый, в качестве простого примера, для print a result in HTML.

Vladimir Ivanov 01.03.2019 23:26

Проблема в том, что ваш код выбросит все остальное в теле. Вы не думаете, что это проблема? Именно из-за этого ваш ответ не таков, как бы кто-то на самом деле это сделал.

Scott Marcus 01.03.2019 23:27

@ScottMarcus Опять же, это простой пример. Вопрос имеет пустое тело. Я могу буквально сказать то же самое о вашем ответе: The problem is that your code would throw away everything else in the results container. Автор мог легко заменить document.body другим элементом за 2 секунды.

Vladimir Ivanov 01.03.2019 23:29

Нет нельзя?! Мой ответ помещает вывод в конкретный элемент, предназначенный для его получения. Поскольку ваш ответ показывает способ, который не является практичным ни в одном сценарии, и не описывает реальный способ решения проблемы, это не очень хорошее решение.

Scott Marcus 01.03.2019 23:32

РЖУ НЕ МОГУ. В моем ответе нет ничего скопированного у вас или кого-либо еще, кроме исходного кода OP. Мой ответ был опубликован ДО вашего! ржу не могу

Scott Marcus 01.03.2019 23:33

Вы действительно думаете, что взять текст из функции с именем CrazyCaps и поместить его в div внутри основного тела более правильно, чем это решение для реальный сценарий.

Vladimir Ivanov 01.03.2019 23:35

Кроме того, вы манипулируете DOM внутри функции, используемой для генерации строк CrazyCap. Базовое разделение задач. Вы пишете такой код в реальных сценариях?

Vladimir Ivanov 01.03.2019 23:37

Да, конечно. Stack Overflow — это база знаний. Очевидно, что ОП и многие другие, кто найдет эту страницу, не понимают, как это работает. Показывать им «своего рода» ответ и просто предполагать, что они поймут, что им действительно нужно сделать это по-другому, — не очень хорошее предположение. Послушай, ты можешь злиться и спорить, или ты можешь принять мои комментарии за то, что они есть, за простую конструктивную критику и, надеюсь, чему-то научиться из них.

Scott Marcus 01.03.2019 23:37

У вас есть проблема с манипулированием DOM внутри функции? Где ты управляет DOM?

Scott Marcus 01.03.2019 23:38

Я думаю, что этот ответ лучше вашего; значит, вы педантично пытаетесь найти в нем недостатки.

Vladimir Ivanov 01.03.2019 23:39

Извините, что не ответил: "Извините, @ScottMarcus, исправлю с помощью document.getElementById("results")"

Vladimir Ivanov 01.03.2019 23:43

Вы можете добиться этого следующим образом:

function crazyCaps(s) {
  let result = ""
  for (let i = 0; i < s.length; i++) {
    if (i % 2 == 0) {
      result += s[i].toLowerCase();
    } else {
      result += s[i].toUpperCase();
    }
  }
  //Make sure to return your result instead of just logging it
  return result;
}

document.addEventListener('DOMContentLoaded', function() {
  this.body.textContent = crazyCaps('helloworld')
});
<html>

<head>
</head>

<body>
</body>

</html>

Это заменит весь текст в body результатами функции.

Scott Marcus 01.03.2019 23:20

@ScottMarcus Привет, Скотт. Я посмотрю на это, когда вернусь домой. Я думал, что это была желаемая функциональность OP.

Tom O. 01.03.2019 23:25

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