Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.03.2017, 21:54
Интересующийся
Отправить личное сообщение для HaseProgram Посмотреть профиль Найти все сообщения от HaseProgram
 
Регистрация: 07.03.2012
Сообщений: 28

Выделение в замыкании.
Добрый вечер.
Имеется примерно следующая структура:
<label class="file-upload" for="upload-img">
  <mark>Choose img...</mark>
  ...
  <input type="file" id="upload-img">
</label>
...
<label class="file-upload" for="upload-img">
  <mark>Choose img...</mark>
  ...
  <input type="file" id="upload-img">
</label>

Необходимо по событию, что изменился инпут, присвоить его значение в его марк.
Делал так (после прочтения вот этой темы http://javascript.ru/basic/closure)
function SetPath(sel, fm)
{
  fm.innerHTML = sel.value;
}

function FileInput()
{
  var label = document.пetElementsByClassName('file-upload');
  for(var i = 0; i < label.length; i++)
  {
    var inp = label[i].getElementsByTagName('input')[0];
    inp.onchange = function(x)
    {
      // console.log(x) выводит 0,1 при вызове функции FileInput()
      return function()
      {
        // передать label как параметр не получилось
        var label = document.getElementsByClassName('file-upload');
        // console.log(x) выводит всегда 0 при изменении любого инпута
        var mark = label[x].getElementsByTagName('mark');
        SetPath(this, mark);
      }
    }(i)
  }
}

Собственно вопрос - почему Х всегда 0? И как это можно реализовать?
Второй вопрос,
inp.onchange = function(x) {}

Разве здесь функция не требует первым параметром event? Если да, то почему в статье на которую я привел ссылку все работает? Если нет, то опять же почему? Заранее спасибо.

Последний раз редактировалось HaseProgram, 13.03.2017 в 22:30.
Ответить с цитированием
  #2 (permalink)  
Старый 14.03.2017, 07:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

HaseProgram,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>

</head>

<body>
<label class="file-upload" for="upload-img">
  <mark>Choose img...</mark>
  ...
  <input type="file" id="upload-img">
</label>
...
<label class="file-upload" for="upload-img">
  <mark>Choose img...</mark>
  ...
  <input type="file" id="upload-img">
</label>
<script>
window.addEventListener('DOMContentLoaded', function() {
  [].forEach.call(document.querySelectorAll('.file-upload'), function(label) {
        var mark = label.querySelector('mark');
        label.querySelector('input').addEventListener('change', function() {
            mark.innerHTML  = this.value;
        });
    });
  });

</script>

</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение в браузерах ТОТ_САМЫЙ Оффтопик 4 01.10.2015 01:12
Textarea и выделение текста dima85 Общие вопросы Javascript 2 29.09.2014 13:48
Выделение текста в текстовом поле. Как снять выделение с пробела вконце? Roman Koff Events/DOM/Window 10 01.07.2010 16:48
Как убрать выделение в Опере у div, получившего фокус ? spa_2002 Opera, Safari и др. 5 03.09.2009 10:42
Выделение одиночных тэгов Pattern Events/DOM/Window 7 26.05.2009 23:29