- 浏览: 1067147 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
Dojo widget就像是jsp中的自定义标签,通过学习开发widget标签来对其使用及其设计原理有更好的了解。本文主要是对Develop HTML widgets with Dojo一文的学习和翻译。
1. Dojo widget的概念
正如上所述,dojo widget就像是jsp中自定义标签,只是dojo widget是在客户端使用的(本文中统一简称dojo widget为widget标签)。Widget标签已经脱离了传统的DOM模型结构,每个Widget标签都有唯一的widgetID,并且可以包含多个属性,而且可以包含子Widget标签。Widget共包含三个部分:
l 一个包含Widget标签逻辑的js文件,通过JavaScript DOM模型来处理可见的元素。
l HTML模板文件,它提供基本的Widget HTML视图。当然如果模板很简单,完全可以在js文件中用字符类型替代。
l Css样式文件,定义标签的样式,在js代码或者HTML模板文件中使用。
l 图片文件。
目录结构如下:
dojo/src/widget ------------------------------------ js代码文件
dojo/src/widget/templates ------------------------ HTML模板,Css样式文件
dojo/src/widget/templates/images --------------- 图片文件
2. Widget标签的使用
使用标准的Dojo Widget标签创建Button按钮,代码如下:
3. 自定义Widget标签-HelloWorld
首先创建js/dojo/src/Widget/templates/HelloWorldTemplate.html,代码如下:
创建js/dojo/src/Widget/HelloWorl.js,代码如下:
注:所有用户自定义Widget标签都必须继承HtmlWidget。
创建测试文件HelloWorld.html,代码如下:
如果HelloWorldTemplate模板足够简单,可以使用templateString替换templatePath,修改后HelloWorld.js代码如下:
4. 自定义Widget标签属性
以上部分讨论了如何创建简单的自定义标签,下面需要给HelloWorld添加属性以及自样式,让其更像一个标准的Html标签。让HelloWorld标签的显示内容可以有用户定义,添加text属性就可以办到。修改后的代码如下:
HelloWorld.js
注:自定义属性必须要设置默认值,否则会被Dojo忽略。而且Dojo会忽略DOM模型下的所有属性。
HelloWorld.html
属性的处理
处理属性的典型方法是postCreate()方法(稍候讨论),另一个方法是fillInTemplate()。许多Widget标签都是通过postCreate()方法来处理属性的,也有通过set方法。不同的是postCreate()方法是在标签创建时处理属性,而set方法是在运行时动态设置属性。
脚本片断
在HEML模板文件中加入js代码并不是一个好的方法,但有时候却必不可少。在Dojo中可以使用${…}代码片断来获取属性值,正如上例中的${this.text}。
添加样式
为了使Widget达到真正的功用,Dojo提供了定制css样式的功能,通过引用不同的自定义样式,可以方便的为应用改变显示效果。为HelloWorld标签添加样式,创建一个简单样式文件js/dojo/src/widget/templates/HtmlHelloWorld.css,代码如下:
注:css类名必须是唯一的
修改HeolloWorld.js,代码如下:
5. 在js中使用Widget标签
本部分将说明如何用Dojo在js代码中使用HelloWorld标签,而传统的js方式已经不再适用。
传统方式操作Widget标签
如果想在程序中动态改变text “Hello World”,你会试着用传统的js方式来实现,但是这样做是徒劳的。传统方式的代码如下:
这样的代码是没有任何效果的。下面就分析一下这段为何不会有作用。
A. Body中的onload属性失效
Body中的onload属性与Dojo是不兼容的,Dojo已经在事件方法中包括了onload的事件。Onload事件在Dojo下使用,代码如下:
B. Dojo Widget标签与DOM element的区别
Dojo Widget标签已经不再是一个DOM element。Dojo创建Widget标签时,已经去掉所有DOM模式下的所有属性,除了Dojo认识的属性。例如,id已经演化成了widgetId。如果需要用传统的方式操作属性,必须通过修改模板文件来实现。如果需要获取ID,修改模板文件代码如下:
<div id="${this.widgetId}">Hello World</div>
Dojo方式操作Widget标签
如果要用Dojo方式操作Widget标签,必须还要修改一些代码。修改后的HelloWorld.js代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"domNode\" >${this.text}</div>",
text: "",//default value
// dynamic setters
setHtml: function(htmlString) {
this.domNode.innerHTML = htmlString;
}
}
);
注:Dojo Widget标签使用attachment points来处理DOM element。在Dojo方式下,不需要id=”${this.widgetId}”,因为不会使用id来获取对象,而是使用attachment point。实际上attachment point是默认使用的。”domNode”是attachment points根元素
通过获取Widget标签对象实例,代码如下:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript"> dojo.require("dojo.widget.HelloWorld");
dojo.addOnLoad(function(){
dojo.widget.byId("someID").setHtml("New text");
});
</script>
</head>
<body>
<div id="someID" dojoType="HelloWorld"></div>
</body>
</html>
通过使用dojo.widget.createWidget()方法动态创建HelloWorld实例,代码如下:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.HelloWorld");
dojo.addOnLoad(
function(){
var newWidget = dojo.widget.createWidget(
"HelloWorld", // widgetType
{}, // widget attributes, for example {title: "Some Title"}
dojo.byId("widgetPlaceholder") // reference to a DOM node that
// will be REPLACED by new widget
);
}
);
</script>
</head>
<body>
<div id="widgetPlaceholder"></div>
</body>
</html>
6. Widget标签嵌套HTML
本部分讨论如何实现Widget标签的嵌套
A. 嵌套静态HTML
正如前面提到的Dojo创建Widget标签时移除所有的DOM element。所以在Dojo移除之前,必须改变所要的DOM element。通过Dojo提供fillInTemplate()方法实现。此方法可以操作HTML DOM element和已经生成的Widget标签。实现改变静态HTML的HelloWorld.js代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"domNode\">${this.text}</div>",
text: "",//default value
// dynamic setters
setHtml: function(htmlString) {
this.domNode.innerHTML = htmlString;
},
fillInTemplate: function(args, frag) {
// Getting original HTML element
var source = this.getFragNodeRef(frag);
// Moving all children of original element to
// the desired node of the new component
while(source.hasChildNodes()) {
var node = dojo.dom.removeNode(source.firstChild);
this.domNode.appendChild(node);
}
// Invoking original dojo fillInTemplate() method
dojo.widget.HelloWorld.superclass.fillInTemplate.call(this, args, frag);
}
}
);
以上代码将HTML DOM节点转移到需要的地方,另一种实现方法是设置Widet属性isContainter为true。
动态添加嵌套HTML
如何动态添加嵌套HTML实现方法要根据动态HTML的形式来决定:
l 嵌套HTML作为string提供,通过设置innerHtml属性实现。
l 嵌套HTML作为DOM节点提供,可以使用appendChild方法实现。
以上方式的实现代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div>${this.text}</div>",
text: "",//default value
setHtml: function(html) {
if (dojo.lang.isString(html)) {
this.domNode.innerHTML = html;
} else if (dojo.dom.isNode(html)) {
// Cleaning whatever was there before
dojo.dom.removeChildren(this.domNode);
// Adding new element
this.domNode.appendChild(html);
} else {
dojo.lang.assert(false, "setHtml called with incorrect type: " + (typeof html));
}
}
}
);
7. Widget标签嵌套Widget标签
嵌套静态Widget标签
有些情况下我们需要实现Widget标签的相互嵌套,例如Dojo TabContainer和Tree标签。要实现这样的Widget标签,你需要设置isContainer为true,而且要在模板中设置attachment point为”containerNode”,代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"containerNode\">${this.text}</div>",
text: "",//default value
isContainer: true
}
);
这种实现是依赖Dojo的,如果需要实现更加复杂的,必须要操作postCreate方法中的Children数组,数组中存了所有嵌套的静态Widget标签。
测试代码:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.HelloWorld");
</script>
</head>
<title>Hello World Widget test</title>
<body>
<div dojoType="HelloWorld" text=" ad you can set the text attribute">
<div dojoType="Button">Submit</div>
</div>
<!--<dojo:HelloWorld text="you can set the text attribute"></dojo:button>-->
</body>
</html>
复杂应用请参考Dojo TabContainer和Tree标签。
动态添加Widget标签嵌套
动态添加Widget标签嵌套,需要在HelloWorld.js中实现addChild()方法,重写addChild()方法中还要调用父类的addChild()方法。实现动静态添加Widget标签嵌套的代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"titleNode\">${this.text}" +
"<br/><div dojoAttachPoint=\"containerNode\">"
+ "</div></div>",
text: "",//default value
isContainer: true,
postCreate: function() {
// adding statically
for(var i in this.children) {
this._addRow(this.children[i]);
}
},
addChild: function(child, overrideContainerNode,
pos, ref, insertIndex) {
this._addRow(child);
dojo.widget.HelloWorld.superclass.addChild.call(
this, child, overrideContainerNode);
},
_addRow: function(component) {
this.titleNode.appendChild(
document.createTextNode(component.widgetType));
this.titleNode.appendChild(
document.createElement("br"));
}
}
);
注:经测试发现,即使不实现addChild方法,同样可以动态添加Widget标签嵌套,但是在HtmlWidget类中也没有找到addChild方法的实现,这里有待进一步研究。
测试代码:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Checkbox");
dojo.require("dojo.widget.HelloWorld");
dojo.addOnLoad(function(){
var button = dojo.widget.createWidget("Button",
{caption: "Submit"});
dojo.widget.byId('someID').addChild(button);
var checkbox = dojo.widget.createWidget("Checkbox");
dojo.widget.byId('someID').addChild(checkbox);
});
</script>
</head>
<title>Hello World Widget test</title>
<body>
<div dojoType="HelloWorld" id="someID"></div>
<!--<dojo:HelloWorld text="you can set the text attribute"></dojo:button>-->
</body>
</html>
8. Dojo事件处理
本部分主要介绍使用Dojo的方式处理事件,在阅读本部分之前,最好先了解Dojo事件系统。首先需要在模板中定义dojoAttachEvent=”eventName: eventHandlerMethod;”属性。eventName是标准的DOM事件名称(例如:onClick),eventHandlerMethod则为事件调用函数。修改后的代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: '<div dojoAttachPoint="domNode" dojoAttachEvent="onClick:onClickHandler;">Click here</div>',
onClickHandler: function(e) {
alert("clicked in onClickHandler");
this.onClick(e);
},
onClick:function (e) { //for dojo.event.connect
}
}
);
注:可以在标签中预定义某一事件的函数,如上例中的onClickHandler,同时也可以预留接口让用户绑定自定义函数。
测试代码:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.HelloWorld");
function HelloWorld_onClick() {
alert("Node clicked in HelloWorld_onClick");
}
dojo.addOnLoad(function(){
var hello = dojo.widget.byId("someID");
dojo.event.connect(hello, 'onClick', 'HelloWorld_onClick')
});
</script>
</head>
<title>Hello World Widget test</title>
<body>
<div dojoType="HelloWorld" id="someID"></div>
</body>
</html>
总结:
通过对本文的学习,初步了解了Dojo的Widget标签的简单使用和如何实现自定义Widget标签。
【转载地址】http://27091497.blog.163.com/blog/static/11806250200772210458268/
1. Dojo widget的概念
正如上所述,dojo widget就像是jsp中自定义标签,只是dojo widget是在客户端使用的(本文中统一简称dojo widget为widget标签)。Widget标签已经脱离了传统的DOM模型结构,每个Widget标签都有唯一的widgetID,并且可以包含多个属性,而且可以包含子Widget标签。Widget共包含三个部分:
l 一个包含Widget标签逻辑的js文件,通过JavaScript DOM模型来处理可见的元素。
l HTML模板文件,它提供基本的Widget HTML视图。当然如果模板很简单,完全可以在js文件中用字符类型替代。
l Css样式文件,定义标签的样式,在js代码或者HTML模板文件中使用。
l 图片文件。
目录结构如下:
dojo/src/widget ------------------------------------ js代码文件
dojo/src/widget/templates ------------------------ HTML模板,Css样式文件
dojo/src/widget/templates/images --------------- 图片文件
2. Widget标签的使用
使用标准的Dojo Widget标签创建Button按钮,代码如下:
<html> <head> <script type="text/javascript" src="js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.Button"); </script> </head> <body> <div dojoType="Button">Submit</div> <!--另一种使用Widget标签的方法--> <!--<dojo:button caption="Submit"></dojo:button>--> </body> </html>
3. 自定义Widget标签-HelloWorld
首先创建js/dojo/src/Widget/templates/HelloWorldTemplate.html,代码如下:
<div> HelloWorld </div>
创建js/dojo/src/Widget/HelloWorl.js,代码如下:
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templatePath:dojo.uri.dojoUri("src/widget/templates/HelloWorldTemplate.html") } );
注:所有用户自定义Widget标签都必须继承HtmlWidget。
创建测试文件HelloWorld.html,代码如下:
<html> <head> <script type="text/javascript" src="js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.*"); dojo.require("dojo.widget.HelloWorld"); </script> </head> <title>Hello World Widget test</title> <body> <div dojoType="HelloWorld"></div> <dojo:HelloWorld></dojo:button> </body> </html>
如果HelloWorldTemplate模板足够简单,可以使用templateString替换templatePath,修改后HelloWorld.js代码如下:
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templateString: "<div>Hello World</div>" } );
4. 自定义Widget标签属性
以上部分讨论了如何创建简单的自定义标签,下面需要给HelloWorld添加属性以及自样式,让其更像一个标准的Html标签。让HelloWorld标签的显示内容可以有用户定义,添加text属性就可以办到。修改后的代码如下:
HelloWorld.js
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templateString: "<div>${this.text}</div>", text: ""//default value } );
注:自定义属性必须要设置默认值,否则会被Dojo忽略。而且Dojo会忽略DOM模型下的所有属性。
HelloWorld.html
<html> <head> <script type="text/javascript" src="js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.*"); dojo.require("dojo.widget.HelloWorld"); </script> </head> <title>Hello World Widget test</title> <body> <div dojoType="HelloWorld" text="you can set the text attribute"></div> <!--<dojo:HelloWorld text="you can set the text attribute"></dojo:button>--> </body> </html>
属性的处理
处理属性的典型方法是postCreate()方法(稍候讨论),另一个方法是fillInTemplate()。许多Widget标签都是通过postCreate()方法来处理属性的,也有通过set方法。不同的是postCreate()方法是在标签创建时处理属性,而set方法是在运行时动态设置属性。
脚本片断
在HEML模板文件中加入js代码并不是一个好的方法,但有时候却必不可少。在Dojo中可以使用${…}代码片断来获取属性值,正如上例中的${this.text}。
添加样式
为了使Widget达到真正的功用,Dojo提供了定制css样式的功能,通过引用不同的自定义样式,可以方便的为应用改变显示效果。为HelloWorld标签添加样式,创建一个简单样式文件js/dojo/src/widget/templates/HtmlHelloWorld.css,代码如下:
.caption { font-family: Verdana; font-size: 10pt; }
注:css类名必须是唯一的
修改HeolloWorld.js,代码如下:
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templateString: "<div class=\"caption\">${this.text}</div>", text: "",//default value templateCssPath: dojo.uri.dojoUri("src/widget/templates/HtmlHelloWorld.css") } );
5. 在js中使用Widget标签
本部分将说明如何用Dojo在js代码中使用HelloWorld标签,而传统的js方式已经不再适用。
传统方式操作Widget标签
如果想在程序中动态改变text “Hello World”,你会试着用传统的js方式来实现,但是这样做是徒劳的。传统方式的代码如下:
<html> <head> <script type="text/javascript" src=" js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.HelloWorld"); </script> </head> <body onload="document.getElementById('HelloWorldTest').innerHTML='New text';"> <div id=" HelloWorldTest" dojoType="HelloWorld"></div> </body> </html>
这样的代码是没有任何效果的。下面就分析一下这段为何不会有作用。
A. Body中的onload属性失效
Body中的onload属性与Dojo是不兼容的,Dojo已经在事件方法中包括了onload的事件。Onload事件在Dojo下使用,代码如下:
<html> <head> ... <script> dojo.addOnLoad( function(){ alert("onload!"); } ); </script> </head>
B. Dojo Widget标签与DOM element的区别
Dojo Widget标签已经不再是一个DOM element。Dojo创建Widget标签时,已经去掉所有DOM模式下的所有属性,除了Dojo认识的属性。例如,id已经演化成了widgetId。如果需要用传统的方式操作属性,必须通过修改模板文件来实现。如果需要获取ID,修改模板文件代码如下:
<div id="${this.widgetId}">Hello World</div>
Dojo方式操作Widget标签
如果要用Dojo方式操作Widget标签,必须还要修改一些代码。修改后的HelloWorld.js代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"domNode\" >${this.text}</div>",
text: "",//default value
// dynamic setters
setHtml: function(htmlString) {
this.domNode.innerHTML = htmlString;
}
}
);
注:Dojo Widget标签使用attachment points来处理DOM element。在Dojo方式下,不需要id=”${this.widgetId}”,因为不会使用id来获取对象,而是使用attachment point。实际上attachment point是默认使用的。”domNode”是attachment points根元素
通过获取Widget标签对象实例,代码如下:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript"> dojo.require("dojo.widget.HelloWorld");
dojo.addOnLoad(function(){
dojo.widget.byId("someID").setHtml("New text");
});
</script>
</head>
<body>
<div id="someID" dojoType="HelloWorld"></div>
</body>
</html>
通过使用dojo.widget.createWidget()方法动态创建HelloWorld实例,代码如下:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.HelloWorld");
dojo.addOnLoad(
function(){
var newWidget = dojo.widget.createWidget(
"HelloWorld", // widgetType
{}, // widget attributes, for example {title: "Some Title"}
dojo.byId("widgetPlaceholder") // reference to a DOM node that
// will be REPLACED by new widget
);
}
);
</script>
</head>
<body>
<div id="widgetPlaceholder"></div>
</body>
</html>
6. Widget标签嵌套HTML
本部分讨论如何实现Widget标签的嵌套
A. 嵌套静态HTML
正如前面提到的Dojo创建Widget标签时移除所有的DOM element。所以在Dojo移除之前,必须改变所要的DOM element。通过Dojo提供fillInTemplate()方法实现。此方法可以操作HTML DOM element和已经生成的Widget标签。实现改变静态HTML的HelloWorld.js代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"domNode\">${this.text}</div>",
text: "",//default value
// dynamic setters
setHtml: function(htmlString) {
this.domNode.innerHTML = htmlString;
},
fillInTemplate: function(args, frag) {
// Getting original HTML element
var source = this.getFragNodeRef(frag);
// Moving all children of original element to
// the desired node of the new component
while(source.hasChildNodes()) {
var node = dojo.dom.removeNode(source.firstChild);
this.domNode.appendChild(node);
}
// Invoking original dojo fillInTemplate() method
dojo.widget.HelloWorld.superclass.fillInTemplate.call(this, args, frag);
}
}
);
以上代码将HTML DOM节点转移到需要的地方,另一种实现方法是设置Widet属性isContainter为true。
动态添加嵌套HTML
如何动态添加嵌套HTML实现方法要根据动态HTML的形式来决定:
l 嵌套HTML作为string提供,通过设置innerHtml属性实现。
l 嵌套HTML作为DOM节点提供,可以使用appendChild方法实现。
以上方式的实现代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div>${this.text}</div>",
text: "",//default value
setHtml: function(html) {
if (dojo.lang.isString(html)) {
this.domNode.innerHTML = html;
} else if (dojo.dom.isNode(html)) {
// Cleaning whatever was there before
dojo.dom.removeChildren(this.domNode);
// Adding new element
this.domNode.appendChild(html);
} else {
dojo.lang.assert(false, "setHtml called with incorrect type: " + (typeof html));
}
}
}
);
7. Widget标签嵌套Widget标签
嵌套静态Widget标签
有些情况下我们需要实现Widget标签的相互嵌套,例如Dojo TabContainer和Tree标签。要实现这样的Widget标签,你需要设置isContainer为true,而且要在模板中设置attachment point为”containerNode”,代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"containerNode\">${this.text}</div>",
text: "",//default value
isContainer: true
}
);
这种实现是依赖Dojo的,如果需要实现更加复杂的,必须要操作postCreate方法中的Children数组,数组中存了所有嵌套的静态Widget标签。
测试代码:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.HelloWorld");
</script>
</head>
<title>Hello World Widget test</title>
<body>
<div dojoType="HelloWorld" text=" ad you can set the text attribute">
<div dojoType="Button">Submit</div>
</div>
<!--<dojo:HelloWorld text="you can set the text attribute"></dojo:button>-->
</body>
</html>
复杂应用请参考Dojo TabContainer和Tree标签。
动态添加Widget标签嵌套
动态添加Widget标签嵌套,需要在HelloWorld.js中实现addChild()方法,重写addChild()方法中还要调用父类的addChild()方法。实现动静态添加Widget标签嵌套的代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: "<div dojoAttachPoint=\"titleNode\">${this.text}" +
"<br/><div dojoAttachPoint=\"containerNode\">"
+ "</div></div>",
text: "",//default value
isContainer: true,
postCreate: function() {
// adding statically
for(var i in this.children) {
this._addRow(this.children[i]);
}
},
addChild: function(child, overrideContainerNode,
pos, ref, insertIndex) {
this._addRow(child);
dojo.widget.HelloWorld.superclass.addChild.call(
this, child, overrideContainerNode);
},
_addRow: function(component) {
this.titleNode.appendChild(
document.createTextNode(component.widgetType));
this.titleNode.appendChild(
document.createElement("br"));
}
}
);
注:经测试发现,即使不实现addChild方法,同样可以动态添加Widget标签嵌套,但是在HtmlWidget类中也没有找到addChild方法的实现,这里有待进一步研究。
测试代码:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.Button");
dojo.require("dojo.widget.Checkbox");
dojo.require("dojo.widget.HelloWorld");
dojo.addOnLoad(function(){
var button = dojo.widget.createWidget("Button",
{caption: "Submit"});
dojo.widget.byId('someID').addChild(button);
var checkbox = dojo.widget.createWidget("Checkbox");
dojo.widget.byId('someID').addChild(checkbox);
});
</script>
</head>
<title>Hello World Widget test</title>
<body>
<div dojoType="HelloWorld" id="someID"></div>
<!--<dojo:HelloWorld text="you can set the text attribute"></dojo:button>-->
</body>
</html>
8. Dojo事件处理
本部分主要介绍使用Dojo的方式处理事件,在阅读本部分之前,最好先了解Dojo事件系统。首先需要在模板中定义dojoAttachEvent=”eventName: eventHandlerMethod;”属性。eventName是标准的DOM事件名称(例如:onClick),eventHandlerMethod则为事件调用函数。修改后的代码如下:
dojo.provide("dojo.widget.HelloWorld");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget,
{
templateString: '<div dojoAttachPoint="domNode" dojoAttachEvent="onClick:onClickHandler;">Click here</div>',
onClickHandler: function(e) {
alert("clicked in onClickHandler");
this.onClick(e);
},
onClick:function (e) { //for dojo.event.connect
}
}
);
注:可以在标签中预定义某一事件的函数,如上例中的onClickHandler,同时也可以预留接口让用户绑定自定义函数。
测试代码:
<html>
<head>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.HelloWorld");
function HelloWorld_onClick() {
alert("Node clicked in HelloWorld_onClick");
}
dojo.addOnLoad(function(){
var hello = dojo.widget.byId("someID");
dojo.event.connect(hello, 'onClick', 'HelloWorld_onClick')
});
</script>
</head>
<title>Hello World Widget test</title>
<body>
<div dojoType="HelloWorld" id="someID"></div>
</body>
</html>
总结:
通过对本文的学习,初步了解了Dojo的Widget标签的简单使用和如何实现自定义Widget标签。
【转载地址】http://27091497.blog.163.com/blog/static/11806250200772210458268/
相关推荐
2025职业教育知识竞赛题库(含答案).pptx
"SOA海鸥算法优化下的KELM核极限学习机分类MATLAB代码详解:传感器故障诊断数据集应用与本地EXCEL数据读取功能",(SOA-KELM)海鸥算法SOA优化KELM核极限学习机分类MATLAB代码 代码注释清楚。 main为运行主程序,可以读取本地EXCEL数据。 很方便,容易上手。 (以传感器故障诊断数据集为例) ,核心关键词:SOA-KELM;海鸥算法优化;核极限学习机分类;MATLAB代码;代码注释清楚;main程序;读取本地EXCEL数据;传感器故障诊断数据集。,SOA-KELM分类算法MATLAB代码:海鸥优化核极限学习机,轻松上手,读取EXCEL数据集进行传感器故障诊断
内容概要:本文由世界经济论坛与Capgemini联合发布,主要阐述了AI代理从简单程序演变为复杂自主系统的进程,强调了它们在现代各行业如医疗保健、教育及金融服务等方面所发挥的作用,并讨论了其潜在收益以及伴随的风险和挑战。文中详细介绍了AI代理的发展历程、核心技术趋势(深度学习、强化学习)、多种类型的AI代理及其系统架构,同时对未来的发展方向——多智能体系统进行了展望,探讨了提高生产力、优化资源配置的新机会。 适合人群:对人工智能感兴趣的各界人士,尤其是关注技术创新对企业和社会长远影响的决策者和技术领导者,如商业领袖、政府官员及其他利益相关方。 使用场景及目标:①帮助政策制定者理解AI代理的功能和应用场景;②为企业管理者提供关于部署和管理AI系统的指导;③为研究者指明未来科研方向并探讨伦理和社会责任等问题;④为技术人员揭示当前最先进技术和最佳实践案例。 其他说明:文中还提到了随着更加先进的AI代理不断涌现,确保安全性和有效监管将是未来发展的重要议题之一。此外,跨行业的共识对于将AI代理顺利整合到各个部门至关重要。文章指出需要建立稳健治理机制来保障AI技术健康发展并服务于公共利益最大化的目标。
2025网络安全理论知识考试题(含答案).pptx
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
基于FATFS系统的STM32F407 SD卡升级Bootloader程序:自动检测与升级流程,stm32f407 SD卡升级 bootloader程序 基于sdio fatfs系统的stm32 bootloader程序 功能简介: 本程序使用fatfs系统读取bin文件。 开机后会自动检测sd卡,检测到sd卡后,再读取固定名称的bin文件,之后会对bin文件进行首包校验,判断该升级包的起始地址是否正确,正确的话,就循环读取bin文件并写入到flash中。 完成升级。 详细流程请看流程图 ,stm32f407; SD卡升级; bootloader程序; fatfs系统读取bin文件; 检测SD卡; 首包校验; 循环写入flash。,STM32F407 SD卡升级Bootloader程序:基于SDIO FATFS系统实现自动升级功能
2025网络与信息安全技术题库及答案.doc
C# WinForm通用软件开发框架源码,基于VS2019 .NET与DevExpress 21,WebApi连接SQLServer2014数据库,互联网化数据访问模式,C# 源码 WinForm?通用软件开发框架平台源码 基于:C#Winform+ WebApi +SQLServer2014数据库 基于:VS2019.NET? DevExpress 21.2.6控件 基于:SQLServer2014?数据库 客户端通过Http访问WebApi获得json数据的模式,本系统走互联网,只需要把WebApi发布在公网即可。 说明:此框架源码除系统管理功能外,其它无源码 ,C#源码; WinForm; WebApi; SQLServer2014; VS2019.NET; DevExpress控件; 互联网模式; 系统管理功能; 发布。,C# WinForm开发框架:基于DevExpress与WebApi的通用软件平台源码
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
基于SqueezeNet迁移学习算法的滚动轴承故障诊断方法研究——在MATLAB r2021b环境下的应用与拓展至多元信号领域的研究,MATLAB环境下一种基于sqeezenet网络迁移学习的滚动轴承故障诊断方法。 算法运行环境为MATLAB r2021b,该代码展示了如何使用深度学习(迁移学习)方法对滚动轴承进行故障诊断,演示了如何将一维轴承振动信号转为二维尺度图图像并使用预训练网络应用迁移学习对轴承故障进行分类。 迁移学习显著减少了传统轴承诊断方法特征提取和特征选择所花费的时间,并在小型数据集中获得了良好的准确性。 算法可迁移至金融时间序列,地震 微震信号,机械振动信号,声发射信号,电压 电流信号,语音信号,声信号,生理信号(ECG,EEG,EMG)等信号。 ,MATLAB环境; SqueezeNet网络; 迁移学习; 滚动轴承故障诊断; 算法运行环境; 一维轴承振动信号转换; 二维尺度图图像; 特征提取和选择; 信号分析;迁移至其他类型信号 (以分号隔开),基于SqueezeNet迁移学习在MATLAB的滚动轴承故障诊断算法优化
基于弱形式PDE建模的COMSOL不相溶两相流渗流水驱油模拟研究,comsol不相溶两相流渗流模拟,水驱油,基于弱形式PDE建模,模型已验证。 ,核心关键词:comsol; 不相溶两相流; 渗流模拟; 水驱油; 弱形式PDE建模; 模型验证。,"基于弱形式PDE建模的COMSOL两相流渗流模拟:验证水驱油模型"
Tiled for Mac是一款功能强大的开源地图编辑器,适用于macOS系统。它支持正交、等距和六边形地图类型,可创建无限大小的地图,并支持多图层编辑。用户可以通过直观的界面快速添加、修改地图元素,使用像素精度放置对象,并支持图块动画和碰撞编辑。Tiled的TMX格式易于理解,支持多种插件扩展,兼容多种游戏引擎,如RPG和平台游戏。它还提供撤销/重做功能,方便用户调整和优化地图。
太阳能光伏MPPT控制蓄电池三阶段充电模型仿真说明文档(附扰动观测法仿真模型,R2015b版),充电控制器,太阳能光伏MPPT控制蓄电池充电模型。 其中,光伏MPPT控制采用扰动观测法(P&O法),蓄电池充电采用三阶段充电控制。 仿真模型附加一份仿真说明文档,便于理解和修改参数。 版本: R2015b ,充电控制器; 光伏MPPT控制; 扰动观测法(P&O法); 蓄电池充电控制; 三阶段充电控制; 仿真模型; 仿真说明文档; 版本:R2015b,"R2015b版:太阳能光伏MPPT三阶段充电控制仿真模型及说明"
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
2025医院收费员考试题题库(含答案).docx
"欧姆龙PLC编程新手宝典:标准程序案例集,包括CP1H脉冲编程与触摸屏实战应用",欧姆龙PLC程序欧姆龙案例欧姆龙标准程序 本产品适用于新手或者在校生 本程序包括有欧姆龙CP1H脉冲程序案例,威纶通触摸屏程序,电子版讲义 程序涉及方面广,适合新手入门学习,掌握了这些以后欧姆龙脉冲程序基本通吃,编程起来无压力 本程序设计到CP1H各个轴的程序编写具体用了ACC PLS2 INI等众多指令, 每个轴的程序都是单独的,包括触摸屏在内,您可以直接调用程序套到直接的程序上,只需要把地址稍微改动即可。 本程序适用于新手、自动化专业在校生学习和提高,另外额外赠送主流的CAD电气原理图纸,包含各种主流的PLC接线原理图,各种成功案例,是每个电气工程师学习和提高最必不可少的资料 ,欧姆龙PLC程序; 欧姆龙案例; 欧姆龙标准程序; 新手学习; 在校生; CP1H脉冲程序案例; 威纶通触摸屏程序; 电子版讲义; 编程指令; 程序设计; PLC接线原理图; 成功案例。,欧姆龙PLC入门宝典:从新手到专业工程师的实用指南
"基于Simulink的锂电池SOC估计模型研究:卡尔曼滤波算法的参数辨识与模型优化",锂电池SOC估计模型 simulink SOC估算卡尔曼滤波估算 SOC电池参数辨识模型10个; 卡尔曼滤波算法锂电池SOC估算估算模型15个; 卡尔曼滤波31个; ,锂电池SOC估计模型; Simulink; SOC估算; 卡尔曼滤波估算; 电池参数辨识模型; 锂电池SOC卡尔曼滤波估算模型; 卡尔曼滤波,基于Simulink的锂电池SOC估计与卡尔曼滤波算法研究
苍鹰算法优化BP神经网络参数:多输入单输出预测建模及效果展示 注:此程序为matlab编写,可直接运行出多种预测结果图与评价指标。效果图为测试数据展示,具体预测效果以个人数据为准。,苍鹰优化算法NGO优化BP神经网络的软值和阈值参数做多输入单输出的拟合预测建模。 程序内注释详细直接替数据就可以使用。 程序语言为matlab。 程序直接运行可以出拟合预测图,迭代优化图,线性拟合预测图,多个预测评价指标。 PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。 2.由于每个人的数据都是独一无二的,因此无法做到可以任何人的数据直接替就可以得到自己满意的效果。 ,核心关键词: 苍鹰优化算法; NGO优化; BP神经网络; 软值和阈值参数; 多输入单输出拟合预测建模; 程序内注释; MATLAB程序语言; 拟合预测图; 迭代优化图; 线性拟合预测图; 预测评价指标。,基于苍鹰优化算法的NGO-BP神经网络模型:多输入单输出拟合预测建模与评估
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
GTP4ALL的安装文件