在上一篇 JQuery攻略(一) 基础知识——选择器 与 DOM 中,我写了js的使用,如何选择元素,和一些比较常用的函数及DOM操作。
在这篇中,我将建立多个列表,将更多的 自定义选择器,函数,DOM操作,对象,效果(后面会写)等手册,一一展现出来。让自己 也方便浏览者更好的查看。
更多,更详细的使用方法可去官网 http://api.jquery.com/查阅。
此章节有
2.1 自定义选择器
在Jquery中,基本的选择器有三种方式选取元素,
1.元素选择
$('P') --选择HTML文档中所有P元素标签
$('div') --选择HTML文档中所有div元素标签
2.id选择器
$('#A') --选择HTML文档中所有id=A的元素
3.class选择器
$('.color') --选择HTML文档中所有class=color的元素
利用上面三种基本选择器,有时选取的元素太多,我们需要更详细的筛选,那,自定义选择器就上场了。
例如:
$("[href!='#']") 选取所有带有 href 值不等于 "#" 的元素。
$("input[id=xx]") 选取id=xx 的input元素
$("input[name=xx]") 选取name=xx 的所有input元素
$("input[type=xx]") 选取type=xx 的所有input元素
$("[href$='.jpg']") 选取所有 href 值以 ".jpg" 结尾的元素。
$("p.intro") 选取所有 class="intro" 的 <p> 元素。
$("p#demo") 选取所有 id="demo" 的 <p> 元素。
$("ul li:first") 每个 <ul> 的第一个 <li> 元素
jQuery 选择器
选择器 | 实例 | 选取 |
---|---|---|
* 选择器 | $("*") | 所有元素 |
# 选择器 | $("#Element_id") | id="Element_id" 的元素 |
. 选择器 | $(".ClassName") | 所有 class="ClassName" 的元素 |
element 选择器 | $("p") | 所有 <p> 元素 |
.class.class | $(".ClassName1.ClassName2") | 所有 class="ClassName1" 且 class="ClassName2" 的元素 |
:first 选择器 | $("p:first") | 第一个 <p> 元素 |
:last 选择器 | $("p:last") | 最后一个 <p> 元素 |
:even 选择器 | $("tr:even") | 所有偶数 <tr> 元素 |
:odd 选择器 | $("tr:odd") | 所有奇数 <tr> 元素 |
:eq(index) 选择器 | $("ul li:eq(3)") | 列表中的第四个元素(index 从 0 开始) |
:gt(no) 选择器 | $("ul li:gt(3)") | 列出 index 大于 3 的元素 |
:lt(no) 选择器 | $("ul li:lt(3)") | 列出 index 小于 3 的元素 |
:not(selector) | $("input:not(:empty)") | 所有不为空的 input 元素 |
:header 选择器 | $(":header") | 所有标题元素 <h1> - <h6> |
:animated 选择器 | $(":animated") | 所有动画元素 |
:contains(text) 选择器 | $(":contains('string')") | 包含指定(string)字符串的所有元素 |
:empty 选择器 | $(":empty") | 无子(元素)节点的所有元素 |
:hidden | $("p:hidden") | 所有隐藏的 <p> 元素 |
:visible 选择器 | $("table:visible") | 所有可见的表格 |
s1,s2,s3 | $("th,td,.ClassName") | 所有带有匹配选择的元素 |
[attribute] 选择器 | $("[href]") | 所有带有 href 属性的元素 |
[attribute=value] 选择器 | $("[href='#']") | 所有 href 属性的值等于 "#" 的元素 |
[attribute!=value] 选择器 | $("[href!='#']") | 所有 href 属性的值不等于 "#" 的元素 |
[attribute$=value] 选择器 | $("[href$='.jpg']") | 所有 href 属性的值包含以 ".jpg" 结尾的元素 |
:input 选择器 | $(":input") | 所有 <input> 元素 |
:text 选择器 | $(":text") | 所有 type="text" 的 <input> 元素 |
:password 选择器 | $(":password") | 所有 type="password" 的 <input> 元素 |
:radio 选择器 | $(":radio") | 所有 type="radio" 的 <input> 元素 |
:checkbox 选择器 | $(":checkbox") | 所有 type="checkbox" 的 <input> 元素 |
:submit 选择器 | $(":submit") | 所有 type="submit" 的 <input> 元素 |
:reset 选择器 | $(":reset") | 所有 type="reset" 的 <input> 元素 |
:button 选择器 | $(":button") | 所有 type="button" 的 <input> 元素 |
:image 选择器 | $(":image") | 所有 type="image" 的 <input> 元素 |
:file 选择器 | $(":file") | 所有 type="file" 的 <input> 元素 |
:enabled 选择器 | $(":enabled") | 所有激活的 input 元素 |
:disabled 选择器 | $(":disabled") | 所有禁用的 input 元素 |
:selected 选择器 | $(":selected") | 所有被选取的 input 元素 |
:checked 选择器 | $(":checked") | 所有被选中的 input 元素 |
有些选择器的参数是可以是一个fucntion(){} :lt(no) :gt(no) :eq(index) 选择器 具体例子可看另一位博友写的 自定义选择器 。
2.2 HTML DOM 函数
在上一篇的 1.7 对DOM节点的操作 中,有写到一些多DOM节点的操作函数,下面我将他们整理成列表的形式以便查阅(部分遗漏的会补上,例子有可能更改)
这些方法对于 XML 文档和 HTML 文档均是适用的,除了一个函数之外:html()。
方法 | 实例 | 描述 |
---|---|---|
addClass() | $("p").addClass("className"); | 向匹配的所有p元素添加指定的类名。 |
after() | $("p").after("<p> Hello world!</p> "); | 在匹配的所有p元素之后插入内容<p>Hello world!</p>,同等级没有嵌套关系,与before()函数对应。 |
append() | $("p").append("<b>Hello world!</b>"); | 向匹配p元素集合中的每个元素结尾插入由参数指定的内容,会嵌套在内部<p><b>Hello world!</b></p> |
appendTo() | $("<b>Hello world!</b>").appendTo("p"); | 向目标结尾插入匹配元素集合中的每个元素。会嵌套在内部,与append只是语法不一样。 |
attr() | $("#Elemet_id").attr('property'); $("#Elemet_id").attr('property','value'); $("#Elemet_id").attr({'property1': 'value1', 'property2': 'value2'}); //设置多个属性 |
设置或返回匹配元素的属性和值。 //获取属性 var width = $("img").attr("width"); //设置属性 $("img").attr("width","180"); |
before() | $("p").before("<p>Hello world!</p>"); | 在匹配的所有p元素之前插入内容。同等级 |
clone() | $("p").clone().prependTo("p"); | 创建匹配元素集合的副本。克隆一个p元素,将他插入到p元素下成为他的下一级。 |
detach() | $("p").detach(); | 从 DOM 中移除匹配元素集合,包括所有文本和子节点,detach() 会保留所有绑定的事件、附加的数据,这一点与 remove() 不同。 |
empty() | $("div").empty(); | 删除匹配的元素集合中所有的子节点。包括所有文本和子节点。 |
hasClass() | $("p").hasClass("ClassName"); | 检查被选元素是否包含指定的 class。 |
html() | $("#div").html();//取值 $("#div").html("This is a div");//赋值 |
设置或返回匹配的元素集合中的 HTML 内容。如果该方法未设置参数,则返回被选元素的当前内容。 |
insertAfter() | $("<span>Hello world!</span>").insertAfter("p"); | 把匹配的元素插入到另一个指定的元素集合的后面。与insertBefore()函数对应。同等级不包含 |
insertBefore() | $("<span>Hello world!</span>").insertBefore("#5"); | 把匹配的元素插入到另一个指定的元素集合的前面。同等级不包含。 |
prepend() | $("p").prepend('<h2>插入元素h2</h2>'); | 向匹配元素集合中的每个元素开头插入由参数指定的内容。插入的元素为<p>的下级 |
prependTo() | $('<h2>插入元素h2</h2>').prependTo("p"); | 向目标开头插入匹配元素集合中的每个元素。插入的元素为<p>的下级 |
remove() | $("p").remove(); | 移除所有匹配的元素,包括所有文本和子节点。 |
removeAttr() | $("p").removeAttr("id"); | 从所有匹配的元素中移除指定的属性,从任何 p 元素中移除 id 属性。 |
removeClass() | $("div").removeClass("ClassName"); | 从所有匹配的元素中删除全部或者指定的类。 |
replaceAll() | $("<div>我也变成div了!</div>").replaceAll("#P2"); | 用匹配的元素替换所有匹配到的元素。 |
replaceWith() | $("#P1").replaceWith("<div>变成div了!</div>"); | 用新内容替换匹配的元素,replaceAll() 与 replaceWith() 作用相同。差异在于语法:内容和选择器的位置,以及 replaceWith()能够使用函数进行替换。 |
text() | $("p").text();//获取 $("p").text("Hello <b>world</b>!"); //设置 | 设置或返回匹配元素的内容。 |
toggleClass() | $("p").toggleClass("className"); | 从匹配的元素中添加或删除一个类。切换被选元素的class. |
unwrap() | $("p").unwrap(); | 移除并替换指定元素的父元素,跳出父节点的包裹。 |
val() | $("#input").val(); //取文本框的值 $("#input").val("change input value"); //为文本框赋值 |
设置或返回匹配元素的值。 |
wrap() | $("p").wrap("<div></div>"); | 把匹配的元素用指定的内容或元素包裹起来,单个<p>元素<div>包裹起来。有多少个p,就有多少个div |
wrapAll() | $("p").wrapAll("<div></div>"); | 把所有匹配的元素用指定的内容或元素包裹起来,将所有匹配的<p>元素用一个<div>包裹起来。不管有多少个p,就只有一个div |
wrapinner() | $("p").wrapInner("<b>加粗</b>"); | 将每一个匹配的元素的子内容用指定的内容或元素包裹起来,将匹配元素的内容用指定的参数包裹起来,包括子节点,和内容。 |
2.3 CSS DOM 函数
下面列出一些方法设置或返回元素的 CSS 相关属性。
CSS 属性 | 实例 | 描述 |
---|---|---|
css() | $("p").css("color"); //取值返回rgb $("p").css("color","red");//设置 $("p").css({ "color":"white", "font-size":"20px", "padding":"5px" });//多值设置 |
返回或设置匹配的元素的一个或多个样式属性。 |
height() | $("p").height();//取值 $("p").height(50);//设置 |
返回或设置匹配元素的高度。 |
offset() | var position = $("p").offset(); var left = position.left; var top = position.top; | 返回或设置匹配元素相对于文档的偏移(位置)。 |
offsetParent() | $("p").offsetParent() | 返回最近的父级定位元素。定位元素指的是元素的 CSS position 属性被设置为 relative、absolute 或 fixed 的元素。 可以通过 jQuery设置 position,或者通过 CSS 的 position 属性。 |
position() | var x=$("p").position(); var left = x.left; var top = x.top; | 返回匹配元素相对于父元素的位置(偏移)。 |
scrollLeft() | $("div").scrollLeft(); | 设置或返回匹配元素相对滚动条左侧的偏移。滚动条的水平位置指的是从其左侧滚动过的像素数。当滚动条位于最左侧时,位置是 0。 |
scrollTop() | $("div").scrollLeft(); | 返回或设置匹配元素的滚动条的垂直位置。如果该方法未设置参数,则返回以像素计的相对滚动条顶部的偏移。 |
width() | $("p").width(); | 返回或设置匹配元素的宽度。 |
2.4 jQuery 遍历函数
jQuery 遍历函数
函数 | 实例 | 描述 |
---|---|---|
.add() | .add(selector) $("div").css("border", "2px solid red").add("p") |
将元素添加到匹配元素的集合中。(五种使用方法) |
.andSelf() | $("p").andSelf().nextAll().css("background-color", "red"); | 把堆栈中之前的元素集添加到当前集合中。(包括了自己) |
.children() | $("div").children(); | 返回匹配元素集合中每个元素的子元素,添加可选参数可通过选择器进行过滤。(只向下匹配一层) |
.closest() | $("p").closest("div").addClass("hilight ") // 从p元素往上遍历,遇到的第一个div,返回集合,包括了div所有子级 |
从元素本身开始,逐级向上级元素匹配,并返回最先匹配的父级元素。 .parents() 和 .closest() 方法类似,它们都沿 DOM 树向上遍历。 前者是沿 DOM 树向上遍历,直到文档的根元素为止,将每个祖先元素添加到一个临时的集合;如果应用了选择器,则会基于该选择器对这个集合进行筛选。 后者是沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止。 |
.contents() | $("p").contents(); | 获得匹配元素集合中每个元素的子节点,包括文本和注释节点。 |
.each() | $("p").each(function(index,element){......}); | 对 jQuery 对象进行迭代,为每个匹配元素执行函数。 |
.end() | $("p").find("span").end().css("border", "2px red solid"); // 选择所有p元素,找到这些p元素中的 span 元素,然后将它们恢复为p元素,并把段落设置为两像素的红色边框: |
结束当前链中最近的一次筛选操作,并将匹配元素集合返回到前一次的状态。 |
.eq() | $("div").eq(2); // 第三个,从零开始 | 将匹配元素集合缩减为位于指定索引的新元素。 |
.filter() | $("div").filter(".middle") 匹配所有div,class = middle 的所有元素 |
将匹配元素集合缩减为匹配选择器或匹配函数返回值的新元素。 |
.find() | $("p").find("span"); // 匹配所有p元素中的span元素 |
获得当前元素集合中每个元素的后代,通过选择器、jQuery 对象或元素来筛选。(可指定范围) |
.first() | $("p span").first(); // 与last()相对应 |
将匹配元素集合缩减为集合中的第一个元素。 |
.has() | $("div").has("a"); // 匹配所以div元素中带有a元素的集合 |
将匹配元素集合缩减为包含特定元素的后代的集合。 |
.is() | $("p").parent().is("div"); // p元素的父级是div |
根据选择器检查当前匹配元素集合,如果存在至少一个匹配元素,则返回 true。 |
.last() | $("p span").last(); // 与first()相对应 |
将匹配元素集合缩减为集合中的最后一个元素。 |
.map() | $("input").map(function(){ alert ($(this).val());}) // 相当与遍历 input集合列表,将它们的值一个个弹出 |
把当前匹配集合中的每个元素传递给函数,产生包含返回值的新 jQuery 对象。 |
.next() | $("#div").next("p"); // 返回id=div元素最临近的一个p元素 // 如next()没有参数的话,返回的是与id=div相同的下一个元素 |
获得匹配元素集合中每个元素紧邻的同辈元素。(只一个元素,方向向下与.prev()相反) |
.nextAll() | $("#div").nextAll("p"); // 返回id=div元素最临近的所有p元素 (向下) // 如next()没有参数的话,返回的是id=“div”元素以下的所有元素 |
获得匹配元素集合中每个元素之后的所有同辈元素,由选择器进行筛选(可选)。(同级,向下,不包括自己) |
.nextUntil() | $("#1").nextUntil("#11"); // 如果序号连续的话,这里选中的元素个数将是 9 个;并不包括 1 和 11 本身 |
获得每个元素之后所有的同辈元素,直到遇到匹配选择器的元素为止。(向下,不包括自己,与 prevUntil()相对) |
.not() | $("p").not("#id1"); // 反选择,匹配了id=id1 除外的所有 p元素 |
从匹配元素集合中删除元素。 |
.offsetParent() | $("p").offsetParent(); // p元素第一个有position:absolute 或者 relative 的父级 |
获得用于定位的第一个父元素。 |
.parent() | $("p").parent(); // 与children()函数一样,只有匹配一层。向上。 |
获得当前匹配元素集合中每个元素的父元素,由选择器筛选(可选)。 |
.parents() | $("p").parents() // p元素的所有父级 |
获得当前匹配元素集合中每个元素的祖先元素,由选择器筛选(可选)。 |
.parentsUntil() | $("#11").parentsUntil("#1"); // 假如 #11到#1连续嵌套,那么,这里会选到10个元素,包括#11,但不包括#1 |
获得当前匹配元素集合中每个元素的祖先元素,直到遇到匹配选择器的元素为止。 |
.prev() | $("#div").prev("p"); // 返回id=div元素最临近的一个p元素 // 如next()没有参数的话,返回的是与id=div相同的上一个元素 |
获得匹配元素集合中每个元素紧邻的前一个同辈元素,由选择器筛选(可选)。(只一个元素,方向向上与.next()相反) |
.prevAll() | $("#div").prevAll("p"); // 返回id=div元素最临近的所有p元素(向上) // 如 prevAll()没有参数的话,返回的是id=“div”元素以上的所有元素 |
获得匹配元素集合中每个元素之前的所有同辈元素,由选择器进行筛选(可选)。(同级,向上,不包括自己) |
.prevUntil() | $("#11").prevUntil("#1"); // 如果序号连续的话,这里选中的元素个数将是 9 个;并不包括 1 和 11 本身 |
获得每个元素之前所有的同辈元素,直到遇到匹配选择器的元素为止。(向上,不包括自己,与nextUntil()相对) |
.siblings() | $("p").siblings(); // 选择所有与p元素同级元素,不分元素类型 |
获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的。(不分元素类型) |
.slice() | $("p").slice(0, 5); // 0是开始下标,选取5个 如果有嵌套,嵌套也算 // <p>1<2><3><4><5></p></p></p></p></p><p>6</p>只会选到5 |
把匹配元素集合缩减为指定的指数范围的子集。 |
2.5 String 对象
string 属性
属性 | 描述 | 实例说明 |
---|---|---|
constructor | 对创建该对象的函数的引用 | object.constructor |
length | 可返回字符串中的字符数目 | stringObject.length "Hello World!".length |
prototype | 向对象添加属性和方法 | object.prototype.name=value/function |
string 方法
方法 | 描述 | 实例 |
---|---|---|
anchor() | 创建 HTML 锚。 | txt.anchor("txt"); |
big() | 用大号字体显示字符串。 | txt.big(); |
blink() | 显示闪动字符串。 | |
bold() | 使用粗体显示字符串。 | |
charAt() | 返回在指定位置的字符。 | |
charCodeAt() | 返回在指定的位置的字符的 Unicode 编码。 | |
concat() | 连接字符串。 | stringObject.concat(stringX,stringX,...,stringX) |
fixed() | 以打字机文本显示字符串。 | stringObject.fixed() |
fontcolor() | 使用指定的颜色来显示字符串。 | stringObject.fontcolor(color) |
fontsize() | 使用指定的尺寸来显示字符串。size 1-7 | stringObject.fontsize(size) |
fromCharCode() | 从字符编码创建一个字符串。 | String.fromCharCode(numX,numX,...,numX) |
indexOf() | 检索字符串。一次 | stringObject.indexOf(searchvalue,fromindex) |
italics() | 使用斜体显示字符串。 | stringObject.italics() |
lastIndexOf() | 从后向前搜索字符串。searchvalue 搜索字段,startindex开始下标,0为开始下标 | stringObject.lastIndexOf(searchvalue,startindex) |
link() | 将字符串显示为链接。 | stringObject.link("url") |
localeCompare() | 用本地特定的顺序来比较两个字符串。返回值 -1,0,1 | stringObject.localeCompare(target) |
match() | 找到一个或多个正则表达式的匹配。返回值匹配到的数组 | stringObject.match(searchvalue) stringObject.match(regexp) |
replace() | 替换与正则表达式匹配的子串。返回一个新的字符串 | stringObject.replace(regexp/substr,replacement) |
search() | 检索与正则表达式相匹配的值。返回一个新的字符串 | stringObject.search(regexp) |
slice() | 提取字符串的片断,并在新的字符串中返回被提取的部分。 | stringObject.slice(start,end) |
small() | 使用小字号来显示字符串。 | stringObject.small() |
split() | 把字符串分割为字符串数组。 | stringObject.split(string/char/RegExp,howmany) |
strike() | 使用删除线来显示字符串。 | stringObject.strike() |
sub() | 把字符串显示为下标。 | stringObject.sub() |
substr() | 从起始索引号提取字符串中指定数目的字符。 | stringObject.substr(start,length) |
substring() | 提取字符串中两个指定的索引号之间的字符。 | stringObject.substring(start,stop) |
sup() | 把字符串显示为上标。 | stringObject.sup() |
toLocaleString() | 方法可把一个对象转换为本地格式的字符串。 | array.toLocaleString() 、 date.toLocaleString() 、 Number.toLocaleString() |
toLocaleLowerCase() | 把字符串转换为小写。 | stringObject.toLocaleLowerCase()(根据本地语言) |
toLocaleUpperCase() | 把字符串转换为大写。(根据本地语言) | stringObject.toLocaleUpperCase() |
toLowerCase() | 把字符串转换为小写。 | stringObject.toLowerCase() |
toUpperCase() | 把字符串转换为大写。 | stringObject.toUpperCase() |
toSource() | 代表对象的源代码。 | object.toSource() |
toString() | 返回字符串。 | array.toString() 、 boolean.toString() 、 date.toString()、 Number.toString() |
valueOf() | 返回某个字符串对象的原始值。 | stringObject.valueOf() |
一段代码
var txt = "Hello World!"; document.write("<p>anchor: " + txt.anchor("txt") + "</p>"); //生成--><a> name="txt">Hello World!</a> document.write("<p>Big: " + txt.big() + "</p>"); //生成--><big>Hello world!</big> document.write("<p>Blink: " + txt.blink() + " (好像没啥效果)</p>"); //生成--><blink>Hello World!</blink> document.write("<p>Bold: " + txt.bold() + "</p>"); //生成--><b>Hello World!</b> document.write("<p>charAt: " + txt.charAt(1) + " </p>"); ; //下标从0开始 e 返回值string document.write("<p>charCodeAt: " + txt.charCodeAt(1) + " </p>"); //下标从0开始 101(e)参数是-1或者没找到得到的是 NaN 返回值int document.write("<p>Fixed: " + txt.fixed() + "</p>"); //生成--><tt>Hello World!</tt> document.write("<p>Fontcolor: " + txt.fontcolor("Red") + "</p>"); //生成--><font color="Red">Hello World!</font> document.write("<p>Fontsize: " + txt.fontsize(16) + "</p>"); //生成--><font size="16">Hello World!</font> document.write("<p>Small: " + txt.small() + "</p>"); //生成--><small>Hello World!</small> document.write("<p>Italic: " + txt.italics() + "</p>"); //生成--><i>Hello World!</i> document.write("<p>Strike: " + txt.strike() + "</p>"); //生成--><strike>Hello World!</strike> document.write("<p>Lowercase: " + txt.toLowerCase() + "</p>"); //生成-->hello world! document.write("<p>Uppercase: " + txt.toUpperCase() + "</p>"); //生成-->HELLO WORLD! document.write("<p>Subscript: " + txt.sub() + "</p>"); //生成--><sub>Hello World!</sub> document.write("<p>Superscript: " + txt.sup() + "</p>"); //生成--><sup>Hello World!</sup> document.write("<p>Link: " + txt.link("http://www.cnblogs.com") + "</p>"); //生成--><a href="http://www.cnblogs.com">Hello World!</a>
2.6 RegExp 对象
RegExp 对象完成对正则表达式的封装,它是对字符串执行模式匹配的强大工具。
语法:new RegExp(stringpattern, parameter);
参数 stringpattern 是一个字符串正则表达式
参数 parameter 可选,i(大小写忽略),g(全局匹配),m(多行匹配)指定匹配范围
返回值 一个新的 RegExp对象,
范围标识
范围修饰符 | 描述 | 实例 |
---|---|---|
i | 忽略大小写敏感匹配。 | new RegExp("regexp","i") |
g | 全局匹配(匹配所有匹配而非在找到第一个匹配后停止)。 | new RegExp("regexp","g") |
m | 执行多行匹配。 | new RegExp("regexp","m") |
范围匹配
表达式 | 描述 |
---|---|
[abc] | 匹配方括号中abc的任何字符。 |
[^abc] | 匹配任何不是abc的字符。 |
[0-9] | 匹配任何从 0 至 9 的数字。 |
[a-z] | 匹配任何从小写 a 到小写 z 的字符。 |
[A-Z] | 匹配任何从大写 A 到大写 Z 的字符。 |
[A-z] | 匹配任何从大写 A 到小写 z 的字符。 |
[adgk] | 匹配给定集合内的任何字符。 |
[^adgk] | 匹配给定集合外的任何字符。 |
(red|blue|green) | 匹配任何指定的选项。 |
元字符匹配
元字符 | 描述 |
---|---|
. | 匹配单个字符,匹配除换行符以外的任意字符。 |
w | 匹配字母或数字或下划线或汉字。 |
W | 匹配非单词字符。 |
d | 匹配数字。 |
D | 匹配非数字字符。 |
s | 匹配空白字符。 |
S | 匹配非空白字符。 |
匹配单词边界。 | |
B | 匹配非单词边界。 |