1 функция для независимой замены innerHTML 4 разных идентификаторов

Мне нужна функция, которая заменит innerHTML элемента идентификатором с определенной строкой в ​​зависимости от его собственного innerHTML. В настоящее время у меня есть 4 элемента с разными идентификаторами, и у меня есть функция сортировки для каждого из них. Поскольку 4 функции делают одно и то же и заменяют innerHTML точно такими же строками в зависимости от одних и тех же условий, возможно ли создать 1 функцию, которая будет работать для всех элементов одновременно, вместо 4? (Каждая функция проверяет 160 различных значений, что означает, что каждая из них содержит 160 операторов if ... наличие 4 из них делает код излишне длинным)

Вот пример кода (с 3 разными условиями для каждого элемента вместо 160):

<body>

  <div id = "object1">10</div>
  <div id = "object2">10</div>
  <div id = "object3">10</div>
  <div id = "object4">10</div>

  <div id = "extra1"></div>
  <div id = "extra2"></div>
  <div id = "extra3"></div>
  <div id = "extra4"></div>

<script>

  function changeHTML1() {
    var ob1 = document.getElementById("object1");
    var ex1 = document.getElementById("extra1");
    if (ob1.innerHTML == "10") {
      ex1.innerHTML = "D5";
    }
    if (ob1.innerHTML == "9") {
      ex1.innerHTML = "1-D4";
    }
    if (ob1.innerHTML == "8") {
      ex1.innerHTML = "D4";
    }
  }

  function changeHTML2() {
    var ob2 = document.getElementById("object2");
    var ex2 = document.getElementById("extra2");
    if (ob2.innerHTML == "10") {
      ex2.innerHTML = "D5";
    }
    if (ob2.innerHTML == "9") {
      ex2.innerHTML = "1-D4";
    }
    if (ob2.innerHTML == "8") {
      ex2.innerHTML = "D4";
    }
  }

  function changeHTML3() {
    var ob3 = document.getElementById("object3");
    var ex3 = document.getElementById("extra3");
    if (ob3.innerHTML == "10") {
      ex3.innerHTML = "D5";
    }
    if (ob3.innerHTML == "9") {
      ex3.innerHTML = "1-D4";
    }
    if (ob3.innerHTML == "8") {
      ex3.innerHTML = "D4";
    }
  }

  function changeHTML4() {
    var ob4 = document.getElementById("object4");
    var ex4 = document.getElementById("extra4");
    if (ob4.innerHTML == "10") {
      ex4.innerHTML = "D5";
    }
    if (ob4.innerHTML == "9") {
      ex4.innerHTML = "1-D4";
    }
    if (ob4.innerHTML == "8") {
      ex4.innerHTML = "D4";
    }
  }

</script>

</body>

Ваши функции в настоящее время одинаковы с точно, почему бы не удалить все, кроме одного, и обратиться к нему?

CertainPerformance 09.08.2018 05:01

Извините, я копировал похожие части кода. Позвольте мне отредактировать его, чтобы он был правильным ...

ChrisLe5512 09.08.2018 05:03
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
83
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы можете попробовать это;

function changeHTML() {
  var i;
  var numberOfElements = 4;

  for (i = 1; i <= numberOfElements; i++) {         
    var ob = document.getElementById("object"+i);
    var ex = document.getElementById("extra"+i);

    if (ob.innerHTML == "10") {
      ex.innerHTML = "D5";
    }
    if (ob.innerHTML == "9") {
      ex.innerHTML = "1-D4";
    }
    if (ob.innerHTML == "8") {
      ex.innerHTML = "D4";
    }
 }    
}

Большой! Большое спасибо!

ChrisLe5512 09.08.2018 05:12

Одним из вариантов было бы создание функции высшего порядка - функции, в которую вы можете передать идентификаторы объекта и дополнительные данные:

const makeChangeHTML = (objSel, extSel) => {
  const ob = document.getElementById(objSel);
  const ex = document.getElementById(extSel);
  return () => {
    // do tests, assign to `ex`

Но, вероятно, было бы проще, если бы вы использовали объект для возможных значений object и соответствующее значение для перехода в extra, а не несколько очень подробных операторов if:

const extraIndexedByObj = {
  '10': 'D5',
  '9': '1-D4',
  '8': 'D4',
};

const makeChangeHTML = (objId, extId) => {
  const ob = document.getElementById(objId);
  const ex = document.getElementById(extId);
  return () => {
    const { textContent } = ob;
    const extraVaue = extraIndexedByObj[textContent];
    if (extraVaue !== undefined) ex.textContent = extraVaue;
  }
}

Затем вы можете создать функцию, вызвав makeChangeHTML с соответствующими селекторами:

const change1 = makeChangeHTML('object1', 'extra1');
const change2 = makeChangeHTML('object2', 'extra2');

Но, если это возможно, было бы неплохо также изменить ваш HTML - вместо использования отдельного идентификатора для каждого отдельного элемента вы можете дать каждому элементу имя класса, а затем связать n-й object с n-м extra. Идентификаторы здесь не подходят - например:

<div class = "object">10</div>
<div class = "object">10</div>
<div class = "object">10</div>
<div class = "object">10</div>

<div class = "extra"></div>
<div class = "extra"></div>
<div class = "extra"></div>
<div class = "extra"></div>

А затем выберите каждую пару, чтобы вы могли делать с ними все, что вам нужно:

const objects = document.querySelectorAll('.object');
const extras = document.querySelectorAll('.extra');
objects.forEach((object, i) => {
  const extra = extras[i];
  // do something with each `object` and each `extra`
});

Да, идея использования объекта вместо операторов if имеет гораздо больший смысл. Спасибо!

ChrisLe5512 09.08.2018 05:16

Думаю, вам нужно переосмыслить проблему. Вместо проверки условий вы можете использовать объект.

var lookup = {
  "10" : "D5",
  "9" : "1-D4",
  "8" : "D4"
};

function doCheck(inElemId, outElemId) {
  var in = document.getElementById(inElemId);
  var out = document.getElementById(outElemId);

  var key = in.textContent.trim();

  if (lookup.hasOwnProperty(key)) {
    // the lookup object contains the 'key'
    out.textContent = lookup[key];
  }
}

Если идентификаторы элементов являются инкрементными числовыми значениями, вы можете использовать цикл.

[1,2,3,4].forEach(function(ix) {
  doCheck('object'+ix, 'extra'+ix);
});

Для более масштабируемого решения используйте querySelectorAll

function changeHtml()
{
  //Get all elemtents which have an id that starts with "object"
  var sourceElements = document.querySelectorAll("[id^='object']");
  
  for(var i = 0; i < sourceElements.length; i++)
  {
    var value = sourceElements[i].innerHTML;    
    var suffix = sourceElements[i].id.replace("object","");
    var target = document.getElementById("extra" + suffix);
    
    //A switch is better than multiple ifs
    //This could also be easily replace with an object based
    //solution similar to that in other answers.
    switch(value)
    {
      case "10":
        target.innerHTML = "D5";
        break;
      case "9":
        target.innerHTML = "1-D4";
        break;
      case "8":
        target.innerHTML = "D4";
        break;
    }
  }
  
}

changeHtml();
 <div id = "object1">10</div>
  <div id = "object2">9</div>
  <div id = "object3">8</div>
  <div id = "object4">10</div>

  <div id = "extra1"></div>
  <div id = "extra2"></div>
  <div id = "extra3"></div>
  <div id = "extra4"></div>



 

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