2016-09-03 16 views
2

パネルを動的に追加または削除するjQuery UI Accordionイメージローダーを作成しました。各パネルの中には画像入力フォームコントロールがあり、ドキュメントの最後にはパネル内のimg srcを新しく選択した画像に変更する機能があります。残念ながら、私は得る:cannot read 'files' of undefined。私はなぜこれをやっているのか理解しています。私はパネルを動的に追加し、イメージをロードしたパネルのimg srcを更新できる方法が必要です。動的に作成されたオブジェクトを関数に渡す

私のコードは、これまでのところ、次のとおりです。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <!-- css links --> 
    <link href="/Content/bootstrap-theme.css" rel="stylesheet" /> 
    <link href="/Content/bootstrap.css" rel="stylesheet" /> 
    <link href="/Scripts/jquery-ui-1.12.0/jquery-ui.css" rel="stylesheet" /> 
    <!-- /css links --> 
    <!-- js files --> 
    <script src="/Scripts/jquery-3.1.0.js"></script> 
    <script src="/Scripts/jquery-ui-1.12.0/jquery-ui.js"></script> 
    <!-- /js files --> 
</head> 
<body id="myPage" data-spy="scroll" data-target=".navbar" data-offset="60"> 
    <script lang="en" type="text/javascript"> 
     $(function() { 
      $("#PrimaryImageAccordion").accordion({ 
       collapsible: true 
      }); 
     }); 
    </script> 
    <br /><br /> 
    <button type='button' onclick='btnAddPrimaryImage_Click();' class='btn btn-default'> Add </button> 
    <div id="PrimaryImageAccordion"> 
     <h4 class="PrimaryImageTitle">Primary Image</h4> 
     <div> 
      <div class="row form-group"> 
       <label for="ImageSelector" class="control-label col-md-2">Project Image</label> 
       <div class="col-md-10"> 
        <input type="file" id="ImageSelector" onchange="ImageSelector_Change(this);" /><br /> 
        <img id="Image" src="#" style="width: 100px; visibility: hidden;" /> 
       </div> 
      </div> 
     </div> 
    </div> 
    <script lang="en" type="text/javascript"> 
     function btnAddPrimaryImage_Click() { 
      var template = "<h4 class='PrimaryImageTitle'>Primary Image<a onclick='removePanel(this);' style='float:right'>X</a></h4>\n"; 
      template += "<div class='AccordionPanel'><div class='row form-group'>\n"; 
      template += "<label for='ImageSelector' class='control-label col-md-2'>Project Image</label>\n"; 
      template += "<div class='col-md-10'>\n"; 
      template += "<input type='file' id='Image1Selector' /><br />\n"; 
      template += "<img id='Image' src='#' style='width: 100px; visibility: hidden;' />\n"; 
      template += "</div></div></div>\n"; 

      $("#PrimaryImageAccordion").append(template); 

      $("#PrimaryImageAccordion").accordion("refresh"); 
     } 

     function removePanel(a) { 
      $(a).parent().next().remove(); 
      $(a).parent().remove(); 
      $("#PrimaryImageAccordion").accordion("refresh"); 
      return false; 
     } 

     function ImageSelector_Change(object, input) { 
      if (input.files && input.files[0]) { 
       var reader = new FileReader(); 

       reader.onload = function (e) { 
        object.attr("src", e.target.result); 
        object.css("visibility", "visible"); 
       } 

       reader.readAsDataURL(input.files[0]); 
      } 
     } 
    </script> 
</body> 

</html> 

アップデート1

次のように私のメインセレクター/ローダ機能を変更:

function ImageSelector_Change(input) { 
    var object = $(input).parent().find('img#Image'); 

    if (input.files && input.files[0]) { 
     var reader = new FileReader(); 

     reader.onload = function (e) { 
      object.attr("src", e.target.result); 
      object.css("visibility", "visible"); 
     } 

     reader.readAsDataURL(input.files[0]); 
    } 
} 

を唯一の問題は、それがロードされていることです追加イメージではなく最初のイメージのみ

答えて

1

IDは一意である必要があります。

だから、機能btnAddPrimaryImage_Clickで私は新しい要素が増分変数を使用してアコーディオンに追加する方法を修正しました。ロードされた画像を配置する画像

  • 画像IDを取得するために:

    • この:

      機能ImageSelector_Changeニーズは、2つのパラメータを取得します。

    また、ブートストラップを使用しているため、互換性の問題についてjQuery 3.xを避けることをお勧めします。

    スニペットは:

    $(function() { 
     
        $("#PrimaryImageAccordion").accordion({ 
     
        collapsible: true 
     
        }); 
     
    }); 
     
    
     
    var idCounter = 0; 
     
        function btnAddPrimaryImage_Click() { 
     
         idCounter++; 
     
         var template = "<h4 class='PrimaryImageTitle'>Primary Image<a onclick='removePanel(this);' style='float:right'>X</a></h4>\n"; 
     
         template += "<div class='AccordionPanel'><div class='row form-group'>\n"; 
     
         template += "<label for='ImageSelector'" + idCounter + " class='control-label col-md-2'>Project Image</label>\n"; 
     
         template += "<div class='col-md-10'>\n"; 
     
         template += "<input type='file' id='ImageSelector" + idCounter + "' onchange='ImageSelector_Change(this,\"Image" + idCounter + "\");' /><br />\n"; 
     
         template += "<img id='Image" + idCounter + "' src='#' style='width: 100px; visibility: hidden;' />\n"; 
     
         template += "</div></div></div>\n"; 
     
    
     
         $("#PrimaryImageAccordion").append(template); 
     
    
     
         $("#PrimaryImageAccordion").accordion("refresh"); 
     
        } 
     
    
     
        function removePanel(a) { 
     
         $(a).parent().next().remove(); 
     
         $(a).parent().remove(); 
     
         $("#PrimaryImageAccordion").accordion("refresh"); 
     
         return false; 
     
        } 
     
    
     
        function ImageSelector_Change(object, input) { 
     
         if (object.files && object.files[0]) { 
     
          var reader = new FileReader(); 
     
    
     
          reader.onload = function (e) { 
     
           document.getElementById(input).src = e.target.result; 
     
           document.getElementById(input).style.visibility = "visible"; 
     
          } 
     
    
     
          reader.readAsDataURL(object.files[0]); 
     
         } 
     
        }
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
     
    <link href="https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css" rel="stylesheet"/> 
     
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> 
     
    <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script> 
     
    
     
    <br /><br /> 
     
    <button type='button' onclick='btnAddPrimaryImage_Click();' class='btn btn-default'> Add </button> 
     
    <div id="PrimaryImageAccordion"> 
     
        <h4 class="PrimaryImageTitle">Primary Image</h4> 
     
        <div> 
     
         <div class="row form-group"> 
     
          <label for="ImageSelector" class="control-label col-md-2">Project Image</label> 
     
          <div class="col-md-10"> 
     
           <input type="file" id="ImageSelector" onchange="ImageSelector_Change(this, 'Image');" /><br /> 
     
           <img id="Image" src="#" style="width: 100px; visibility: hidden;" /> 
     
          </div> 
     
         </div> 
     
        </div> 
     
    </div>

  • +0

    '65行目で' 'null 'のプロパティ' src 'を設定できません。特に' document.getElementById(input).src = e.target.result; '。私はそれを私の答え、2つの答えを一緒に働くことにチャンスを働くことを得ることができましたか? –

    +0

    @JohnSchultz私はインラインイベントを変更しました:onchange = "ImageSelector_Change(this、 'Image');"ここではこれは入力タイプのファイルで、2番目のパラメータは対応するimgタグのIDです。それは私のスニペットで機能しますか? – gaetanoM

    +0

    はい、うまくいきました。ありがとうございました。 –

    0

    私はあなたがこのような単一のこの関数のパラメータを変更する必要があると思う。 onchangeイベントが単一のパラメータでこの関数を起動するためです。 は、だから、object受信しますが、あなたは何回あなたがsamaID

    var vrImgeID=0; 
    function btnAddPrimaryImage_Click() { 
        var template = "<h4 class='PrimaryImageTitle'>Primary Image<a onclick='removePanel(this);' style='float:right'>X</a></h4>\n"; 
        template += "<div class='AccordionPanel'><div class='row form-group'>\n"; 
        template += "<label for='ImageSelector' class='control-label col-md-2'>Project Image</label>\n"; 
        template += "<div class='col-md-10'>\n"; 
        template += "<input type='file' id='Image1Selector' /><br />\n"; 
        template += "<img id='Image"+vrImgeID+"' src='#' style='width: 100px; visibility: hidden;' />\n"; 
        template += "</div></div></div>\n"; 
    
        $("#PrimaryImageAccordion").append(template); 
        vrImgeID++; 
    
        $("#PrimaryImageAccordion").accordion("refresh"); 
    } 
    
    
    
    function ImageSelector_Change(input) { 
          if (input.files && input.files[0]) { 
           var reader = new FileReader(); 
    
           reader.onload = function (e) { 
            input.attr("src", e.target.result); 
            input.css("visibility", "visible"); 
           } 
    
          reader.readAsDataURL(input.files[0]); 
         } 
        } 
    
    +0

    残念ながら、作品のこの種は、imgタグ、更新OPを見つけなければなりませんでした。 –

    +0

    あなたが何をしようとしているのか正確にはわかりませんでした –

    +0

    マルチ画像アップローダを作成しようとすると、選択後に各画像をプレビューします。これは別の場所で使用されるので、各画像はアコーディオンを使用して分離する必要があります。 –

    0

    を有するものを何度もDOMの画像要素をボタンをクリックするので、ここに1つのグローバル変数の増分を取る undefined値を持つinputにアクセスしようとします私の完成コード:

    あなたが最初のオブジェクト(アコーディオンパネル)にコードを追加するときに、画像ローダ作業を行うために、テンプレートに同じコードを追加することが必要であること、ハードな方法を見つけた
    <!DOCTYPE html> 
    <html lang="en"> 
    <head> 
        <!-- css links --> 
        <link href="/Content/bootstrap-theme.css" rel="stylesheet" /> 
        <link href="/Content/bootstrap.css" rel="stylesheet" /> 
        <link href="/Scripts/jquery-ui-1.12.0/jquery-ui.css" rel="stylesheet" /> 
        <!-- /css links --> 
        <!-- js files --> 
        <script src="/Scripts/jquery-3.1.0.js"></script> 
        <script src="/Scripts/jquery-ui-1.12.0/jquery-ui.js"></script> 
        <!-- /js files --> 
    </head> 
    <body id="myPage" data-spy="scroll" data-target=".navbar" data-offset="60"> 
        <script lang="en" type="text/javascript"> 
         $(function() { 
          $("#PrimaryImageAccordion").accordion({ 
           collapsible: true 
          }); 
         }); 
        </script> 
        <br /><br /> 
        <button type='button' onclick='btnAddPrimaryImage_Click();' class='btn btn-default'> Add </button> 
        <div id="PrimaryImageAccordion"> 
         <h4 class="PrimaryImageTitle">Primary Image</h4> 
         <div> 
          <div class="row form-group"> 
           <label for="ImageSelector" class="control-label col-md-2">Project Image</label> 
           <div class="col-md-10"> 
            <input type="file" id="ImageSelector" onchange="ImageSelector_Change(this);" /><br /> 
            <img id="Image" src="#" style="width: 100px; visibility: hidden;" /> 
           </div> 
          </div> 
         </div> 
        </div> 
        <script lang="en" type="text/javascript"> 
         function btnAddPrimaryImage_Click() { 
          var template = "<h4 class='PrimaryImageTitle'>Primary Image<a onclick='removePanel(this);' style='float:right'>X</a></h4>\n"; 
          template += "<div class='AccordionPanel'><div class='row form-group'>\n"; 
          template += "<label for='ImageSelector' class='control-label col-md-2'>Project Image</label>\n"; 
          template += "<div class='col-md-10'>\n"; 
          template += "<input type='file' id='ImageSelector' onchange='ImageSelector_Change(this);' /><br />\n"; 
          template += "<img id='Image' src='#' style='width: 100px; visibility: hidden;' />\n"; 
          template += "</div></div></div>\n"; 
    
          $("#PrimaryImageAccordion").append(template); 
    
          $("#PrimaryImageAccordion").accordion("refresh"); 
         } 
    
         function removePanel(a) { 
          $(a).parent().next().remove(); 
          $(a).parent().remove(); 
          $("#PrimaryImageAccordion").accordion("refresh"); 
          return false; 
         } 
    
         function ImageSelector_Change(input) { 
          var object = $(input).parent().find('img#Image'); 
    
          if (input.files && input.files[0]) { 
           var reader = new FileReader(); 
    
           reader.onload = function (e) { 
            object.attr("src", e.target.result); 
            object.css("visibility", "visible"); 
           } 
    
           reader.readAsDataURL(input.files[0]); 
          } 
         } 
        </script> 
    </body> 
    
    </html> 
    

    : p。

    関連する問題