2010-11-20 13 views
5

私は、フォームの投稿の前に複数のファイルのアップロードを許可しようとしています。私が望むのは、ユーザーが1つのファイルアップロード要素のみを表示し、ファイルが選択されるたびに、ファイル名を含む新しい<li>と、その特定のファイルをコレクションから削除するイメージ/リンクを表示することです。私が望むことをするjQuery MultiFileプラグインがありますが、私が自分のものを使いたいので、私が望むやり方で動作するカスタムスタイリングを手に入れることはできません。複数のファイルをjQueryでアップロード

これまでのところ、私は以下のコードを持っています。 <li>が正常に追加され、ファイルアップロード要素が新しく選択されたファイルに隠され、新しいファイルを選択するための空のファイルアップロード要素がページに追加されます。私は要素の除去を適切に管理するのには苦労しています。それほど難しいことではありませんが、私はこれを十分に凝視しています。私は、他の人がいくつかの洞察力を持っていること、これをきれいにする(つまりよりエレガントにする)ためのヒントなどを期待しています。以下のコード。

HTML:

<div id="product-image-area" class="group" style="border-bottom: none; padding-top: 0"> 
    <ul id="photos" class="nobull">  
    <li id="no-product-images-msg" class="" > 
      <%= Html.Image("no-photos.png") %> 
    </li> 
    </ul> 
</div> 
<div id="upload-area"> 
    <h4 class="st">Upload an image</h4> 
    <p class="note">Allowed file types are .gif, .jpg, .jpeg, and .png</p> 
    <p id="file-input" class="st sb"><input class="photo-upload" id="VenuePhotos_0" name="VenuePhotos[]" type="file" /></p> 
</div> 

スクリプト:

$(function() { 
    $('.photo-upload').live('change', function() { 
     var fileCount = new Number($(this).parent().children('.photo-upload').length); 
     $('#photos').append('<li id="venue_photo_' + (fileCount - 1) + '">' + $(this).val() + '<img title="' + (fileCount - 1) + '" src="/vh/public/images/icon-delete.png" class="delete" /></li>'); 
     $(this).parent().append(
      $(this).clone().attr('id', 'VenuePhotos_' + fileCount) 
     ); 
     $(this).hide(); 
    }); 
    $('.delete').live('click', function (e) { 
     var index = $(e).attr('title'); 
     $('#file-input').children('.photo-upload').remove('#VenuePhotos_' + index); 
     $('#photos').children().remove('#venue_photo_' + index); 
    }); 
}); 

答えて

4

答えは閉鎖は、JavaScriptの最も強力な機能の一つです。他の内部にある関数are able to access the variables of the enclosing functions

ファイル入力ではなく.liveを使用しての追加と、動的にIDの生成されたときにあなたがあなたの削除機能をバインドすることができます。この例では

$('.photo-upload').live('change', function() { 
    var li = $('<li />').text($(this).val()), 
     img = $('<img src="/vh/public/images/icon-delete.png" class="delete" />'), 
     input = $(this).clone(); 

    li.append(img); 
    $('#photos').append(li); 
    $(this).parent().append(input); 
    $(this).hide(); 

    img.click(function() { 
     input.remove(); 
     li.remove(); 
    }); 
}); 

を、削除ボタン用clickハンドラがために(jQueryのラッパーにアクセス2つの要素は削除する必要があります)。

+0

ああ、とても近いです。だから問題は、削除では削除すべき新しい入力ではなく、前の入力であるということです。新しいものは空だから、それはふさふさしたドリーです。しかし、削除イメージをクリックすると、適切な(現在隠れている)ファイル要素がページから削除され、コレクションと共に送信されないようにしたいと考えています。それが特定のIDでアクセスする理由だったのです。私はクリックイベントがあなたの提案に取り組んでいるので、これで遊んでいきますが、あなたがその追加情報に基づいて他の考えを持っているならば、ホラー。ありがとう! – nkirkes

+0

それでは、親のファイル要素を保持する新しい変数を追加して、Chromeや、IEやFFのテストをしていないので、 'input.remove'を 'parentInput.remove'に変更しました。 Voila。素晴らしい、男、助けてくれてありがとう! – nkirkes

+0

Mannishのように同じファイルを複数同時に選択したいのであれば、それぞれをそれぞれの削除ボタンが付いたブラウザウィンドウにすべて表示させるにはどうしたらいいですか? – serengeti12

関連する問題