@PressOff

Почему JS не находит элемент?

Доброго времени суток!

Uncaught TypeError: Cannot set property 'innerHTML' of null
at HTMLInputElement.

Не могу понять почему JS не находит элемент label....

перегуглил даже англоязычные версии, но и там не нашёл для себя ответа...

Задача выводить название загружаемого файла вместо текущей записи в теге label.

Ниже код:

<label for="file" class="upload-label"><span>Upload</span></label>
<input type="file" name="file" id="file" class="hide inputfile"  accept="application/vnd.ms-excel" 
data-multiple-caption="{count} files selected" multiple/>


var inputs = document.querySelectorAll( '.inputfile' );
Array.prototype.forEach.call( inputs, function( input )
                             {
    var label	 = input.nextElementSibling,
        labelVal = label.innerHTML;

    input.addEventListener( 'change', function( e )
                           {
        var fileName = '';
        if( this.files && this.files.length > 1 )
            fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
        else
            fileName = e.target.value.split( '\\' ).pop();

                                            if( fileName )
        label.querySelector( 'span' ).innerHTML = fileName;
        else
            label.innerHTML = labelVal;
    });
});


.hide {
position: absolute;
    overflow: hidden;
    z-index: -1;
    width: 0.1px;
    height: 0.1px;
    opacity: 0;
}

.upload-label{
    display: inline-block;
    cursor: pointer;
    background-color: #357;
    padding: 5px 80px;
    color: white;
    border-radius: 5px;
    border: 1px solid black;
}
  • Вопрос задан
  • 1140 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
У вас в школе по английскому была честная двойка, или давали взятки ради троек? Ну, то есть - откройте словарь, и посмотрите, как переводится слово "next". Потом посмотрите в каком порядке расположены ваши элементы.
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Про проблему с next/previous уже написали, но относительное получение элементов вообще чревато проблемами, что будете делать, если завтра верстка изменится?
label для input лучше искать так:
function getLabelForInput(input) {
  if(input.id) {
    const label = document.querySelector(`label[for="${input.id}"]`);
    if(label) { return label; }
  }
  for(let parent = input; parent = parent.parentElement;) {
    if(parent.tagName === 'LABEL') { return parent; }
  }
  return null;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы