我有一个用于上传文件的模态窗口,它在这段代码中使用
<div class="field">
<label>Photos</label>
<div class="field_info" data-field_photo_id="5">
<div class="value" data-item_id=""></div>
</div>
<div class="field_form">
<a class="btn btn-dark btn-md btnUpload" data-toggle="modal" href="#" data-target="#modal-upload">
<i class="fa fa-cloud-upload"></i> Upload
</a>
<div class="dz_params_item"
data-entity_id="<?=$item->request_id?>"
data-action_url="/files/upload/<?=$item->request_id?>"
></div>
</div>
</div>
窗口本身在页面上的位置稍低一些
<div class="modal fade" id="modal-upload" tabindex="-1" role="dialog" aria-hidden="true">
....
</div>
要打开它并上传文件,我使用JavaScript
我已经缩短了代码一点无处不在,使没有混乱,但如果有什么是失踪,那么我将补充
(function( $ ){
$.dispatcherFiles = {
$filesDropzone: null,
$parallelUploads: 100,
$maxFiles: 10,
$modalId: '#modal-upload',
$files: [],
cacheDom: function(){
this.$body = $('body');
},
functions: {
openUploadFilesModal: function (e) {
let that = this;
let dropzoneParamEl = $(e.currentTarget).closest('.field_form').find('.dz_params_item');
let action_url = $(dropzoneParamEl).attr('data-action_url');
$(this.$modalId + ' #filesDropzone').addClass('dropzone');
this.$filesDropzone = new Dropzone(that.$modalId + ' .dropzone', {
url: action_url,
uploadMultiple: true,
parallelUploads: that.$parallelUploads,
maxFiles: that.$maxFiles,
});
},
hideUploadFilesModal: function (e) {
this.$filesDropzone.destroy();
},
},
events: function(){
this.$body.on('shown.bs.modal', this.$modalId, this.functions.openUploadFilesModal.bind(this));
this.$body.on('hidden.bs.modal', this.$modalId, this.functions.hideUploadFilesModal.bind(this));
},
init: function () {
this.cacheDom();
this.events();
}
};
$.dispatcherFiles.init();
})(jQuery);
因此,在本例中,我遇到的主要问题是从html页面获取data-action_url
我正在用这些线条来做
let dropzoneParamEl = $(e.currentTarget).closest('.field_form').find('.dz_params_item');
let action_url = $(dropzoneParamEl).attr('data-action_url');
但是最后我的变量是undefined
,尽管前面的变量dropzoneParamEl
已经定义,并且我得到了该元素的DOM
而这一切都只是因为我的函数是在窗口打开时触发的shown.bs.modal
如果我通过click
接收数据,那么我可以获得所需的属性
但据我所知,我不能使用click
模式来打开,因为那样的话什么都不起作用
在这种情况下,如何在打开模态时获得data-action_url
的值?我马上澄清,我可以有几个这样的上传按钮,我需要的值正是被点击的元素
更新
也就是说,我可以简单地用这个函数替换事件中的两个函数
events: function(){
this.$body.on('click', '#foo', this.functions.uploadFilesModal.bind(this));
},
在那里做我该做的事?
functions: {
uploadFilesModal: function (e) {
$($modalId).modal('toggle');
let that = this;
let dropzoneParamEl = $(e.currentTarget).closest('.field_form').find('.dz_params_item');
let action_url = $(dropzoneParamEl).attr('data-action_url');
console.log(dropzoneParamEl);
console.log(action_url);
...
},
},
=====================================
我试图做一个近似的片段,但不幸的是什么都没有打开。
(function($){
let $modalId = '#modal-upload';
let $filesDropzone = null;
let $parallelUploads = 100;
let $maxFiles = 10;
let $files = [];
$.dispatcherFiles = {
cacheDom: function(){
this.$body = $('body');
},
functions: {
uploadFilesModal: function (e) {
$($modalId).modal('toggle');
let that = this;
let dropzoneParamEl = $(e.currentTarget).closest('.field_form').find('.dz_params_item');
let action_url = $(dropzoneParamEl).attr('data-action_url');
console.log(dropzoneParamEl);
console.log(action_url);
$($modalId + ' #filesDropzone').addClass('dropzone');
$filesDropzone = new Dropzone($modalId + ' .dropzone', {
url: action_url,
uploadMultiple: true,
parallelUploads: $parallelUploads,
maxFiles: $maxFiles,
});
$filesDropzone.on('error', function() {
$(that.$modalId).modal('hide');
alert('error');
});
$filesDropzone.on('success', function(file, response) {
$($modalId).modal('hide');
});
},
},
events: function(){
this.$body.on('click', '.btnUpload', this.functions.uploadFilesModal.bind(this));
},
init: function () {
this.cacheDom();
this.events();
}
};
$.dispatcherFiles.init();
})(jQuery);
.field {
margin: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" integrity="sha512-t4GWSVZO1eC8BM339Xd7Uphw5s17a86tIZIj8qRxhnKub6WoyhnrxeCIMeAqBPgdZGlCcG2PrZjMc+Wr78+5Xg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.css"
rel="stylesheet" type='text/css'>
<div class="form-group">
<div class="field">
<label>Photos</label>
<div class="field_info" data-field_photo_id="5">
<div class="value" data-item_id=""></div>
</div>
<div class="field_form">
<a class="btn btn-dark btn-md btnUpload" data-toggle="modal" href="#" data-target="#modal-upload">
<i class="fa fa-cloud-upload"></i> Upload
</a>
<div class="dz_params_item"
data-entity_id="<?=$item->request_id?>"
data-action_url="/files/upload/<?=$item->request_id?>"
></div>
</div>
</div>
</div>
<div class="form-group">
<div class="field">
<label>Photos</label>
<div class="field_info" data-field_photo_id="6">
<div class="value" data-item_id=""></div>
</div>
<div class="field_form">
<a class="btn btn-dark btn-md btnUpload" data-toggle="modal" href="#" data-target="#modal-upload">
<i class="fa fa-cloud-upload"></i> Upload
</a>
<div class="dz_params_item"
data-entity_id="<?=$item->request_id?>"
data-action_url="/files/upload/<?=$item->request_id?>"
></div>
</div>
</div>
</div>
<div class="form-group">
<div class="field">
<label>Photos</label>
<div class="field_info" data-field_photo_id="7">
<div class="value" data-item_id=""></div>
</div>
<div class="field_form">
<a class="btn btn-dark btn-md btnUpload" data-toggle="modal" href="#" data-target="#modal-upload">
<i class="fa fa-cloud-upload"></i> Upload
</a>
<div class="dz_params_item"
data-entity_id="<?=$item->request_id?>"
data-action_url="/files/upload/<?=$item->request_id?>"
></div>
</div>
</div>
</div>
<div class="modal fade" id="modal-upload" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
Upload files
</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="fal fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<div id="filesDropzone"></div>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.min.js" integrity="sha512-3dZ9wIrMMij8rOH7X3kLfXAzwtcHpuYpEgQg1OA4QAob1e81H8ntUQmQm3pBudqIoySO5j0tHN4ENzA6+n2r4w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/dropzone.min.js" integrity="sha512-U2WE1ktpMTuRBPoCFDzomoIorbOyUv0sP8B+INA3EzNAhehbzED1rOJg6bCqPf/Tuposxb5ja/MAUnC8THSbLQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
3条答案
按热度按时间bbmckpt71#
你可以调用
$($modalId).modal('toggle');
,见下面的代码片段:bpzcxfmw2#
我认为你可以将
on("click")
和内置的HTML标签dialog
一起使用。考虑它的docs。下面是一个没有任何样式的简短示例。希望能成功。如果用户取消“选择文件”对话框窗口,HTML对话框也会自动关闭。
nr9pn0ug3#
如果您正在获取DOM对象或jQuery对象的示例,则执行此操作
我的意思是,dropzoneParamEl有你需要的DOM,然后使用以下代码:
我已经在jQuery中使用这个函数很长时间了。
也可以使用vanilla JavaScript查看'data'属性,使用:
您必须更改代码以满足您的需要,但基本上您可以使用这两个选项获取数据