Dojo 1.6 最新官方 Dojo DOM 函数

本文翻译自: Dojo DOM Functions

原作者: Sam Foster

翻译: Siqi (siqi.zhong@gmail.com

在本教程中,您将学到如何使用Dojo简单地跨平台操作DOM。只需要基本DOM知识和几个Dojo函数,您就能高效地创建、读取、更新或是删除页面上的元素。

难度:初学者

Dojo 版本:1.6

开始上手

从基于浏览器的JavaScript受到关注时起,Document Object Model (DOM) 就是我们绘制所要内容的的地方,也是用户所看到的界面。如果我们想要增强、替换或是向浏览器加载好的HTML添加点什么东西,JavaScript和DOM便是我们所需要的。Dojo旨在使DOM操作变得更加简单、高效,为此Dojo提供了一些方便的函数来解决不同浏览器间恼人的的兼容性问题,并让常用操作更加简洁。

为了了解这些函数,我们将操作一个简单的页面,该页面中有一个含有五个元素的无序列表:

这个页面已经含有Dojo脚本标签, 相信你已经认识dojo.ready代码块。所有对DOM进行操作的代码必须等到DOM加载完毕后才能被执行。

检索

事有先后:为了对DOM进行操作,我们首先需要知道如何从DOM中获取元素。最简单的方法是使用dojo.byId。在你将一个你想要获得的元素的ID传给dojo.byId之后,如果ID相符的DOM节点存在,你将获得该节点,如果没有匹配的节点,那么将获得null。

这和使用document.getElementById是等价的,但是使用dojo.byId有两个优点:更简洁,并解决了某些浏览器对getElementById实现的bug。另一个dojo.byId很棒的特点是,如果你将一个DOM节点传给它,它将马上返回该节点。这有助于建立同时适用字符串与DOM节点的API。让我们来看一个例子:

查看示例

setText函数用来设置一个节点的文字内容,由于dojo.byId可以接受DOM节点作为参数,该函数也就可以接受字符串或者DOM节点。

创建

另一个你会经常做的事情就是创建元素。Dojo不会阻止你使用原生的document.createElement方法来创建元素,但是创建一个元素并为其设置所有需要的属性可能会是非常冗长的。更可怕的是,你将面对不少不同浏览器差异造成的额外属性设置。而这使得dojo.create不可谓是一个更方便、可靠的选择。

dojo.create有如下参数:节点名(字符串)、节点的属性(object)、可选的父节点或是兄弟节点、可选的与父节点或是兄弟节点的相对位置(默认为“last”)。它返回新建的DOM元素节点。让我们看一个例子:

查看示例

一个简单的内容为“Six”的列表元素被创建并被添加到列表中。接着,另一个内容为“Seven”的列表元素被创建,它的className属性为”seven”,该样式使其字体为粗体,然后该元素被添加到列表中。最后,一个内容为“Three and a half”的列表元素被创建并被插入到ID为“three”的列表元素之后。

什么时候该像这样创建元素,什么时候该直接设置一个容器的innerHTML属性呢?如果你已经有一个你所需要的HTML内容的字符串时,设置innerHTML属性肯定会更快一点。但是,dojo.create的优势在你想要创建节点但又不需要立即将他们添加到DOM中,或是当你想要插入或是添加一个新元素而不影响周围的兄弟节点时就体现出来了。

安插

如果你已经有了一个节点并且想将安插到某处,你将会需要用到dojo.place。其参数如下:DOM节点或一个想要安插的节点的ID、DOM节点或是一个参照节点的ID、可选的位置(字符串,默认为“last”)。这和我们看到的dojo.create的参数表很像,事实上,dojo.create在底层使用了dojo.place。在前面的例子基础上,我们向页面加了几个按钮:

下面代码定义了一些使用dojo.place来移动列表中第三个节点的函数:

查看示例

安插位置的有效参数可以是"before"、"after"、"replace"、"only"、"first"或"last"。有关每种安插选项的含义请参见reference guide for dojo.place

在这个简单的例子里,dojo.place比原生的parentNode.appendChild(node)稍稍多做了一点事情。它可以简单地指定安插的位置,无论是相对于父节点或是兄弟节点——使用一个一致的API。

删除

通常你会创建节点,不过有时候,你也会想要删除某些节点。Dojo提供了两种方法来删除节点:dojo.destory会删除一个节点和其所有的子节点,而dojo.empty将只删除一个节点的子节点。这两种方法都接受一个DOM节点或是一个节点的ID作为参数。我们将向我们的页面添加两个按钮:

查看示例

第一个按钮在用户按下时删除列表中的第一个元素。第二个按钮则清空整个列表。

总结

现在,我们有了一套比较全面的用来操作DOM的工具,从创建节点到移动节点再到删除它们——但它们在同一个时刻都只能对一个节点进行操作。如果你想要对一些没有ID的节点进行操作怎么办?下一个教程将会介绍dojo.query,它可以让我们基于CSS选择器来查找、操作节点!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我有一个网格,可以根据更大的树结构编辑小块数据.为了更容易知道用户保存了什么,我希望当用户第一次看到网格时,网格处于不可编辑状态.当用户准备好后,他们可以单击编辑按钮,这将使网格的某些部分可编辑.然后,有一个保存或取消按钮可以保存更改或还原.在大多数情况下它是有效的.但
我即将开始开发一款教育性的视频游戏.我已经决定以一种我可以轻松打包为Web,Mobiles和可能的Standalone版本的方式来实现这一目标.我不想使用Flash.因此,我确信(无论如何我会听取建议)使用JavaScript和SVG.我正在对这个问题进行大量研究,但我很难把各个部分放在一起.我知道Raphae
我正在使用带有Grails2.3.9的Dojo1.9.DojoNumberTextBox小部件–我在表单中使用–将固定格式(JavaScript基本格式)的实数值(例如:12.56)设置为HTML表单输入字段(但根据浏览器区域设置显示/编辑它们,所以用户总是看到格式正确的数字).另一方面,Grails期望输入字段根据浏览器
1.引言鉴于个人需求的转变,本系列将记录自学arcgisapiforjavaScript的学习历程,本篇将从最开始的arcgisapiforjavaScript部署开始,个人声明:博文不在传道受业解惑,旨在方便日后复习查阅。由于是自学,文章中可能会出现一些纰漏,请留言指出,不必留有情面哦!2.下载ArcGISforDe
我正在阅读使用dojo’sdeclare进行类创建的语法.描述令人困惑:Thedeclarefunctionisdefinedinthedojo/_base/declaremodule.declareacceptsthreearguments:className,superClass,andproperties.ClassNameTheclassNameargumentrepresentsthenameofthec
我的团队由更多的java人员和JavaScript经验丰富组成.我知道这个问题曾多次被问到,但为了弄清楚我的事实,我需要澄清一些事情,因为我在客户端技术方面的经验非常有限.我们决定使用GWT而不是纯JavaScript框架构建我们的解决方案(假设有更多的Java经验).这些是支持我的决定的事实.>
路由dojo/framework/srcouting/README.mdcommitb682b06ace25eea86d190e56dd81042565b35ed1Dojo应用程序的路由路由FeaturesRoute配置路径参数RouterHistoryManagersHashHistoryStateHistoryMemoryHistoryOutletEventRouterContextInjectionOutl
请原谅我的无知,因为我对jquery并不熟悉.是否有dojo.connect()的等价物?我找到了这个解决方案:http:/hink-robot.com/2009/06/hitch-object-oriented-event-handlers-with-jquery/但是没有断开功能!你知道jquery的其他解决方案吗?有jquery.connect但这个插件在我的测试中不起作用.
与java类一样,在dojo里也可以定义constructor 构造函数,在创建一个实例时可以对需要的属性进行初始化。//定义一个类mqsy_yjvar mqsy_yj=declare(null,{     //thedefaultusername    username: "yanjun",          //theconstructor   
我一直在寻找一些最佳实践,并想知道Dojo是否具有框架特定的最佳实践,还是最好只使用通用的Javascript标准?特别是我主要是寻找一些功能和类评论的指导方针?解决方法:对于初学者来说,这是项目的风格指南:DojoStyleGuide
我有’05/17/2010’的价值我想通过使用dojo.date.locale将其作为“2010年5月17日”.我尝试过使用dojo.date.locale.parse,如下所示:x='05/17/2010'varx=dojo.date.locale.parse(x,{datePattern:"MM/dd/yyyy",selector:"date"});alert(x)这并没有给我所需的日期
我正在尝试创建一个包含函数的dojo类,这些函数又调用此类中的其他函数,如下所示:dojo.provide("my.drawing");dojo.declare("my.drawing",null,{constructor:function(/*Object*/args){dojo.safeMixin(this,args);this.container=args[0];
我知道你可以使用jQuery.noConflict为jQuery做这件事.有没有办法与Dojo做类似的事情?解决方法:我相信你可以.有关在页面上运行多个版本的Dojo,请参阅thispage.它很繁琐,但似乎是你正在寻找的东西.一般来说,Dojo和jQuery都非常小心,不会破坏彼此或其他任何人的变量名.
我有一个EnhancedGrid,用户经常使用复杂的过滤器.有没有办法允许用户保存或标记过滤器,以便将来可以轻松地重新应用它?我知道我可以通过编程方式设置过滤器,但我无法预测用户想要的过滤器.谢谢!编辑:自己做了一些进展…使用grid.getFilter()返回过滤器的JSON表示,然后使用json.strin
我有这个代码:dojo.declare("City",null,{constructor:function(cityid,cityinfo){}});dojo.declare("TPolyline",GPolyline,{constructor:function(points,color){},initialize:function(map){});应该是什
我遇到的问题是我的所有javascript错误似乎来自dojo.xd.js或子模块.我正在使用chrome调试器和许多dijit功能,如dijit.declaration和dojo.parser.这有点烦人,因为它很难找到简单的错误或滑倒.我希望我可以添加一个选项,允许我的调试器在我的非dojo代码中显示选项会发生的位置.我是
我正在使用DojoToolkit数字/解析函数来处理格式化和使用ICU模式语法解析字符串.有没有人知道有可能采取任意ICU模式字符串并以某种方式使用Dojo(或其他)库将其分解为它的部分(例如,对于数字模式,它可以被分解为小数位数,数千个分组等…).我希望这样做,而不需要让我的代码密切了
我有两个看似相关的问题,访问在不同的地方定义的javascript函数.我遇到的第一个问题是调用我在firgbug或safari控制台中定义的函数.我定义了一个名为getRed的函数,如下所示:functiongetRed(row,col){//dosomethingstuffandreturntheredvalueasa
我想添加一个在Ajax调用中指定的外部样式表.我已经找到了一种方法来使用jQuery(参见下面的示例),但是我需要使该方法适应dojoJavaScript框架.JQuery示例$('head').append('<linkrel="stylesheet"type="text/css"href="lightbox_stylesheet.css">');谢谢.解决方法:一旦你
我正在尝试使用dojo.connect将onMouseDown事件连接到图像,如:dojo.connect(dojo.byId("workpic"),"onMouseDown",workpicDown);functionworkpicDown(){alert("mousedown");}类似的代码几行后,我将onMouse*事件连接到dojo.body确实完全正常工作.但是当我点击图像时