Javascript dojo函数在标记中不起作用
大家好,我正在学习基于dojo的node.js,当时我正在执行一个ajax创建的表到字符串 表中有一行插入了一个链接,以便调用函数 但是,当我点击一个链接时,这个功能就不起作用了 错误消息->未捕获引用错误:未定义func 请帮帮我 my board.htmlJavascript dojo函数在标记中不起作用,javascript,dojo,Javascript,Dojo,大家好,我正在学习基于dojo的node.js,当时我正在执行一个ajax创建的表到字符串 表中有一行插入了一个链接,以便调用函数 但是,当我点击一个链接时,这个功能就不起作用了 错误消息->未捕获引用错误:未定义func 请帮帮我 my board.html require([ "dojo/parser","dojo/dom", "dojo/on", "dojo/request", "dojo/json","dojo/_base/array" ,"dijit/Dial
require([ "dojo/parser","dojo/dom", "dojo/on", "dojo/request", "dojo/json","dojo/_base/array"
,"dijit/Dialog","dijit/form/Button","dijit/form/CheckBox","dijit/layout/BorderContainer",
"dijit/layout/TabContainer", "dijit/layout/ContentPane",
"dojo/domReady!" ], function(parser,dom,on,request,json,arrayUtil,Dialog,Button,CheckBox) {
parser.parse();
.....
function func(no){
alert('seq:'+no);
}
var xhrArgs = {
url: '/getData',
handleAs: "json",
load: function(data){
var output ='';
output+='<table class="output" cellspacing="0" cellpadding="0" border="1">';
output+='<thead>';
output+='<tr><th>NO</th><th>NAME</th><th>FORM</th><th>DESCRIPTION</th><th>WRITER</th>';
output+='</tr>';
output+='</thead>';
output+='<tbody>';
arrayUtil.forEach(data,function(item,i){
output+='<tr>';
output+='<td>'+item.seq+'</td>';
output+='<td>'+item.name+'</td>';
output+='<td><a href="#" onclick="func('+item.seq+');return false;">'+item.form+'</a></td>';
output+='<td>'+item.desc+'</td>';
output+='<td>'+item.writer+'</td>';
output+='</tr>';
});//end for
output+='</tbody>';
output+='</table>';
resultDiv.innerHTML = output;
},//end load
......
require([“dojo/parser”、“dojo/dom”、“dojo/on”、“dojo/request”、“dojo/json”、“dojo/_base/array”)
“dijit/Dialog”、“dijit/form/Button”、“dijit/form/CheckBox”、“dijit/layout/BorderContainer”,
“dijit/layout/TabContainer”、“dijit/layout/ContentPane”,
“dojo/domReady!”],函数(解析器、dom、on、请求、json、arrayUtil、对话框、按钮、复选框){
parser.parse();
.....
函数func(否){
警报(“序号:”+否);
}
变量xhrags={
url:“/getData”,
handleAs:“json”,
加载:函数(数据){
var输出=“”;
输出+='';
输出+='';
输出+='NONAMEFORMDESCRIPTIONWRITER';
输出+='';
输出+='';
输出+='';
arrayUtil.forEach(数据、功能(项目,i){
输出+='';
输出+=''+项。序号+'';
输出+=''+项。名称+'';
输出+='';
输出+=''+项描述+'';
输出+=''+项。编写器+'';
输出+='';
});//结束
输出+='';
输出+='';
resultDiv.innerHTML=输出;
},//端部载荷
......
这是因为func()
函数在require()
回调函数中是局部作用域。这意味着您无法看到它,除非您是从require()
回调函数内部调用该函数
但是,onclick属性只能访问全局范围,因此在您当前的情况下,它不能执行func()
,这就是为什么它会给出未定义的错误
要解决此问题,您可以做两件事:
func()
移动到全局范围require()
范围将
func()
移动到全局范围
要将函数移动到全局范围,应将函数重写为:
func = function(no){
alert('seq:'+no);
}
因为前面没有var
,所以它实际上应用于全局范围。您还可以编写以下内容:
window.func = function(no){
alert('seq:'+no);
}
这是最简单的解决方案,但也是最难看的解决方案。通常建议尽可能少地使用全局范围,在这种情况下,这并不是真正必要的
将事件处理移动到本地require()
范围
一个更好的解决方案(我认为)是将事件处理移动到与函数所在的相同的本地范围。但是,要做到这一点,您不能使用现在使用的相同策略。您必须使用dojo/DOM construct模块构造适当的DOM节点来替换output
DOM字符串
例如:
var table = domConstruct.create('table', {
class: "output",
cellspacing: 0,
cellpadding: 0,
border: 1
});
domConstruct.place('<thead>' +
'<tr><th>NO</th><th>NAME</th><th>FORM</th><th>DESCRIPTION</th><th>WRITER</th>' +
'</tr>' +
'</thead>', table);
var body = domConstruct.create("tbody");
arrayUtil.forEach(data, function(item,i){
var row = domConstruct.create("tr");
domConstruct.place('<td>'+item.seq+'</td>', row);
domConstruct.place('<td>'+item.name+'</td>', row);
var cell = domConstruct.create('td');
domConstruct.place(cell, row);
var link = domConstruct.create("a", {
href: "#",
innerHTML: item.form
});
on(link, "click", function() {
func(item.seq);
return false;
});
domConstruct.place(link, cell);
domConstruct.place('<td>'+item.desc+'</td>', row);
domConstruct.place('<td>'+item.writer+'</td>', row);
domConstruct.place(row, body);
});
domConstruct.place(body, table);
domConstruct.place(table, resultDiv);
var table=domConstruct.create('table'){
类:“输出”,
单元间距:0,
单元格填充:0,
边界:1
});
domConstruct.place(“”)+
“NONAMEFORMDESCRIPTIONWRITER”+
'' +
“(表1);
var body=domConstruct.create(“tbody”);
arrayUtil.forEach(数据、功能(项目,i){
var row=domConstruct.create(“tr”);
domConstruct.place(“”+项目序号+“”,第行);
domConstruct.place(“”+item.name+“”,行);
var cell=domConstruct.create('td');
domConstruct.place(单元格、行);
var link=domConstruct.create(“a”{
href:“#”,
innerHTML:item.form
});
打开(链接,“单击”,函数(){
func(项目序号);
返回false;
});
domConstruct.place(链接、单元);
domConstruct.place(“”+项目描述+“”,第行);
domConstruct.place(“”+item.writer+“”,第行);
位置(行、正文);
});
位置(身体、桌子);
domConstruct.place(表,resultDiv);
这段代码替换整个DOM构造。它创建DOM节点,并使用dojo/on模块添加func
函数作为onClick事件的事件处理程序
我还做了一个演示此解决方案的示例
这有几个好处:
- 您的
仅在必须可用时可用。没有人可以通过在全局范围中使用同名变量来重写它func()
- 您可以看到,我在JavaScript部分使用的HTML代码更少,在HTML部分使用的JavaScript函数也更少(不再需要
属性)。如果您进一步改进这一点,您可以将HTML代码和JavaScript代码解耦,从而改进应用程序的结构onclick