无法从提示中获取变量作为回调函数
cannot get a variable from a prompt as a callback function
在button
右击我需要:
- 隐藏按钮
- 然后 显示提示
- 写入提示值
- 在控制台中获取值
function a_ren(){
var a = 'lorem';
$('.cmenu').hide(function(){var res = prompt('RENAME', a);});
console.log(res);
}
$(document).on('contextmenu', 'button', function(e){
e.preventDefault();
a_ren();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='cmenu'>CLICK</button>
两个问题:
- 控制台错误 - res
未定义
- 在 SO
上出现提示 window,但在我的页面上(chrome
、localhost
)提示 window 根本没有出现。
有什么帮助吗?
未定义res
的原因是因为传递给hide()
的函数直到隐藏动画完成后才运行但不等待就调用console.log(res);
.此外,正如 Ram Segev 指出的那样,res
是在 hide
回调函数中定义的,因此这是它在范围内(可访问)的唯一位置。
至于没有出现提示,换个试试
$(document).on('contextmenu', 'button', function(e){
至
document.querySelector('button').addEventListener('contextmenu', (e) => {
res
未定义,因为您在 hide
函数内声明它并尝试在它之外(不在范围内)打印它。把console log放到函数里面应该可以解决
function a_ren(){
var a = 'lorem';
$('.cmenu').hide(function(){
var res = prompt('RENAME', a);
console.log(res);
});
}
$(document).on('contextmenu', 'button', function(e){
e.preventDefault();
a_ren();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='cmenu'>CLICK</button>
问题是 var res
的范围在 hide complete 回调内部,即使你在函数外声明 res 你也不会从提示中获取值,因为 hide complete 回调是异步的,所以你必须在回调本身处理提示结果,参考下面的代码
function a_ren() {
var a = 'lorem';
$('.cmenu').hide(function () {
var res = prompt('RENAME', a);
process_prompt_result(res);
// scope of res ends here, its undefined outside this function
});
}
$(document).on('contextmenu', 'button', function (e) {
e.preventDefault();
a_ren();
});
function process_prompt_result(result) {
// do something thing with result value from prompt
console.log(result);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='cmenu'>CLICK</button>
在button
右击我需要:
- 隐藏按钮
- 然后 显示提示
- 写入提示值
- 在控制台中获取值
function a_ren(){
var a = 'lorem';
$('.cmenu').hide(function(){var res = prompt('RENAME', a);});
console.log(res);
}
$(document).on('contextmenu', 'button', function(e){
e.preventDefault();
a_ren();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='cmenu'>CLICK</button>
两个问题:
- 控制台错误 - res
未定义
- 在 SO
上出现提示 window,但在我的页面上(chrome
、localhost
)提示 window 根本没有出现。
有什么帮助吗?
未定义res
的原因是因为传递给hide()
的函数直到隐藏动画完成后才运行但不等待就调用console.log(res);
.此外,正如 Ram Segev 指出的那样,res
是在 hide
回调函数中定义的,因此这是它在范围内(可访问)的唯一位置。
至于没有出现提示,换个试试
$(document).on('contextmenu', 'button', function(e){
至
document.querySelector('button').addEventListener('contextmenu', (e) => {
res
未定义,因为您在 hide
函数内声明它并尝试在它之外(不在范围内)打印它。把console log放到函数里面应该可以解决
function a_ren(){
var a = 'lorem';
$('.cmenu').hide(function(){
var res = prompt('RENAME', a);
console.log(res);
});
}
$(document).on('contextmenu', 'button', function(e){
e.preventDefault();
a_ren();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='cmenu'>CLICK</button>
问题是 var res
的范围在 hide complete 回调内部,即使你在函数外声明 res 你也不会从提示中获取值,因为 hide complete 回调是异步的,所以你必须在回调本身处理提示结果,参考下面的代码
function a_ren() {
var a = 'lorem';
$('.cmenu').hide(function () {
var res = prompt('RENAME', a);
process_prompt_result(res);
// scope of res ends here, its undefined outside this function
});
}
$(document).on('contextmenu', 'button', function (e) {
e.preventDefault();
a_ren();
});
function process_prompt_result(result) {
// do something thing with result value from prompt
console.log(result);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class='cmenu'>CLICK</button>