パネルを動的に追加または削除する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]);
}
}
を唯一の問題は、それがロードされていることです追加イメージではなく最初のイメージのみ
'65行目で' 'null 'のプロパティ' src 'を設定できません。特に' document.getElementById(input).src = e.target.result; '。私はそれを私の答え、2つの答えを一緒に働くことにチャンスを働くことを得ることができましたか? –
@JohnSchultz私はインラインイベントを変更しました:onchange = "ImageSelector_Change(this、 'Image');"ここではこれは入力タイプのファイルで、2番目のパラメータは対応するimgタグのIDです。それは私のスニペットで機能しますか? – gaetanoM
はい、うまくいきました。ありがとうございました。 –