如何将局部参数传递给函数外的事件处理程序?
How to pass local parameters into event handler outside of function?
很抱歉问了一个简单的问题,但我还没有找到对我有帮助的答案。
如果事件处理程序在事件发生的 function/scope 之外,那么正确的编写方法是什么?我现在的方式似乎忽略了 "inner" 事件并在调用 "outer" 事件时调用处理程序。
不是每次单击 "Download" 时都附加文本,而是仅在单击 "Generate Report" 时才添加文本。就好像完全忽略了 $("#download").on('click')
部分。
$('#gen-report').on('click', function() {
$('div').fadeIn();
var example = "var from inside gen-report function"
$('#divbutton').on('click', handler(example));
});
function handler(e) {
$('div').append('<br>report downloaded with ');
$('div').append(e);
}
$('#close').on('click', function() {
$('div').hide();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
[set options for report]
<button id="gen-report">
Generate Report
</button>
<div style="display:none; background:pink;">
~generated report~
<button id="divbutton">
Download
</button>
</div>
是否有better/more简化的方式来编写此类事件处理?
您不应在另一个事件处理程序中添加一个事件处理程序,除非您先删除旧的处理程序。每次单击 Generate Report
时,它都会向 Download
添加另一个处理程序,然后当您单击 Download
时,它会多次 运行。
您应该使 example
成为全局变量,并将 Download
单击处理程序移到外面。然后你只需要修复它以在你点击时调用 handler()
函数,而不是立即调用。
var example;
$('#gen-report').on('click', function() {
$('div').fadeIn();
example = "var from inside gen-report function"
});
$('#divbutton').on('click', function() {
if (example) {
handler(example);
} else {
alert("Click on Generate Report first");
}
});
function handler(e) {
$('div').append('<br>report downloaded with ');
$('div').append(e);
}
$('#close').on('click', function() {
$('div').hide();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
[set options for report]
<button id="gen-report">
Generate Report
</button>
<div style="display:none; background:pink;">
~generated report~
<button id="divbutton">
Download
</button>
</div>
您在单击 gen-report
时执行 handler(example)
,而不是挂接事件。
你可以做一件事,而不是使用 example
变量,将内容附加到内部按钮的数据,或者附加到全局变量或隐藏的 DOM 元素中。例如:
$('#gen-report').on('click', function() {
$('div').fadeIn();
var example = "var from inside gen-report function";
$("#divbutton").data("example", example);
});
$('#divbutton').on('click', function() {
var example = jQuery(this).data("example");
// Go
});
如果您在 gen-report
的点击处理程序中连接 divbutton
的事件,您将附加到它的点击处理程序 - 所以如果您点击 gen-report
两次,您最终会得到 divbutton
的重复处理程序,并且它们都会 运行。这就是我将其处理程序移到外面的原因。
编辑
如果您改用全局变量:当我说 "global" 变量时,我实际上并不是指完全全局的,只是在整个交易的范围内 - 尽可能避免使用真正的全局变量:
// Don't do:
var example;
$('#gen-report').on('click', function() {/**/});
$('#divbutton').on('click', function() {/**/});
// Do:
(function() {
var example;
$('#gen-report').on('click', function() {/**/});
$('#divbutton').on('click', function() {/**/});
})();
很抱歉问了一个简单的问题,但我还没有找到对我有帮助的答案。
如果事件处理程序在事件发生的 function/scope 之外,那么正确的编写方法是什么?我现在的方式似乎忽略了 "inner" 事件并在调用 "outer" 事件时调用处理程序。
不是每次单击 "Download" 时都附加文本,而是仅在单击 "Generate Report" 时才添加文本。就好像完全忽略了 $("#download").on('click')
部分。
$('#gen-report').on('click', function() {
$('div').fadeIn();
var example = "var from inside gen-report function"
$('#divbutton').on('click', handler(example));
});
function handler(e) {
$('div').append('<br>report downloaded with ');
$('div').append(e);
}
$('#close').on('click', function() {
$('div').hide();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
[set options for report]
<button id="gen-report">
Generate Report
</button>
<div style="display:none; background:pink;">
~generated report~
<button id="divbutton">
Download
</button>
</div>
是否有better/more简化的方式来编写此类事件处理?
您不应在另一个事件处理程序中添加一个事件处理程序,除非您先删除旧的处理程序。每次单击 Generate Report
时,它都会向 Download
添加另一个处理程序,然后当您单击 Download
时,它会多次 运行。
您应该使 example
成为全局变量,并将 Download
单击处理程序移到外面。然后你只需要修复它以在你点击时调用 handler()
函数,而不是立即调用。
var example;
$('#gen-report').on('click', function() {
$('div').fadeIn();
example = "var from inside gen-report function"
});
$('#divbutton').on('click', function() {
if (example) {
handler(example);
} else {
alert("Click on Generate Report first");
}
});
function handler(e) {
$('div').append('<br>report downloaded with ');
$('div').append(e);
}
$('#close').on('click', function() {
$('div').hide();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
[set options for report]
<button id="gen-report">
Generate Report
</button>
<div style="display:none; background:pink;">
~generated report~
<button id="divbutton">
Download
</button>
</div>
您在单击 gen-report
时执行 handler(example)
,而不是挂接事件。
你可以做一件事,而不是使用 example
变量,将内容附加到内部按钮的数据,或者附加到全局变量或隐藏的 DOM 元素中。例如:
$('#gen-report').on('click', function() {
$('div').fadeIn();
var example = "var from inside gen-report function";
$("#divbutton").data("example", example);
});
$('#divbutton').on('click', function() {
var example = jQuery(this).data("example");
// Go
});
如果您在 gen-report
的点击处理程序中连接 divbutton
的事件,您将附加到它的点击处理程序 - 所以如果您点击 gen-report
两次,您最终会得到 divbutton
的重复处理程序,并且它们都会 运行。这就是我将其处理程序移到外面的原因。
编辑
如果您改用全局变量:当我说 "global" 变量时,我实际上并不是指完全全局的,只是在整个交易的范围内 - 尽可能避免使用真正的全局变量:
// Don't do:
var example;
$('#gen-report').on('click', function() {/**/});
$('#divbutton').on('click', function() {/**/});
// Do:
(function() {
var example;
$('#gen-report').on('click', function() {/**/});
$('#divbutton').on('click', function() {/**/});
})();