如何将 parameter/argument 传递给由调用 click 以编程方式触发的 onchange 侦听器
How can I pass a parameter/argument to the onchange listener that is programmatically triggered by a call to click
在我的一组重复行(动态创建)的表单中,每行都有一个按钮,允许用户上传一个文件,然后 linked/tied 到该行中的数据。
head head upload
---- ---- --------
x y <button>
a b <button>
m n <button>
单击这些按钮中的任何一个时,我显然可以轻松确定我所在的行。假设我在 id="row_2" 的行中。我在单击按钮调用的函数中有它。
现在我调用 $("#fileUploader").click()
以启动文件选择对话框。当用户选择一个文件并单击确定时,将自动调用 OnFileUploaderChange()
函数。在该函数中,我获得了文件,现在我需要知道初始按钮来自 row_2,因此我可以 link/associate 它具有正确的行。
总结:OnButtonClick()
触发OnFileUploaderClick()
导致OnFileUploaderChange()
自动触发。我在 OnButtonClick()
中有一个值,我需要在 OnFileUploaderChange()
.
中可用
我该怎么做?!如何在 OnButtonClick()
函数中获取我知道的值,并在调用 OnFileUploaderClick()
函数时使其在 OnFileUploaderChange()
函数中可用(传递给)。
我已经弄清楚如何通过将 $("#fileUploader").click()
更改为 $("#fileUploader").trigger('click', [ 2 ])
来将参数传递给 OnFileUploaderClick()
函数。但是该参数仅在 OnFileUploaderClick()
中可用,我在 OnFileUploaderChange()
.
中需要它
用户可能会开始上传一个大文件,并且(当该文件仍在上传时)会开始上传另一个较小的文件,以便多个线程同时上传。所以 以任何方式使用全局变量都行不通 - 它必须是 parameter/argument 以避免竞争条件和时间问题。
这里有一个fiddle来帮助解释:https://jsfiddle.net/ho819tu0/1/
用解决方案编辑:
根据@vincent-d 的评论和下面的回答(现在标记为正确)我已经修复了我的代码,这里是另一个 fiddle 展示它是如何工作的:https://jsfiddle.net/sm2L9kt8/
问题是在初始气泡之外创建的任何 dom 对象和事件都不会被调用,并且这些 events/functions
不会设置任何参数或全局变量
为了解决这个问题,jQuery 制作了一个非常好的函数,负责对这些实时创建的对象创建新的调用
左边的赋值必须是包含未来 "live created" 个对象的对象,右边是引用这些对象的选择器
var colors=['green','yellow','blue'];
$('.add').click(function(){
let num=Math.floor(Math.random() * 3);
var newHtml='<td>line 1 <button class="clicker">click to set to <span>'+colors[num]+'</span></button></td>'
$('table tr').append(newHtml);
});
// click on add, it will set a new button, click on that button it will pass to this function because of the live event call
function colo(colorvar){
$('td').css('color',colorvar);
}
//this is the call, notice the body as left-hand, and .clicker button as right-hand
$('body').on('click','.clicker',function(){
// this refer to the element in the right-hand that is clicked (it can be a child, check at event target for more infos
colo($('span',this).text());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='add'>ADD</button>
<table>
<tr>
<td>line 1 <button class='clicker'>click to set to <span>red</span></button></td>
</tr>
</table>
我认为没有办法将参数传递给文件上传更改事件的函数处理程序。正如我在评论中提到的,我认为另一种解决方案是对每一行使用唯一的 <input type="file">
,以便您的更改处理程序具有对 ID 的引用。您可以设置隐藏上传器的样式并使用标签来触发点击:
function OnFileUploaderChange(inputElem) {
output.textContent = inputElem.id;
}
input[type="file"] {
visibility: hidden;
width: 0;
}
label {
background: #fefefe;
border: 1px solid black;
padding: 0 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<tr>
<th>Head1</th>
<th>Head2</th>
<th>Upload</th>
</tr>
<tr class="row" id="row_1">
<th>Row_1</th>
<th>A</th>
<th>
<label for="file_row_1">U</label>
<input id="file_row_1" type="file" onchange="OnFileUploaderChange(this)">
</th>
</tr>
<tr class="row" id="row_2">
<th>Row_2</th>
<th>B</th>
<th>
<label for="file_row_2">U</label>
<input id="file_row_2" type="file" onchange="OnFileUploaderChange(this)">
</th>
</tr>
<tr class="row" id="row_3">
<th>Row_3</th>
<th>C</th>
<th>
<label for="file_row_3">U</label>
<input id="file_row_3" type="file" onchange="OnFileUploaderChange(this)">
</th>
</tr>
</table>
<div id="output"> </div>
在我的一组重复行(动态创建)的表单中,每行都有一个按钮,允许用户上传一个文件,然后 linked/tied 到该行中的数据。
head head upload
---- ---- --------
x y <button>
a b <button>
m n <button>
单击这些按钮中的任何一个时,我显然可以轻松确定我所在的行。假设我在 id="row_2" 的行中。我在单击按钮调用的函数中有它。
现在我调用 $("#fileUploader").click()
以启动文件选择对话框。当用户选择一个文件并单击确定时,将自动调用 OnFileUploaderChange()
函数。在该函数中,我获得了文件,现在我需要知道初始按钮来自 row_2,因此我可以 link/associate 它具有正确的行。
总结:OnButtonClick()
触发OnFileUploaderClick()
导致OnFileUploaderChange()
自动触发。我在 OnButtonClick()
中有一个值,我需要在 OnFileUploaderChange()
.
我该怎么做?!如何在 OnButtonClick()
函数中获取我知道的值,并在调用 OnFileUploaderClick()
函数时使其在 OnFileUploaderChange()
函数中可用(传递给)。
我已经弄清楚如何通过将 $("#fileUploader").click()
更改为 $("#fileUploader").trigger('click', [ 2 ])
来将参数传递给 OnFileUploaderClick()
函数。但是该参数仅在 OnFileUploaderClick()
中可用,我在 OnFileUploaderChange()
.
用户可能会开始上传一个大文件,并且(当该文件仍在上传时)会开始上传另一个较小的文件,以便多个线程同时上传。所以 以任何方式使用全局变量都行不通 - 它必须是 parameter/argument 以避免竞争条件和时间问题。
这里有一个fiddle来帮助解释:https://jsfiddle.net/ho819tu0/1/
用解决方案编辑:
根据@vincent-d 的评论和下面的回答(现在标记为正确)我已经修复了我的代码,这里是另一个 fiddle 展示它是如何工作的:https://jsfiddle.net/sm2L9kt8/
问题是在初始气泡之外创建的任何 dom 对象和事件都不会被调用,并且这些 events/functions
不会设置任何参数或全局变量为了解决这个问题,jQuery 制作了一个非常好的函数,负责对这些实时创建的对象创建新的调用
左边的赋值必须是包含未来 "live created" 个对象的对象,右边是引用这些对象的选择器
var colors=['green','yellow','blue'];
$('.add').click(function(){
let num=Math.floor(Math.random() * 3);
var newHtml='<td>line 1 <button class="clicker">click to set to <span>'+colors[num]+'</span></button></td>'
$('table tr').append(newHtml);
});
// click on add, it will set a new button, click on that button it will pass to this function because of the live event call
function colo(colorvar){
$('td').css('color',colorvar);
}
//this is the call, notice the body as left-hand, and .clicker button as right-hand
$('body').on('click','.clicker',function(){
// this refer to the element in the right-hand that is clicked (it can be a child, check at event target for more infos
colo($('span',this).text());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='add'>ADD</button>
<table>
<tr>
<td>line 1 <button class='clicker'>click to set to <span>red</span></button></td>
</tr>
</table>
我认为没有办法将参数传递给文件上传更改事件的函数处理程序。正如我在评论中提到的,我认为另一种解决方案是对每一行使用唯一的 <input type="file">
,以便您的更改处理程序具有对 ID 的引用。您可以设置隐藏上传器的样式并使用标签来触发点击:
function OnFileUploaderChange(inputElem) {
output.textContent = inputElem.id;
}
input[type="file"] {
visibility: hidden;
width: 0;
}
label {
background: #fefefe;
border: 1px solid black;
padding: 0 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<tr>
<th>Head1</th>
<th>Head2</th>
<th>Upload</th>
</tr>
<tr class="row" id="row_1">
<th>Row_1</th>
<th>A</th>
<th>
<label for="file_row_1">U</label>
<input id="file_row_1" type="file" onchange="OnFileUploaderChange(this)">
</th>
</tr>
<tr class="row" id="row_2">
<th>Row_2</th>
<th>B</th>
<th>
<label for="file_row_2">U</label>
<input id="file_row_2" type="file" onchange="OnFileUploaderChange(this)">
</th>
</tr>
<tr class="row" id="row_3">
<th>Row_3</th>
<th>C</th>
<th>
<label for="file_row_3">U</label>
<input id="file_row_3" type="file" onchange="OnFileUploaderChange(this)">
</th>
</tr>
</table>
<div id="output"> </div>