在下面这段js代码中,为什么这里不把btn声明为window.btn,onclick 点击事件就不能奏效呢?
如代码所示,button按钮是js动态生成的,btn(i)是onclick事件执行的函数。实际过程中我只有加了window.btn=btn;按钮点击事件才有效果,请问这是...
如代码所示,button按钮是js动态生成的,btn(i)是onclick事件执行的函数。实际过程中我只有加了 window.btn =btn; 按钮点击事件才有效果,请问这是为什么?
(function($, $w){
"use strict";
$(document).ready(function(){
requestExcel();
});
function requestExcel(){
var BASE_URI = '/mydemo/data/excel',
$.ajax({
type:"post",
url:URI_GROUP,
data:{},
success:function(resp){
add(resp.excelContent,resp.sheetNum,resp.sheetName);
btn(0);
}
});
}
//添加Excel内容及按钮
function add(excelContent,sheetNumber,sheetNameStr){
var addHtml= excelContent;
$(document.body).append(addHtml);
var sheetNum = sheetNumber;
var sheetNames = new Array();
sheetNames = sheetNameStr.split("||");
var sheetName;
for(var i = 0;i < sheetNum;i++){
sheetName = sheetNames[i];
var addbtn = '<input type="button" id="button'+i+'"'+' onclick="btn('+i+')"' +'value="'+sheetName+'"'+' style="cursor: pointer; />';
$("#btnSel").append(addbtn);
}
}
//按钮控制
function btn(i) {
$('body #div' + i).css('display', 'block');
$("div:not('#div" + i + "')").css('display', 'none');
}
window.btn =btn;
})(jQuery, window); 展开
(function($, $w){
"use strict";
$(document).ready(function(){
requestExcel();
});
function requestExcel(){
var BASE_URI = '/mydemo/data/excel',
$.ajax({
type:"post",
url:URI_GROUP,
data:{},
success:function(resp){
add(resp.excelContent,resp.sheetNum,resp.sheetName);
btn(0);
}
});
}
//添加Excel内容及按钮
function add(excelContent,sheetNumber,sheetNameStr){
var addHtml= excelContent;
$(document.body).append(addHtml);
var sheetNum = sheetNumber;
var sheetNames = new Array();
sheetNames = sheetNameStr.split("||");
var sheetName;
for(var i = 0;i < sheetNum;i++){
sheetName = sheetNames[i];
var addbtn = '<input type="button" id="button'+i+'"'+' onclick="btn('+i+')"' +'value="'+sheetName+'"'+' style="cursor: pointer; />';
$("#btnSel").append(addbtn);
}
}
//按钮控制
function btn(i) {
$('body #div' + i).css('display', 'block');
$("div:not('#div" + i + "')").css('display', 'none');
}
window.btn =btn;
})(jQuery, window); 展开
1个回答
展开全部
注意到这里有一个匿名函数,这里是模仿块级作用域的写法。
在这个区域内声明的方法是属于该区域而不属于window的。
而节点的onclick事件的作用域是在window,也就是说会如果要访问btn函数,就会去window对象里面找。如果你不设置window.btn =btn;那自然就找不到这个函数了。
其实你也可以写成$w.btn = btn;
你可以试试下面的代码:
(function () {
function hello() {
alert("hello");
}
})();
hello();//无效 hello is not defined
追问
谢谢,但是仍然有两个疑问。
您所说的“模仿块级作用域的写法”是不是说作用域是 (function($,$w){})(jQuery, window); 这个作用域不在window对象下?
onclick事件的默认作用域是在window对象下吗?
谢谢!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询