Проблемы с обработкой OnChange в input file

Статус
Закрыто для дальнейших ответов.

zjiodeu

Active Member
Регистрация
24.07.2011
Сообщения
25
Согласно задумке, после выбора файла через input file, под ним должен появиться аналогичный input. Всё работает, только загруженный url исчезает и массив $_FILES соответственно ругается.

Код:
<td colspan="1"  valign="center" align="left" id="paste_file" >
   <input type="file" name="b_file[]" align="right"  
    onChange="file_upload(this)" ><br />
   </td>
Код:
function file_upload(sender)
{
if (sender.value!="")
{

   document.getElementById("paste_file").innerHTML+=
   "<br /><input type=\"file\" name=\"bfile[]\" align=\"right\"  onChange=\"file_upload(this)\">"
    f_count++;
}
 
}
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
innerHTML заменяет весь код в контейнере, для добавления нового элемента используйте
Код:
document.getElementById("paste_file").appendChild("<br /><input type=\"file\" name=\"bfile[]\" align=\"right\"  onChange=\"file_upload(this)\">");
 

Volter9

defined('SURRENDER') or die(); // StarWars
Регистрация
27.05.2012
Сообщения
1 145
innerHTML заменяет весь код в контейнере, для добавления нового элемента используйте
Код:
document.getElementById("paste_file").appendChild("<br /><input type=\"file\" name=\"bfile[]\" align=\"right\" onChange=\"file_upload(this)\">");
[member=lekzd], а что по вашему "+=" в коде?

Уважаемый [member=AngelGabriel], это Мерседес 59 года) А точнее переменная в форме, которая посылается в PHP скрипт.
Согласно задумке, после выбора файла через input file, под ним должен появиться аналогичный input. Всё работает, только загруженный url исчезает и массив $_FILES соответственно ругается.

Код:
<td colspan="1" valign="center" align="left" id="paste_file" >
<input type="file" name="b_file[]" align="right"
onChange="file_upload(this)" ><br />
</td>
Код:
function file_upload(sender)
{
if (sender.value!="")
{

document.getElementById("paste_file").innerHTML+=
"<br /><input type=\"file\" name=\"bfile[]\" align=\"right\" onChange=\"file_upload(this)\">"
f_count++;
}

}
Такая фигня не раз еще наблюдалась, как я помню, при использования innerHTML, appendChild и прочих DОМ функций, они не добавляют код, он лишь имитируют добавление, например: если взглянуть содержимое страницы после изменение с помощью JS, кода видно не будет, а вот если взглянуть через веб-инспектор (я пользуюсь хромом, инспектором-хрома), то код будет виден как элементы DOM'a.

Вывод: лучше использовать AJAX: http://www.html5rocks.com/ru/tutorials/file/dndfiles/
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452
lekzd верно говорит. Только один момент: appendChild нужно передавать не HTML, а DOM Node Object.

Я делаю так:
Код:
<script type="text/javascript">
function _createElement(name, attributes)
{
  var el = document.createElement( name );
  if ( typeof attributes == 'object' ) {
    for ( var i in attributes ) {
      el.setAttribute( i, attributes[i] );

      if ( i.toLowerCase() == 'class' ) {
        el.className = attributes[i];  // for IE compatibility

      } else if ( i.toLowerCase() == 'style' ) {
        el.style.cssText = attributes[i]; // for IE compatibility
      }
    }
  }
  for ( var i = 2; i<arguments.length; i++ ) {
    var val = arguments[i];
    if ( typeof val == 'string' ) { val = document.createTextNode( val ) };
    el.appendChild( val );
  }
  return el;
}

function file_upload(sender)
{
    if ( sender.value != '' )
    {
        var el = _createElement( 'input', {'type': 'file', 'name': 'b_file[]', 'onchange': 'file_upload(this)'});
        document.getElementById('paste_file').appendChild( el );
    }
}
</script>

<div id="paste_file">
  <input type="file" name="b_file[]" onchange="file_upload(this)" />
</div>
 

zjiodeu

Active Member
Регистрация
24.07.2011
Сообщения
25
lekzd верно говорит. Только один момент: appendChild нужно передавать не HTML, а DOM Node Object.

Я делаю так:
Код:
<script type="text/javascript">
function _createElement(name, attributes)
{
var el = document.createElement( name );
if ( typeof attributes == 'object' ) {
for ( var i in attributes ) {
el.setAttribute( i, attributes[i] );

if ( i.toLowerCase() == 'class' ) {
el.className = attributes[i]; // for IE compatibility

} else if ( i.toLowerCase() == 'style' ) {
el.style.cssText = attributes[i]; // for IE compatibility
}
}
}
for ( var i = 2; i<arguments.length; i++ ) {
var val = arguments[i];
if ( typeof val == 'string' ) { val = document.createTextNode( val ) };
el.appendChild( val );
}
return el;
}

function file_upload(sender)
{
if ( sender.value != '' )
{
var el = _createElement( 'input', {'type': 'file', 'name': 'b_file[]', 'onchange': 'file_upload(this)'});
document.getElementById('paste_file').appendChild( el );
}
}
</script>

<div id="paste_file">
<input type="file" name="b_file[]" onchange="file_upload(this)" />
</div>
Пасибо, работает со свистом)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ