全国计算机java二级java 需要考javascript吗

12个你未必知道的CSS小知识
浏览:1563 评论:0
虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过。1.CSS的color属性并非只能用于文本显示对于CSS的color属性,相信所有Web开发人员都使用过。如果你并不是一个特别有经验的程序员,我相信你未必知道color属性除了能用在文本显示,还可以用作其它地方。你可以先看一下下面的演示:&img alt=&Example alt text& width=&200& height=&200&&
&li&Example list item&/li&
&li&Example list item&/li&
&hr&CSS代码body {
background: #444;
font-size: 20
font-family: Arial, sans-
text-align:
border: solid 2
text-align:
text-align:
border-color:
}请注意,上面的代码里只使用了一个color属性,就是在body元素上,设置成了yellow。但是,你也看到了,所有这个页面上的东西都变成了黄色,包括:无法显示的图片的alt文字list元素的边框无序list元素前面的小点有序list元素前面的数字还有hr元素有趣的是,这个hr元素,缺省情况下它并不从body上继承color的属性,但我使用border-color: inherit强制让它继承。这是个很诡异的特征。在CSS规范里是这样说的:这个属性声明了元素文本内容的前景色(foreground color)。除此之外,它的值还被用于其它地方间接的引用….比如,其它可以接受颜色值的属性。我无法想象出还有什么地方的属性能用“前景色”来描述,如果你知道,请在评论里告诉我。&2.CSS里的visibility属性有个collapse属性值:collapse对于CSS里的visibility属性,相信你用过不下几百次。大多时候,你会把它的值设置成visible(这是所有页面元素的缺省值),或者是hidden。后者相当于display: none,但仍然占用页面空间。其实visibility可以有第三种值,就是collapse。当一个元素的visibility属性被设置成collapse值后,对于一般的元素,它的表现跟hidden是一样的。但例外的是,如果这个元素是table相关的元素,例如table行,table group,table列,table column group,它的表现却跟display: none一样,也就是说,它们占用的空间也会释放。但遗憾的是,各种浏览器对collapse值的处理方式不一样。看一下下面的演示:&table cellspacing=&0& class=&table lazy &&
&th&Fruits&/th&
&th&Vegetables&/th&
&th&Rocks&/th&
&td&Apple&/td&
&td&Celery&/td&
&td&Granite&/td&
&td&Orange&/td&
&td&Cabbage&/td&
&td&Flint&/td&
&p&&button&collapse行1&/button&&/p&
&p&&button&hide行1&/button&&/p&
&p&&button&重置&/button&&/p&CSS代码body {
text-align:
padding-top: 20
font-family: Arial, sans-
border-collapse:
border-spacing: 5
border: solid 1
width: 500
text-align:
border: solid 1
padding: 10
visibility:
visibility:
margin-top: 5
}Javascript代码var btns = document.getElementsByTagName('button'),
rows = document.getElementsByTagName('tr');
btns[0].addEventListener('click', function () {
rows[1].className = 'vc';
}, false);
btns[1].addEventListener('click', function () {
rows[1].className = 'vh';
}, false);
btns[2].addEventListener('click', function () {
rows[1].className = '';
}, false);CSS-Tricks的Almanac建议说不要使用这个值,因为浏览器的不统一。据我的观察:在谷歌浏览器里,使用collapse值和使用hidden值没有什么区别。 (See this bug report and comments)在火狐浏览器、Opera和IE11里,使用collapse值的效果就如它的字面意思:table的行会消失,它的下面一行会补充它的位置。说实话,估计这个值很少人会使用它,但你要知道确实可以使用这样的一个值,如果以前不知道它,那么,现在,在有些罕见的地方,你也许就会变得聪明一点了。&3.CSS的background简写方式里新增了新的属性值在CSS2.1里,background属性的简写方式包含五种属性值 – background-color, background-image,background-repeat, background-attachment, and background-position。从CSS3开始,又增加了3个新的属性值,加起来一共8个。下面是按顺序分别代表的意思:background: [background-color] [background-image] [background-repeat]&& & & & & &[background-attachment] [background-position] / [ background-size]&& & & & & &[background-origin] [background-clip];注意里面的反斜杠,它更font和border-radius里简写方式使用的反斜杠的用法相似。反斜杠可以在支持这种写法的浏览器里在position后面接着写background-size。除此之外,你开可以增加另外两个描述它的属性值: background-origin 和 background-clip.它的语法用起来像下面这个样子:.example {
background: aquamarine url(img.png)
center center / 50%
content-box content-
}关于浏览器的支持情况,大概所有的现代浏览器都支持这些新属性值,但对于一些非常老旧的浏览器(IE6/7/8),最好在代码里提供一些万一不支持的补救机制。&4.CSS的clip属性只在绝对定位的元素上才会生效之前说到了background-clip,你可能会想到clip属性。它的用法是下面这个样子:.example {
clip: rect(110px, 160px, 170px, 60px);
}它的作用是按指定的尺寸、规定的大小裁剪元素。很多简单,但唯一你需要注意的事情是,clip只会在绝对定位的元素上生效。所有,你必须这样做:.example {
clip: rect(110px, 160px, 170px, 60px);
}但是,你也可以将元素的position设置成position: fixed,因为,根据css官方规范,fixed的元素也属于‘absolutely positioned’元素。&5.元素竖向的百分比设定是相对于容器的宽度,而不是高度这是一个很让人困惑的CSS特征,我之前也谈到过它。我们大家都知道,当按百分比设定一个元素的宽度时,它是相对于父容器的宽度计算的,但是,对于一些表示竖向距离的属性,例如padding-top,padding-bottom,margin-top,margin-bottom等,当按百分比设定它们时,依据的也是父容器的宽度,而不是高度。下面是一个实例演示,你可以调整容器的宽度,但你会发现,黄块块的padding-bottom的距离也会随之宽度而变大或变小。&div class=&wrapper lazy & id=&w&&
&div class=&box lazy & id=&b&&&/div&
&input type=&range& min=&120& max=&400& value=&400& class=&range lazy & id=&r&&
&output&宽度是: &span id=&op&&400px&/span&&/output&
&output&黄块块的Padding bottom是:&span id=&op2&&10%&/span&&/output&CSS代码body {
font-family: Arial, sans-
padding-top: 30
text-align:
.wrapper {
width: 400
border: solid 1
width: 100
height: 100
background:
margin-left:
margin-right:
padding-top: 10%;
padding-bottom: 10%;
margin-bottom: 5%;
margin: 20
text-align:
font-weight:
padding-bottom: 20
output span {
font-weight:
}上面的代码中,我们对内部子元素声明了3个竖向的距离,都是百分比形式。当移动滑块时,我们的js代码只需修改了容器的宽度。但是,这个这三个属性高度都跟随着变化,可以看出,它们的百分比计算是基于容器的宽度,而不是高度的。6.border属性比你想象的要复杂我们很多人都用过这样的写法:.example {
border: solid 1
}这里的border属性的用法实际上是一种简写的形式,它分别设置了border-style, border-width, 和border-color — 用一句代码表示它们三个。但不要忘记,border-style, border-width, 和border-color也都有自己的简写形式。所以,border-width可以写成这样:.example {
border-width: 2px 5px 1px 0;
}这样,四个边的宽度被一次设定。border-color 和 border-style 属性也可以这样做。下面的这个实例演示就是用的这种写法:&div class=&box lazy &&&/div&CSS代码body {
font-family: Arial, sans-
width: 150
height: 150
margin: 20
border-color: peachpuff chartreu
border-style: solid
border-width: 10px 3px 1px 8
text-align:
}其实,这些每个属性还可以继续细化,被拆分成border-left-style, border-top-width,border-bottom-color….但是,你无法用border的简写分别对四个边设置不同的值,只能分开来设置。所以,border是一个简写里还有简写的属性。7.text-decoration属性变成了属性简写我相信有些小知识会让你大吃一惊。跟着最新的CSS规范,text-decoration现在的写法是这样的:a {
text-decoration:
}text-decoration属性现在需要用三种属性值来表示了:text-decoration-line,text-decoration-color, and text-decoration-style.但不幸的是,目前只有火狐浏览器实现了对这些新属性的支持。你可以用火狐浏览器试一试下面的演示:&a href=&#& id=&a&&IT'S LIKE WATER, PEOPLE&/a&CSS代码body {
padding: 30
text-align:
font-family: Arial, sans-
a, a:visited {
background:
-moz-text-decoration-color:
-moz-text-decoration-line:
-moz-text-decoration-style:
text-decoration-color:
text-decoration-line:
text-decoration-style:
}在这演示中,我们没有使用简写形式,而是分开描述每个属性。这是可以更好的保证浏览器的向后兼容,使那些目前不支持这种写法的浏览器也不受影响。&8.border-width属性可以使用预定义常量值也许对与你来说这并不是一个什么新鲜信息。除了可以使用标准宽度值(例如5px或1em)外,border-width属性可以接受预定义的常量值:medium, thin, 和 thick事实上,如果你不给border-width属性赋值,那它的缺省值是“medium”。下面的演示就是用了预定义常量值:&div class=&example lazy &&&/div&CSS代码body {
font-family: Arial, sans-
text-align:
.example {
width: 100
height: 100
margin: 20
background:
}在浏览器使用这些预定义常量值时,CSS规范里并没有规定都应该是什么宽度,但从我的观察看,它们的值分别是 1px, 3px, 和 5px.&9.为什么没有人使用border-image之前我曾经写过一篇关于CSS的border-image属性的文章。现在几乎所有的现代浏览器都支持这个属性——除了IE10及以下IE版本。看起来这是一个非常漂亮的CSS功能,它可以让你用图片修饰元素的边框。下面是一个实例演示,你可以拖拽调整里面的方块的大小,看看有什么边框图案的变化。&div class=&bi lazy &&
&p&&上面的方块使用了图片描边。在这个方块的右下角,有一个可以调整这个方块大小的小三角,点住它,拖动它调整方块大小,看看有什么效果。.&/strong&&/p&
&p&Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.&/p&
&/div&CSS代码body {
font-family: Arial, sans-
text-align:
border: 45
-webkit-border-image: url('') 45
-moz-border-image: url('') 45
border-image: url('') 45
font-family: Arial, Helvetica, sans-
color: #222;
width: 500
margin: 30px auto 30
}但不幸的是,这么好的一个功能,却没有看到多少人使用它,也许是我的眼界太窄。如果你在哪看到过有人使用border-image属性,或你在真正项目中使用了它,请留言告诉我。10.你知道table里的empty-cells属性吗?css里的empty-cells属性是所有浏览器都支持的,甚至包括IE8,它的用法是下面这个样子:table {
empty-cells:
}估计你从语义上已经猜出它的作用了。它是为HTML table服务的。它会告诉浏览器,当一个table单元格里没有东西时,就隐藏它。下面的演示里,你可以点击里面按钮,它会切换empty-cells的属性值,看看table的显示有什么变化。&table cellspacing=&0& id=&table&&
&th&Fruits&/th&
&th&Vegetables&/th&
&th&Rocks&/th&
&td&Celery&/td&
&td&Granite&/td&
&td&Orange&/td&
&td&Flint&/td&
&button id=&b& data-ec=&hide&&切换EMPTY-CELLS&/button&CSS代码body {
text-align:
padding-top: 20
font-family: Arial, sans-
border: solid 1
border-collapse:
border-spacing: 5
width: 500
empty-cells:
background:
text-align:
border: solid 1
padding: 10
margin-top: 20
}js代码var b = document.getElementById('b'),
t = document.getElementById('table');
b.onclick = function () {
if (this.getAttribute('data-ec') === 'hide') {
t.style.emptyCells = 'show';
this.setAttribute('data-ec', 'show');
t.style.emptyCells = 'hide';
this.setAttribute('data-ec', 'hide');
};11.font-style的oblique属性值对与css的font-style属性,我估计大家每次见到的都是使用“normal”或 “italic”两个属性值。但事实上,你还可以让它赋值为“oblique”。请看下面的演示:&h1&Oblique Text&/h1&
&h1&Italic Text&/h1&CSS代码h1 {
font-weight:
font-family: Georgia,
font-style:
text-align:
font-size: 50
h1:nth-child(2) {
font-style:
font-family: Arial, sans-
text-align:
}12.word-wrap和overflow-wrap是等效的word-wrap并不是一个很常用的CSS属性,但在特定的环境中确实非常有用的。我们经常使用的一个例子是让页面中显示一个长url时换行,而不是撑破页面,下面是一个例子。&p class=&p lazy & id=&p&&supercalifragilisticexpialidocious&/p&
&button id=&b& data-ww=&break-word&&TOGGLE word-wrap&/button&CSS代码body {
font-family: Arial, sans-
text-align:
font-size: 24
text-align:
width: 200
margin: 20
border: solid 1
min-height: 60
JavaScript
您可能感兴趣的书籍
本站()所提供的等资源来源互联网,仅供学习研究之用,版权归该资源的合法拥有者所有,如用于商业用途,请购买正版,原作者若认为本站侵犯了您的版权,请联系我们,我们会立即删除!
鄂ICP备号-1<span id=deng(打一成语谜语)
谜底:张树林
查看答案出国留学网()之小知识:猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法;属于增损体的有加法、减法、加减法;属于离合体的有离底法、离面法;属于象形体的有象形法、象画法;属于谐音体的有直谐法、间谐法;属于综合体的有比较法、拟人法、拟物法、问答法、运典法。【运典法】词类谜语以人们熟悉的成语、口语、诗词、典故作谜面,而将意义别解,从而扣合谜底。实例:宝玉求婚(打一美国历史人物)林肯)..
成语谜语:强??/div&&/td&
&td&&div&&span id=deng的相关文章
元宵节的时候,我们坐在家中吃着香甜的汤圆,猜着灯谜,真是一件非常有趣的事。下面是作文网谜语栏目为你整理的一篇《元宵节灯谜大全》,更多的谜语、灯谜就上作文网。
元宵晚会灯谜
元宵节的灯谜..
1、解落三秋叶,能开二月花。过江千层浪,入竹万竿斜。 打一自然现象(风)
2、火烧赤壁。 打一词牌名(满江红)
3、柜。 打一成语 (水到渠成)
4、四山纵横,两日绸缪。富是他起脚,累是他起头。打一字(田)
5、上无半片之瓦,下无立锥之地。腰间挂着一个葫芦,倒有些阴阳之气。打一字(卜)
6、先写了一撇,后写了一画。 打一字 (孕)
7、已经晓得。 打两字昆虫名(知了)
8、多出一半。..
谜题:爹娘是忠臣,生我不聪敏,罚我做奴仆,天天要背人。 (打一动物)
谜题:身上有个皮口袋,不装米也不装麦,装着它的小乖乖,还有妈妈许多爱。 (打一动物)
谜底:袋鼠
谜题:体型巨大为海怪,用肺呼吸游得快,呼出喷泉露在外。 (打一动物)
谜底:鲸鱼
谜题:说它像鸡不是鸡,尾巴长长拖到地,张开尾巴像把扇,花花绿绿真美丽。 (打一动物)
谜底:孔雀
谜题:喜爱古木森林,到处敲..
谜面:班门弄斧打一动物
难度系数:2颗星
出国留学网()之小知识;猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法:属于增损体的有加法、减法、加减法:属于离合体的有离底法、离面法:属于象形体的有象形法、象画法:属于谐音体的有直谐法、间谐法:属于综..
谜面:白白胖胖打一动物
难度系数:1颗星
出国留学网()之小知识;猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法:属于增损体的有加法、减法、加减法:属于离合体的有离底法、离面法:属于象形体的有象形法、象画法:属于谐音体的有直谐法、间谐法:属于综..
谜面:八字头(打一字)
谜底解析:"字"字加上一个倒"八"。
难度系数:4颗星
出国留学网()之小知识:猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法;属于增损体的有加法、减法、加减法;属于离合体的有离底法、离面法;属于象形体的有象形法、象画..
1. 一把11厘米长的尺子,可否只刻3个整数刻度,即可用于量出1到11厘米之间的任何整数厘米长的物品长度?如果可以,问应刻哪几个刻度?答案:可以刻度可位于2,7,8处.
2. 考试做判断题,小花掷骰子决定答案,但题目有20题,为什么他却扔了40次?答案:他要验证一遍
3. 一个挂钟敲六下要30秒,敲12下要几秒?答案:66秒
4. 什么时候4-3=5?答案:算错时
5. 王大婶有三个儿子,..
谜面:八兄弟同赏月打一字
难度系数:4颗星
出国留学网()之小知识:猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法;属于增损体的有加法、减法、加减法;属于离合体的有离底法、离面法;属于象形体的有象形法、象画法;属于谐音体的有直谐法、间谐法;属于..
谜面:八十八打一个字
谜底解析:将八十八组合成一个字。
难度系数:4颗星
出国留学网()之小知识:猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法;属于增损体的有加法、减法、加减法;属于离合体的有离底法、离面法;属于象形体的有象形法、象画法;属..
谜面:爱好旅游打一成语(猜四个字)
谜底:喜出望外
谜底解析:完全按照字面意思理解。
难度系数:4颗星
出国留学网()之小知识:猜谜方法的具体玩法.谜语的猜法多种多样,比较常见的有二十多种。属于会意体的有会意法、反射法、借扣法、侧扣法、分扣发、溯源法;属于增损体的有加法、减法、加减法;属于离合体的有离底法、离面法;属于象形体的..phpQuery—基于jQuery的PHP实现 很强大的采集器
phpQuery—基于jQuery的PHP实现 很强大的采集器
围观8697次
编辑日期: 字体:
红得发紫的jQuery框架是专门用于页面Javascript程序设计的,它通过一种优雅的方式让我们轻松自如地操作页面的所有元素而无须担心浏 览器版本以及兼容性等问题。受到jQuery的启发,一种试图让Web开发者在PHP中直接采用jQuery方式操纵和生成HTML/XML元素的 QueryPath计划开始了,库的发开者是 。
QueryPath可以很方便地读入和生成HTML/XML,使用jQuery类似的语法和函数遍历文档对象,支持远程URL文件的读取和分析。支 持标准的CSS3 Selector和XPath,这意味着我们可以使PHP像jQuery一样,随心所欲地玩转任何HTML!当然PHP5本身就带了不少DOM解析 库,QueryPath本身也是在这些库上的二次加工,省下了我们不少的工作量。
QueryPath官方网站:
QueryPath使用一个qp()工厂函数,为各种需求生成不同的类,一个最简单的例子如下:
require &#8216;QueryPath/QueryPath.php';
$html = qp(&#8216;a.html&#8217;);
$html-&find(&#8216;title&#8217;)-&text(&#8216;hello world&#8217;);
$html-&find(&#8216;.myInput&#8217;)-&attr(&#8216;value&#8217;, &#8216;hello world&#8217;);
$html-&find(&#8216;body&#8217;)-&css(&#8216;background-color&#8217;, &#8216;red&#8217;);
如果你对jQuery熟悉的话,几乎可以没有任何学习成本就能很快上 手。我立刻就使用QueryPath来写了几个测试例程,分析和遍历了一个常去的网站的内容结构,抓取了和分析了不少有用的资料。感觉对于那些做网站采集 程序的家伙们来说,QueryPath是不是又要让他们更加如鱼得水(抑或是无恶不作)了,LOL。
使用过程中发现QueryPath库尚处于基本的开发状态,不少问题。但对于程序员来说,遇到问题读一下库的源代码,基本上就能搞定。下面列出两个 常用问题的解决,与大家分享。
1.当QueryPath查询到一个节点并操作完成后,它本身并不回到根节点,而是停留在节点上,不知道这样描述正确否,这样导致的结果是下一步的 查询将很可能找不到数据。解决的方法是用top()函数回到根节点。如上面的例子可以直接这样用,用top回到根:
$html-&top()-&find(&#8216;.myInput&#8217;)-&attr(&#8216;value&#8217;, &#8216;hello world&#8217;);
支持的方法有top(), prev(), next(), child(),不用解释,很好理解。
2.无法读取远程url,或不能识别非&#8221;html&#8221;的扩展名的html文件。QueryPath直接分析文件和url的扩展名,不为&#8221;html&#8221;的直接当做xml处理,寒一个。解决的办法是用url的传递参数在最后面伪装一 个&#8221;.html&#8221;的参数,告诉QueryPath这是HTML文件。解决方法:
$qp(&#8216;http://www.acwind.net/index.php?=.html&#8217;);//伪装一个后缀名,搞定。
希望开发者能在将来的版本中改进,能自动识别文件类型那该多好。
PHP 也曾在 Web 开发领域造成轰动。由于易于开发和以 Web 为中心的模型,PHP 使 Web 站点从小小的主页变成像 Yahoo! 这样强大的站点。但是,通过 PHP 来使用这三种技术 — 尤其是 XML — 有时候会比较复杂。在本文中,了解 QueryPath,这是一个 PHP 库,它在设计时考虑了两个目标:
简单性,使 HTML、XML 和 HTTP 变得容易使用
健壮性,为使用这些技术提供丰富的工具
本文探索如何构建 QueryPath 对象、遍历 XML 和 HTML、操纵 XML 和 HTML 以及使用 QueryPath 访问 Web 服务(使用 Twitter 作为示例服务)。
剖析 QueryPath 链
对于 QueryPath 的典型使用,有四个最重要的概念:
QueryPath 对象与一个 XML 或 HTML 文档相关联。
QueryPath 可以查询文档,识别文档中的一组匹配项。
QueryPath 可以操纵文档。可以添加新的部分,修改已有的部分,删除不想要的部分。
QueryPath 方法可以链接在一起,在一个简洁的序列中执行很多操作。只需几行代码,就可以装载、解析、查询、修改和写入文档。
清单 1 中的代码展示了所有这些要点。
清单 1. 基本的 QueryPath 链
require &#8216;QueryPath/QueryPath.php';
qp(&#8216;sample.html&#8217;)-&find(&#8216;title&#8217;)-&text(&#8216;Hello World&#8217;)-&writeHTML();
以上例子需要一个库,即
QueryPath/QueryPath.php
。除非还要装载 QueryPath 扩展,否者只需包括这个库就可以使用 QueryPath。
PHP 对象语法
具有面向过程编程背景的 PHP 开发人员可能不熟悉 PHP 的面向对象语法。一个对象可能有一些附属的函数。这些函数称作方法(method) 。可以通过对象操作符 (-&)调用 对象的方法。
例子中接下来一行代码是一个 QueryPath 链,它做以下事情。
创建一个新的
对象,该对象指向 sample.html 文档。当
运行时,它将创建一个新的
对象,后者随即装载和解析文档。
方法,它使用 CSS 3 选择器
搜索整个文档,寻找所有
元素。在一个有效的 HTML 文档中,该搜索只能在文档的头部找到一个匹配的
标题的文本值被设为
Hello World
。当执行到这里时,标题的子节点将被 CDATA(字符数据)字符串
Hello World
替换。任何已有的内容将被破坏。
writeHTML()
方法将整个文档写到标准输出中。
以上例子实际上还可以缩短一点,因为
工厂函数带有一个 CSS 选择器作为可选的第二个参数。清单 2 显示了缩短后的版本。
清单 2. 基本的 QueryPath 链缩短后的版本
require &#8216;QueryPath/QueryPath.php';
qp(&#8216;sample.html&#8217;, &#8216;title&#8217;)-&text(&#8216;Hello World&#8217;)-&writeHTML();
sample.html
是一个最基本的 HTML 文档,以上代码( 或清单 2)的结果看上去将如清单 3 所示。加粗的行包含我们设置的标题。
清单 3. 生成的 HTML 的例子
&!DOCTYPE html PUBLIC &#8220;-//W3C//DTD HTML 4.01//EN&#8221;
&#8220;http://www.w3.org/TR/html4/strict.dtd&#8221;&
&html lang=&#8221;en&#8221;&
&title&Hello World&/title&
这些简单的例子展示了 QueryPath 可以执行的一些常见的任务。接下来几个小节探索一些方法。然后,您将把这些构建块装配起来,创建一个简单的 Web 服务客户机。
QueryPath 库中最常用的函数是
工厂函数。实际上,它执行创建新的 QueryPath 对象的任务。它被用于传统的构造函数。
如果您熟悉面向对象设计模式,那么可能会意识到
是工厂模式的一个变种。 QueryPath 不是用构造器方法定义一个工厂类,而是使用一个函数。这种方法除了可以节省键盘输入外(在链接方法时比较重要),还可以使 QueryPath 更贴近 jQuery,减少 jQuery 熟悉者的学习曲线。
对象与一个 XML 或 HTML 文档相关联。当构造
对象时,文档被绑定到该对象。
函数带有 3 个参数,这 3 个参数都是可选的:
一个文档可以是一个文件名或 URL、一个 XML 或 HTML 字符串、一个 DOMDocument 或 DOMElement、一个 SimpleXMLElement 或者一个 DOMElement 数组。如果不为该参数提供任何值,QueryPath 将创建一个空白的 XML 文档,供后面进行操纵。
一个 CSS3 选择器如果提供了该参数,在装载文档时,QueryPath 将使用给定的选择器查询那个文档。
一个关联的选项数组为这个特定 QueryPath 实例提供一种传递一组复杂配置参数的方法。API 参考详细列出了这里可以传递的选项。
XML 还是 HTML?
QueryPath 既可以处理 XML,也可以处理 HTML,但这两种格式有些区别。 QueryPath 试图自动检测所使用的格式,并作出相应的调整。XHTML(用 XML 实现的 HTML)被视作 XML。
支持将很多类型的数据作为第一个参数,从而方便构建 QueryPath 对象。QueryPath 可以以一个文件名或 URL 开始,然后装载一个文档。如果传递的是一个 XML 或 HTML 字符串,QueryPath 将解析该内容。当然,它可以接受另外两种常用的 XML 文档的对象表示:DOM 和 SimpleXML。清单 4 展示
函数如何解析包含 XML 的字符串。
清单 4. 从 XML 字符串构建 QueryPath 对象
require &#8216;QueryPath/QueryPath.php';
$xml = &#8216;&?xml version=&#&#8243;?&&doc&&item/&&/doc&';
= qp($xml);
当清单 4 中的代码运行时,
将引用一个
对象,该对象在内部指向 XML 解析后的表示。前面的例子传入的是一个文件名。如果 PHP 被配置为允许 HTTP/HTTPS 流包装器(在大多数 PHP V5 发行版中是标准配置),那么甚至可以装载远程 HTTP URL,如下所示。
清单 5. 从 URL 构建 QueryPath 对象
require &#8216;QueryPath/QueryPath.php';
$qp = qp(&#8216;/file.xml&#8217;);
这样便可以使用 QueryPath 访问 Web 服务。(可以使用第 3 个参数
传递流上下文,以便对连接设置进行调整)。当创建新文档时,有一个添加样板 HTML 的快捷方式,如下所示。
清单 6. 使用
QueryPath::HTML_STUB
require &#8216;QueryPath/QueryPath.php';
$qp = qp(QueryPath::HTML_STUB);
QueryPath::HTML_STUB
常量定义一个基本的 HTML 文档,如下所示。
QueryPath::HTML_STUB
&?xml version=&#&#8243;?&
&!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221;
&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#8221;&
&html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&
&meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/ charset=utf-8&#8243;/&
&title&Untitled&/title&
&body&&/body&
以这个框架文档为基础,可以更快地生成 HTML。
至此,您知道了如何创建新的指向文档的 QueryPath 对象,并且看到了一个简单的 CSS 选择器。下一小节讨论如何使用 QueryPath 遍历文档。
打开文档后,需要在文档中查找感兴趣的内容。QueryPath 的设计使得这一任务变得很容易。为了简化遍历需求,QueryPath 提供了一些用于遍历的方法。大多数方法使用 CSS3 选择器查找所需的节点。
图 1. 重要的 QueryPath 遍历方法
图 1 总结了常用的遍历函数。下面一一描述每个函数。虽然还有一些遍历函数没有提到,但这里覆盖了大多数常见的需求。
表 1. 常见遍历方法
方法 描述 是否带 CSS 选择器
选择与选择器匹配的任何元素(在当前选择的节点下)
选择与给定 XPath 查询匹配的元素
否(使用 XPath 查询)
选择文档元素(根元素)
选择任何祖先元素
选择直接父元素
siblings()
选择所有同胞(sibling)元素(包括之前和之后的元素)
选择后一个同胞元素
选择当前元素之后的所有同胞元素
选择前一个同胞元素
选择当前元素之前的所有同胞元素
children()
选择当前元素的直接子元素
选择当前元素下最深的节点
QueryPath 中的很多方法可以以查询作为参数,进一步指定应该选择什么项。如表 1 中第三列所示,几乎所有这些方法都带有一个作为可选参数的 CSS3 选择器。(
函数则带有一个 XPath 查询,而不是 CSS3 选择器)。只有
不使用查询作为参数。
可以通过另一个简单的例子了解如何进行遍历。假设有一个像下面这样的 XML 文档。
清单 8. 一个简单的 XML 文档
&?xml version=&#&#8243;?&
&child id=&#8221;one&#8221;/&
&child id=&#8221;two&#8221;/&
&child id=&#8221;three&#8221;/&
元素有 4 个子元素:其中有 3 个名为
,还有一个名为
。可以用一个 QueryPath 查询选择
的所有 4 个子元素。
清单 9. 选择所有子元素
require &#8216;QueryPath/QueryPath.php';
$xml = &#8216;&?xml version=&#&#8243;?&
&child id=&#8221;one&#8221;/&
&child id=&#8221;two&#8221;/&
&child id=&#8221;three&#8221;/&
$qp = qp($xml, &#8216;root&#8217;)-&children();
print $qp-&size();
children()
方法将选择
元素的所有直接子元素。最后一行打印
对象中匹配项的数量,最终打印的结果为
假设只需选择 3 个
元素,而不需要选择
元素。 清单 10 显示了如何实现这一点。
清单 10. 使用过滤器的查询
require &#8216;QueryPath/QueryPath.php';
$xml = &#8216;&?xml version=&#&#8243;?&
&child id=&#8221;one&#8221;/&
&child id=&#8221;two&#8221;/&
&child id=&#8221;three&#8221;/&
$qp = qp($xml, &#8216;root&#8217;)-&children(&#8216;child&#8217;);
print $qp-&size();
语句将打印 QueryPath 当前选择的项的数量。它将返回
。在内部,QueryPath 跟踪这 3 个元素。它们被存储为当前上下文。如果执行进一步的查询,那么查询将从这 3 个元素开始。如果试图附加数据,那么数据将被附加到这 3 个元素后。
CSS 选择器
CSS3 选择器将一些属性视作专用属性。
属性都有专用的选择器语法。与其他 XML 技术不同,XML DTD 或模式不需要将这些属性指定为专用属性。这些属性仍是由 CSS3 选择器引擎处理。
CSS 选择器是 CSS 语句的一部分,用于选择将应用某种样式的元素。CSS 选择器还可以在样式表上下文之外使用。QueryPath 使用选择器作为查询语言,并支持 CSS3 选择器
中描述的特性集。
CSS 选择器在 QueryPath 中扮演很重要的角色。您已经看到,有 10 个函数使用 CSS 选择器作为参数。到目前为止使用的选择器是简单的标记名查询。CSS3 选择器要比前面的例子强大得多。对 CSS3 选择器的详细描述超出了本文的范围,但表 2 提供了一些常见的选择器模式的例子。
表 2. 常见的 CSS3 选择器模式
选择器模式 描述 示例匹配项
找到标记名为
.container
属性被设为
属性被设为
的元素。基于 ID 的搜索以这种方式进行
&div id=&#8221;menu&#8221;/&
[type=&inline&]
属性的值为
&code type=&#8221;inline&#8221;/&
找到直接父元素为
&tr&&th/&&/tr&
找到祖先(例如父亲或祖父)中有
&table&&tr&&td/&&/tr&&/table&
获取第一个名为
的元素。支持的伪类包括
元素。 QueryPath 包括用于 XML 名称空间的 CSS3 选择器。名称空间支持延伸到属性和元素
这些常见的选择器模式可以加以组合,形成复杂的选择器,例如
div.content ul&li:first
。 这个选择器将搜索 class 为
中,它将搜索所有无序列表(
),返回每个列表的第一个列表项(
迭代匹配项
您了解了遍历文档的两个方面:QueryPath 提供的方法和 CSS3 选择器支持。第三个方面是迭代选择的项。
QueryPath 对象是可遍历的(traversable) 。在 PHP 中,这意味着对象可以当做迭代器。标准的 PHP 循环结构可以遍历 QueryPath 对象选择的元素。还记得吗, 中的例子是一个简单的查询,它从一个 XML 文档中检索 3 个元素。接下来的例子将以这个例子为基础。
如果要单独处理每个项,应该怎么办?很容易,因为 QueryPath 可以用作迭代器。清单 11 显示了一个例子。
清单 11. 迭代选择的元素
require &#8216;QueryPath/QueryPath.php';
$xml = &#8216;&?xml version=&#&#8243;?&
&child id=&#8221;one&#8221;/&
&child id=&#8221;two&#8221;/&
&child id=&#8221;three&#8221;/&
$qp = qp($xml, &#8216;root&#8217;)-&children(&#8216;child&#8217;);
foreach ($qp as $child) {
print $child-&attr(&#8216;id&#8217;) . PHP_EOL;
循环迭代时,它将每个匹配项赋给
变量。但是,
不是真正的元素,它是指向当前元素的一个
对象。您可以任意使用所有常见的 QueryPath 方法。
为了使 API 与 jQuery 的 API 类似, QueryPath 提供一些可同时作为 accessor 和 mutator — 或 getter 和 setter 的方法。取决于参数,同一个方法可以检索(access)数据,或者更改(mutate)数据。
函数就是一个例子。
qp()-&attr('name')
属性的值。
qp()-&attr('name', 'value')
属性的值设为
。还有一些方法,包括
,作为 accessor 和 mutator 同时执行两种任务。
由于每个迭代的项包装在一个 QueryPath 对象中,所以可以通过
任意使用所有标准的 QueryPath 方法。上面的例子使用了
函数,这是一个元素中的属性的 accessor 和 mutator。
方法检索名为
的属性的值。下面显示以上代码的输出。
清单 12. 清单 11 中迭代器例子的输出
您已经了解了如何使用 QueryPath 方法、CSS3 选择器和迭代技术遍历文档。下一节探索如何用 QueryPath 修改文档。
除了使用 QueryPath 搜索文档外,还可以使用它添加、修改和移除文档中的数据。在清单 1 中可以大致了解 QueryPath 的功能。为了方便,下面再重复一遍。
清单 13. 基本的 QueryPath 链
require &#8216;QueryPath/QueryPath.php';
qp(&#8216;sample.html&#8217;)-&find(&#8216;title&#8217;)-&text(&#8216;Hello World&#8217;)-&writeHTML();
在这个例子中,
函数用于修改
元素的内容。QueryPath 提供了十几个用于更改文档的方法。图 2 展示一些常用的修改方法如何工作。这些方法都是添加或替换数据。绿色的标记表示当前被选中的元素。
图 2. 用于添加或替换内容的 QueryPath 方法
每个方法以字符串数据(通常是以 HTML 或 XML 片段的形式)作为参数,并将数据插入到文档中。随后立即可以访问和进一步操纵新插入的数据。
使用 HTML 和 XML 片段
实际上有两类方法。第一类方法使用任意的 XML 片段,如下所示。
将数 据添加为当前选中元素的最后一个 子元素
将 数据添加为当前选中元素的第一个 子元素
将 数据直接插在当前选中元素之后
将数据直接插在当前选择的元素之前
替换 HTML 文档中当前元素的子内容
替换 XML 文档中当前元素的子内容
以上方法需要一个参数,该参数包含一个格式良好的 XML 或 HTML 数据的字符串。清单 14 有一个使用
方法的例子。
清单 14. 基本的 QueryPath 链
require &#8216;QueryPath/QueryPath.php';
qp($file)-&find(&#8216;div.content&#8217;)-&html(&#8216;&ul&&li&One&/li&&/ul&&#8217;);
中没有给出
方法(难以清楚地表示移除)。
方法移除文档中的元素。如果不带参数调用,该方法将移除当前选中的元素。但是,和很多其他的 QueryPath 方法一样,
可以使用一个 CSS3 选择器作为可选参数。如果提供了一个选择器,那么只移除与选择器匹配的项。
中的第二类方法则操纵元素中的属性。下面介绍两个这样的例子。
获取或设 置每个选中的元素上给定属性的值
addClass()
为当前选中的每 个元素添加一个类
还有其他一些与属性相关的方法。例如
removeClass()
方法,该方法以一个类名作为参数,它将移除元素中的一个类。
removeAttr()
以一个属性名作为参数,它将从所有当前选中的元素中移除具有该名称的属性。
现在可以将所有这些基本功能组合到一起,形成有趣的东西。
示例:用 QueryPath 搜索 Twitter
Twitter 是一个流行的微博客服务,通过它可以发布短消息,同时还可以跟随其他 Twitter 用户的微博客。 Twitter 提供了一个简单的 Web 服务,用于公布该平台的很多特性。
下面的例子使用 QueryPath 在 Twitter 服务器上执行搜索,并以 HTML 格式打印结果。可以将一个工具添加到已有的 Web 站点,以显示最近的关于一个感兴趣的话题的 Twitter 活动。
Twitter 的搜索服务器侦听一个标准的 HTTP 服务器,当被请求时,以 Atom XML 格式返回搜索结果。我们的例子将搜索最近 5 个提到 QueryPath 的贴子。为了运行这种搜索,并以 Atom 格式返回内容,只需在 URL 中编写必要的信息:
/search.atom ?rpp=5 &q=QueryPath
加粗的 3 个部分表示针对这个应用程序进行了调整的参数。
提供这个扩 展名是为了告诉服务器需要返回 Atom XML 内容
RPP 指定每页显示的结果数。我们想要返回 5 条结果。默认情况下,将返回 5 条最近的结果
q=QueryPath
这 是查询。Twitter 支持更复杂的搜索查询,但对于这个简单的例子只需要这样的查询。
当装载这个 URL 时,Twitter 将返回一个 Atom 格式的 XML 文档。下面的清单 15 显示一个经过大量简化的返回文档。这里只显示最关心的信息(只显示一个条目)。
清单 15. Twitter 搜索返回的 XML 的摘录
&?xml version=&#&#8243; encoding=&#8221;UTF-8&#8243;?&
&content type=&#8221;html&#8221;&
Last night I added XSD schema validation and XSL
Transformation (XSLT) support to &b&QueryPath&/b& (as
extensions). Will commit them today.
&/content&
&link type=&#8221;image/png&#8221; rel=&#8221;image&#8221; href=&#8221;/img.jpg&#8221;/&
&name&technosophos (M Butcher)&/name&
&uri&/technosophos&/uri&
清单 16 显示了执行搜索的简要的 QueryPath 代码,处理返回的 XML,并创建一个文档。
清单 16. 用 QueryPath 处理返回的 XML
require &#8216;QueryPath/QueryPath.php';
$url = &#8216;/search.atom?rpp=5&q=QueryPath';
$out = qp(QueryPath::HTML_STUB, &#8216;body&#8217;)-&append(&#8216;&ul/&&#8217;)-&find(&#8216;ul&#8217;);
foreach (qp($url, &#8216;entry&#8217;) as $result) {
$title = $result-&children(&#8216;content&#8217;)-&text();
$img = $result-&siblings(&#8216;link[rel=&#8221;image&#8221;]&#8217;)-&attr(&#8216;href&#8217;);
$author = $result-&parent()-&find(&#8216;author&name&#8217;)-&text();
$out-&append(&#8220;&li&&img src=&#8217;$img&#8217;/& &em&$author&/em&&br/&$title&/li&&#8221;);
$out-&writeHTML();
如果使用 Web 浏览器执行以上代码,可以看到图 3 所示的结果。
图 3. QueryPath 显示 Twitter 搜索结果
中的代码有 14 行,其中只有 9 行代码做实际的工作。以上代码是如何产生图 3 中的视图的呢?
变量存放前面提到的 Twitter URL。
变量指向用于将 HTML 写到客户机的 QueryPath 对象。 从一个基本的文档 (
QueryPath::HTML_STUB
)开始,添加一个无序列表,并(使用
) 选择这个新列表。
循环是脚本中最重要的一行:
foreach (qp($url, 'entry') as $result)
。这里创建 一个新的
对象。由于传递了一个 URL,QueryPath 将检索远程 Atom 文档,并解析结果。另外,由于传递了选择器
,QueryPath 将选择文档中的所有条目。回头查看一下
,看看这是文档中的哪个部分。返回的文档中将有 5 个条目(因为 URL 中这样设置了
标志)。这 5 个条目中的每个条目看上去都应该与清单 15 中的
循环获取了 3 个数据部分:
条目的内 容
发帖用户的头像的 URL
发 帖用户的用户名
为了获取每块数据,可以使用不同的 QueryPath 方法。例如,可以使用
$result-&children('content')-&text();
您看到了如何使用
设置文本( )。
中则使用该方法获取 信息。
函数将返回所有文本内容,但是不包括元素或其他节点类型。如果要获得所有内容,可以使用
,对于 HTML 文档,则可以使用
循环中首先选择标记名为
的所有子元素,然后从发现的节点中获得 CDATA 文本。每个条目将有一个
&content/&
现在需要获得图像 URL。在前面的链中,选择了
&content/&
元素,所以这就是起点。现在需要搜索
&content/&
的同胞,找到形如
&link rel=&image&/&
的元素。 为此,使用
siblings()
函数,并提供一个选择器作为参数。然后使用
函数获得元素的
属性的值。
元素跳回到它的父元素,接着使用
find('author&name')
, 获得作者的用户名。(请查看
)。在这里,可以使用
获得作者的用户名的文本。
循环的每次迭代的最后,构建一个 HTML 片段,并使用
将这个片段插入到
QueryPath 中。
迭代完从 Twitter 返回的结果后,可以在脚本的最后将 HTML 文档写到浏览器:
$out-&writeHTML();
这样就完成了。在大约十几行代码中,您完成了与一个远程服务的交互。可以通过这种方式,使用 QueryPath 访问任何使用 HTTP 和 XML 或 HTML 的 Web 服务。QueryPath 附带的例子展示了如何设置连接参数、对 SPARQL 端点执行 SPARQL 查询以及解析复杂的、多名称空间的文档。QueryPath 为使用 Web 服务带来巨大的潜力。
在本文中,您探索了 QueryPath 库的基础。您学习了如何创建
对象、遍历文档和操纵内容。您还构建了一个小型的例子脚本,该脚本使用流行的 Twitter 微博客服务的 Web 服务 API。
本文只是初步发掘 QueryPath 库的一些可能的应用。例如,本文只提到数据库 API,可使用该 API 将 RDBMS 支持集成到 QueryPath。想象一下,运行一个 SQL
语句,并将结果直接合并到一个符合自己的规范的 HTML 表格中。或者再想象一下,构建一个 XML 导入器,用于解析数据并将数据直接插入到数据库中。
QueryPath 还有一些特性这里没有提到。通过映射器和过滤器,可以让 QueryPath 运行定制的函数来转换或过滤 QueryPath 数据。通过
扩展,可以将数据插入到预定义的纯 HTML 模板中。QueryPath 还支持用户定义的扩展。通过编写一个简单的类定义,可以将自己的方法添加到 QueryPath 中。
本文固定链接:
转载请注明:
作者:admin
这个作者貌似有点懒,什么都没有留下。
您可能还会对这些文章感兴趣!}

我要回帖

更多关于 计算机二级考试java 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信