JavaScript-обновление нескольких слайдеров innerHTML

Я делаю табличную форму, в которой пользователь будет настраивать несколько ползунков в таблице. Я хочу обновить значение, которое будет отображаться на экране для каждого ползунка. Я пытался сделать это с помощью getElementsByClassName, но когда я настраиваю один ползунок, выходное значение отображается на всех других ползунках. Думаю, я могу назначить идентификатор каждому слайдеру (их около 20), но мне было интересно, есть ли более эффективный способ сделать это.

Вот пример html-кода для входных данных таблицы:

<form>
<table>
    <tr>
        <th rowspan="5" id="A"></th>
        <td></td>    
        <td><input type="range" min="0" max="10" value="5" step="1" onChange="sliderChange(this.value)"/><br />Current Value: <span class="sliderStatus">5</span></td>
        <td></td>
        <td><input type="range" min="0" max="10" value="5" step="1" onChange="sliderChange(this.value)"/><br />Current Value: <span class="sliderStatus">5</span></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="range" min="0" max="10" value="5" step="1" onChange="sliderChange(this.value)"/><br />Current Value: <span class="sliderStatus">5</span></td>    
        <td></td>
        <td><input type="range" min="0" max="10" value="5" step="1" onChange="sliderChange(this.value)"/><br />Current Value: <span class="sliderStatus">5</span></td>

    </tr>
    <tr>
        <td></td>
        <td><input type="range" min="0" max="10" value="5" step="1" onChange="sliderChange(this.value)"/><br />Current Value: <span class="sliderStatus">5</span></td>    
        <td></td>
        <td><input type="range" min="0" max="10" value="5" step="1" onChange="sliderChange(this.value)"/><br />Current Value: <span class="sliderStatus">5</span></td>
    </table>
   </form>

и JS-код:

//called when the user clicks the start button on the home page.
function start(){
var decisionA = prompt("Enter A:","");
var decisionB = prompt("Enter B:","");

//send user prompt inputs to A and B cells in the table<th>.
document.getElementById('A').innerHTML = decisionA;
document.getElementById('B').innerHTML = decisionB;
}

function sliderChange (val){
     var sliders = document.getElementsByClassName('sliderStatus');
     for (i = 0; i < sliders.length; i++){
     sliders[i].innerHTML = val;
     }
   }

Есть ли способ заставить текст значения ползунка отображать скорректированное значение ползунка для каждого отдельного ползунка в таблице, используя getElementsByClassName, или мне нужно назначить 20 разных идентификаторов для всех ползунков? Спасибо.


person Brent    schedule 07.01.2018    source источник


Ответы (2)


Хорошо, вот окончательный ответ. Но вы действительно должны научиться отлаживать свой собственный код. В противном случае вы никогда не сможете закончить что-либо, что вы строите, если все ваши проблемы окажутся здесь.

#1 Прежде всего вам нужно изменить onChange="sliderChange(this.value)" на onChange="sliderChange(this)", и причина этого в том, что когда вы передаете ввод в SliderChange(), тогда все, что вы получаете, это значение, а не весь ввод, который вы Повторное прикосновение или использование. И неразумно передавать единственное значение, когда на самом деле вам может понадобиться гораздо больше. А что вам нужно больше, чем ценность? вам нужно выяснить, какой ввод фактически был изменен, а не только значение измененного ввода. И причина, по которой вам нужно сначала узнать, какой ввод был изменен, заключается в том, чтобы вы могли изменить его снова и сделать к нему обратный вызов. Поскольку значение из вашего ввода ничего не говорит вам о том, какой ввод фактически был изменен, поэтому вы можете снова изменить его.

#2 Теперь, когда у вас наконец есть входные данные, вам нужно выяснить, по какому индексу они находятся, поскольку у них нет определенного идентификатора для их идентификации, опция индекса позволяет вам в основном использовать скрытого или подсчитанного для вас идентификатора. И поэтому вам сначала нужно сначала добавить эту строку кода: var index = document.getElementsByTagName('input');

#3 Наконец, теперь у нас есть измененный ввод и класс 'sliderStatus', который нужно изменить. Затем нам нужно выяснить, какой «sliderStatus» нужно изменить. Но проблема в том, что ни один класс 'sliderStatus' не был затронут или изменен. Поэтому нам нужно каким-то образом связать его с входными данными, которые были изменены, с диапазоном, который необходимо изменить. К счастью, именно здесь мы можем использовать индекс, поскольку они следуют одному и тому же порядку сразу после другого, мы можем считать их одинаково и использовать один и тот же индекс.

for (i = 0; i < index.length; i++){
   if(e == index[i]){
      sliders[i].innerHTML = e.value;
   }
}
So now that we didn't pass the val, but the entire input info trough this option into sliderChange(), we can now compare all the counted indexes with the actual index that we have made changes on. And then when we have a match, only then we change something and we do it using the same index. And this is where we only now at the very end need our value that we need to modify something with. So don't be in a rush to change something. First you need to figure out what you need to change before you are trying to change it. And then use google to figure out how to find indexes etc.

function sliderChange(e){
   var index = document.getElementsByTagName('input');
   var sliders = document.getElementsByClassName('sliderStatus');

   for (i = 0; i < index.length; i++){
      if(e == index[i]){
         sliders[i].innerHTML = e.value;
      }
   }
}

person Vadim Cool    schedule 07.01.2018
comment
Спасибо @Вадим Крутой. Когда я встал этим утром, я решил, что собираюсь начать играть с объектом this, и я знал, что должен найти способ перебрать индекс и проверить, является ли значение текущего индекса тем, которое изменено. Вы подтвердили, что я на правильном пути, и сэкономили мне время. Спасибо за ответ. - person Brent; 07.01.2018

Да, это выводится для всех из них, потому что все они имеют один и тот же класс 'SliderStatus', и поэтому вы вызываете скрипт SliderChange(), который в ответ снова получает статус всех классов 'sliderStatus'. Вам нужно сосредоточиться на одном конкретном изменении в одном конкретном вводе. Вы можете легко добиться этого, используя ЭТО в JS. Пример jQuery:

$('sliderStatus').change(function(){
   $(this).val();
});

Это всего лишь быстрый пример того, как извлекать данные по-другому, без использования onClick и т. д. Вы, вероятно, можете понять остальное.

Другой пример: вы можете пройтись по каждому из ваших ползунков и изменить их по ходу дела.

$('sliderStatus').each(function(){
   $(this).val();
});

Этот метод позволяет проверить их все одновременно. Надеюсь, это немного поможет вам в изучении JS.

person Vadim Cool    schedule 07.01.2018
comment
Есть ли способ сделать это без библиотеки? Я стараюсь пока не использовать библиотеки. Я посмотрю, что вы мне показали, но просто любопытно, есть ли способ сделать то, что я хочу, в vanilla JS. Благодарю вас! - person Brent; 07.01.2018