Как избавиться от тысяч строк

Чтобы показать, какой курс изучает студент, я написал эти простые строки, нажмите на студента и посмотрите курс, но кажется, что там тысячи строк кода, так как я должен перечислить так много студентов и курсов. Есть ли способ написать одну функцию для получения значения объекта вместо написания отдельной функции для каждого клика?

//and goes on thousands of times like this...
var txt = document.getElementById("txt");  
var students = {
   student1: "english",
   student2: "maths",
   student3: "history",
   student4: "geography",
   student5: "science",
   student6: "maths",
   student7: "maths",
   student8: "history",
   student9: "french",
   student10: "geography",
};
//and there are thousands of students...

function f1(){txt.innerHTML = students.student1;};
function f2(){txt.innerHTML = students.student2;};
function f3(){txt.innerHTML = students.student3;};
function f4(){txt.innerHTML = students.student4;};
function f5(){txt.innerHTML = students.student5;};
function f6(){txt.innerHTML = students.student6;};
function f7(){txt.innerHTML = students.student7;};
function f8(){txt.innerHTML = students.student8;};
function f9(){txt.innerHTML = students.student9;};
function f10(){txt.innerHTML = students.student10;};
// so there are thousands of functions...
 <a class = "k"  onClick = "f1(); return false;" href = "#">student1</a><br/>
 <a class = "k"  onClick = "f2(); return false;" href = "#">student2</a><br/>
 <a class = "k"  onClick = "f3(); return false;" href = "#">student3</a><br/>
<div id = "txt"></div>

На самом деле я пробовал это, полагая, что это сработает:

var stdnt = document.querySelectorAll(".k);
var x = stdnt.innerHTML;
var result = "";

if ( x === students[x] ){
    x = students[x];
}
result = x;
function forAll (){
    txt.innerHTML = result;
}

Но это вообще не работает (думаю, это естественно для абсолютного новичка). Мне очень нужна идея.

Вы забыли добавить вторую скобку " в querySelector.

doo_doo_fart_man 13.12.2020 19:11

Да, опечатка! но опять не работает. Единственное, что я получаю, это "неопределенная" ошибка.

Hakan göçmen 13.12.2020 19:13

Кроме того, вы помещаете комментарии javascript в HTML.

doo_doo_fart_man 13.12.2020 19:15

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

Love Tätting 13.12.2020 19:34

Каждый студент может видеть информацию о курсе, и я надеюсь, что найду способ автоматически обновлять курсы (при условии, что я улучшу свои навыки работы с javascript).

Hakan göçmen 13.12.2020 19:45
Поведение ключевого слова "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) для оценки ваших знаний,...
2
5
105
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете сжать его, чтобы использовать одну функцию и передать innerHTML элемента привязки. Эта строка может использоваться как метод доступа к объекту.

var txt = document.getElementById("txt");  
var students = {
   student1: "english",
   student2: "maths",
   student3: "history",
   student4: "geography",
   student5: "science",
   student6: "maths",
   student7: "maths",
   student8: "history",
   student9: "french",
   student10: "geography",
};

function f(key) {
    txt.innerHTML = students[key];
};
<a class = "k" onClick = "f(this.innerHTML); return false;" href = "#">student1</a><br/>
<a class = "k" onClick = "f(this.innerHTML); return false;" href = "#">student2</a><br/>
<a class = "k" onClick = "f(this.innerHTML); return false;" href = "#">student3</a><br/>
<div id = "txt"></div>

@Hakangöçmen - самый простой не обязательно означает лучший. Нина обычно не публикует простой код, но здесь вам придется обновить HTML, когда вы получите нового ученика. в моем случае требуется только одно обновление таблицы поиска

mplungjan 13.12.2020 19:37

@mplungjan - согласен, возможно, вы показали один из самых эффективных методов для проекта, но дело в том, что я начал изучать javascript всего несколько недель назад, и я думаю, что мне нужно еще немного времени и практики, чтобы идти дальше. Но я записал все предложения, сделанные здесь, и они обязательно будут служить мне ориентиром в будущем. Спасибо вам всем!

Hakan göçmen 13.12.2020 20:04

Вы можете сделать это в одной функции и поддерживать html, например, для обработки идентификатора курса:

<a class = "k"  onClick = "getCourse(“student1”); return false;" href = "#">student1</a><br/>


function getCourse(student) { // Contains the student
   txt.innerHTML = students[student];
 }

Не рекомендуется использовать встроенные обработчики событий. Смотрите это для лучшего ответа

mplungjan 13.12.2020 19:20

Посмотри на это

Он использует несколько рекомендуемых методов

  1. прослушиватели событий
  2. СУХОЙ (не повторяйтесь)
  3. делегация

const students = {
  student1: "english",
  student2: "maths",
  student3: "history",
  student4: "geography",
  student5: "science",
  student6: "maths",
  student7: "maths",
  student8: "history",
  student9: "french",
  student10: "geography",
};
// create the html so only one place to add a student
const html = Object.entries(students)
  .map(entry => `<a href = "#" class = "k" 
    data-student = "${entry[1]}">${entry[0]}</a>`);

// on page load fill the student Div     
window.addEventListener('load', function() {
  const div = document.getElementById("studentDiv");
  const text = document.getElementById('text')
  div.innerHTML = html.join('<br/>');
  // delegate the click to the container, so only ONE event handler is used
  div.addEventListener('click', function(e) {
    const tgt = e.target;
    if (tgt.classList.contains('k')) {
      e.preventDefault(); // stop the link from executing
      text.innerHTML = tgt.dataset.student;
    }
  });
});
<div id = "studentDiv"></div>
<div id = "text"></div>

Проще

const students = {
  student1: "english",
  student2: "maths",
  student3: "history",
  student4: "geography",
  student5: "science",
  student6: "maths",
  student7: "maths",
  student8: "history",
  student9: "french",
  student10: "geography",
};
// create the html so only one place to add a student
const html = Object.entries(students)
  .map(entry => `<a href = "#" class = "k">${entry[0]}</a>`);

// on page load fill the student Div     
window.addEventListener('load', function() {
  const div = document.getElementById("studentDiv");
  const text = document.getElementById('text')
  div.innerHTML = html.join('<br/>');
  // delegate the click to the container, so only ONE event handler is used
  div.addEventListener('click', function(e) {
    const tgt = e.target;
    if (tgt.classList.contains('k')) {
      e.preventDefault(); // stop the link from executing
      text.innerHTML = students[tgt.textContent]
    }
  });
});
<div id = "studentDiv"></div>
<div id = "text"></div>

зачем вы используете dataset, если цель всегда известна?

Nina Scholz 13.12.2020 19:40

Это хорошо. Добавлен более простой, который использует поиск, как и вы.

mplungjan 13.12.2020 19:48

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