dojo query

dojo/queryreturns a list of DOM nodes based on a CSS selector.

Introduction

dojo/requestand XHR is half of the AJAX story. Once you make a request for data and receive a response,you must change the page. Being able to change the HTML is dependent on locating nodes.

To select DOM nodes in JavaScript,you can use the browser’s native DOM API,but it’s verbose and hard to work with,slow and can differ across browser. For example,retrieving all nodes with the class “progressIndicator” uses this code:

// list every node with the class "progressIndicator":
var list = [];
var nodes = document.getElementsByTagName("*");
// iterate over every node in the document....SLOOOW
for(var x = 0; x < nodes.length; x++){
  // only nodes with the class "progressIndicator":
  if(nodes[x].className == "progressIndicator"){
    // add to array:
    list.push(nodes[x]);
  }
}
console.log(list);

dojo/querygives us a more compact way to do it,and it is often faster,particularly as we ask for more sophisticated kinds of relationships. The following is essentially equivalent to our first example:

require(["dojo/query"], function(query){ console.log(query(".progressIndicator")); });
Usage

Requring in the module is all that is needed:

function(query){ var nl = query(".someClass"); });

dojo/queryreturns an instance ofNodeList,which is essentially a JavaScript Array that has been decorated with functions that make it easier to utilise. There are extensions of the baseNodeListthat are available to provide additional functionality:

The first argument is theselectorwhich is a CSS selector string that identifies the nodes that need to be retrieved. The second argument is an optionalcontextwhich limits the scope of the selector and only children of the will be considered. This can either be a string representing the node ID or a DOM node. For example:

"dojo/query", "dojo/dom"],32); font-weight:bold">function(query, dom){ ".someClass",160)">"someId"); // or var node = dom.byId("someId"); nl node); });

dojo/queryandNodeListare specifically designed with chaining in mind. Most functions onNodeListreturn an instance ofNodeList. For example:

"dojo/NodeList-dom"],32); font-weight:bold">function(query){ query("li").forEach(function(node){ node.innerHTML = "Something"; }).style("color",160)">"red") .style("fontSize",160)">"12px"); });

Selector Engines

dojo/queryis responsible for loading the appropriate selector engine. There are several different modes whichdojo/querycan run in:

  • css2(orlite) - This will always use the lite engine,which delegates to the native selector engine if available for anything but very simple queries (like id lookups). When a native selector engine is not available ( IE7 and below),this supports simple,basic CSS2 level queries,consisting of elemental selectors:.class,#id,monospace!important">tag,and*,attribute selectors,and child (>),descendant (space),and union (,) combinators. If the native selector engine is,the engine does not support pseudo classes.
  • css2.1- This will always use theliteengine when a native selector engine is available. When a native selector engine is not available (IE7 and below),this will loadacme.
  • css3- This will always use theliteengine when a native selector engine with significant CSS3 support is available. When a CSS3 capable (supporting most features) native selector engine is not available (IE8 and below),monospace!important">acme- Theacmeselector engine with full CSS3 features will be used. This supports certain features that are not available in any native engine (albeit rarely used).

When you are running Dojo in legacy mode (async:false),monospace!important">dojo/querywill run inacmemode. When you are running withasync:truethe default selector engine level iscss3.

The summarize,the two alternate selector engines included with Dojo have the following features (which can be selected explicitly or by the module’s CSS level needs):

  • acme- Designed to have full CSS3 support,it is about 14KB (minified).
  • lite- Basic CSS2 level queries,) combinators. With a native selector engine,theliteengine does not support pseudo classes. It is about 2KB (minified).

Specifying the Selector Level

The selector level can be controlled though various mechanisms. The default selector level can be specified in the build profile (seeDojo Builder). The selector engine can be specified as part of your Dojo configuration:

<script data-dojo-config="selectorEngine: 'css2.1',async: true" src="dojo/dojo.js">
</script>

Or:

type="text/javascript"> var dojoConfig = { selectorEngine: "css2.1", async: true }; </script> >

The selector engine level can be specificed as a loader plugin for each module. For example,if the module needed to do a CSS3 level query,you could write:

define(["dojo/query!css3"],32); font-weight:bold">function(query){ query(".someClass:last-child").style("red"); });

If Dojo had started with theliteengine,this will ensure that CSS3 support is available,and will loadacmeon older browsers. It is recommended that you use this syntax for modules that explicitly need more complex queries. If your module is using a simpler query,then"dojo/query"or"dojo/query!css2.1"should be used.

Selector Support

The following tables summerize selector engine levels and their support.

Standard CSS2 Selectors

These selectors can be used with any selector engine.

Pattern Meaning
* any element
E an element of type E
E F an F element descendant of an E element
E > F an F element child of an E element
E:link
E:visited an E element being the source anchor of a hyperlink of which the target is not yet visited (:link) or already visited (:visited)
E:active E:hover
E:focus an E element during certain user actions
E[foo] an E element with a “foo” attribute
E[foo=”bar”] an E element whose “foo” attribute value is exactly equal to “bar”
E[foo~=”bar”] an E element whose “foo” attribute value is a list of space-separated values,one of which is exactly equal to “bar”
E[hreflang|=”en”] an E element whose “hreflang” attribute has a hyphen-separated list of values beginning (from the left) with “en”
E:lang(fr) an element of type E in language “fr” (the document language specifies how language is determined)
E.warning an E element whose class is “warning” (the document language specifies how class is determined).
E#myid an E element with ID equal to “myid”.
S1,S2 union of two selectors,ex: div,span

Additional Selectors Supported By Lite Engine

These selectors are not part of CSS2,but are supported by the lite engine,so effectively then can also be used with any specified selector engine.

E[foo^=”bar”] an E element whose “foo” attribute value begins exactly with the string “bar”
E[foo$=”bar”] an E element whose “foo” attribute value ends exactly with the string “bar”
E[foo*=”bar”] an E element whose “foo” attribute value contains the substring “bar”

Standard CSS2.1 Selectors

To use these selectors,you must specify thecss2.1,monospace!important">css3,oracmeselector engine.

E:first-child an E element,first child of its parent
E + F an F element immediately preceded by an E element

Alternate Selector Engines

We can also use other selector engine levels. Both Sizzle and Slick are excellent selector engines that work withdojo/query. AMD/Dojo compatible versions (just wrapped with AMD) are available here:

Once installed,you can use the selector engine module id as specified selector engine level. We could set Sizzle as the query engine for our page:

"selectorEngine: 'sizzle/sizzle'" </script>

or set Slick as the engine for a particular module:

"dojo/query!slick/Source/slick"],160)">".someClass:custom-pseudo").style("red"); });

Note for cross-domain legacy API usage

This use case should be quite rare,but presents a wrinkle worth noting.

When loadingdojo.jscross-domain and electing to use an alternate selector engine not included indojo.jsitself,legacy APIs will not immediately work,since Dojo base does not finish loading until the selector engine is pulled in asynchronously. In this case,it will be necessary to userequire. In a pinch,legacy code can simply be wrapped like so:

"dojo"],32); font-weight:bold">function(dojo){ dojo.require(/* ... */); // etc... });

Again,this issueonlyaffects use of legacy APIs when a selector engine is used which is not baked intodojo.js.

Examples

Example Selector Queries

The following tables provide example selector queries and what sort of nodes they would select.

Query Description
h3 All nodes that are heading level 3
h3:first-child All nodes that are the first children of a<h3>header
#main A node withid="main"[1]
#mainh3 All<h3>nodes that are contained by a node withid="main"[1]
div#main Only select a node withid="main"if it is a<div>
div#mainh3 All nodes that are<h3>contained in a<div>with anid="main"
#maindiv>h3 <h3>nodes that are immediate children of a<div>contained within a node that hasid="main".foo All nodes with aclass="foo"
.foo.bar All nodes that have bothfooandbarclasses
#main>h3 <h3>nodes that are immediate children of a node withid="main"#main>* All immediate children of a node withid="main".foo>* All immediate children of a nodes with a.foo,.bar class="foo"or aclass="bar"
[foo] All nodes with an attribute offoo
[foo$=\"thud\"] foowhere the value ends inthud
[foo$=thud] thud
[foo$=\"thudish\"] thudish
#main[foo$=thud] thudthat are contained within a node with anid="main"#main[title$=thud] titlewhere the value ends inid="main"#mainspan[title$=thud] <span>nodes with an attribute ofid="main"[foo|=\"bar\"] foowhere the value containsbarin a dash seperated list (e.g.foo="baz-bar-qat")
[foo|=\"bar-baz\"] bar-bazin a dash seperated list (e.g.foo="qat-bar-baz-qip")
.foo:nth-child(2) The 2nd children of nodes with astyle="foo"
> All immediate childen
>* All immediate children
>[qux] All immediate children that have an attribute ofqux
.foo+span All nodes that are a<span>that are directly after a node with a.foo~span <span>that are siblings that follow a node with astyle="foo"
#foo~* All nodes that are siblings that follow a node with anid="foo"#foo~ id="foo"#mainspan.foo:not(span:first-child) <span>with aclass="foo"but not a<span>and the first child of a node with anid="foo".
#mainspan.foo:not(:first-child) class="foo"but not the first child of a node with anid="foo".#main>h3:nth-child(odd) <h3>and the odd immediate children of a node with anid="main"#mainh3:nth-child(odd) <h3>and are odd children contained within a node with anid="main"#mainh3:nth-child(2n+1) <h3>
#mainh3:nth-child(even)
#mainh3:nth-child(2n) Every other nodes that are#main2>:checked #main2>input[type=checkbox]:checked
#main2>input[type=radio]:checked

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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确实完全正常工作.但是当我点击图像时