JQuery 部分常用方法速查

2010-04-15 14:25:02 by 【6yang】, 260 visits, 收藏 | 返回
分类 名称 举例说明 返回
基础 $() 如果()内是
  • css选择器:找到相应的节点包装成JQuery对象
  • DOM对象:直接包装成JQuery对象
  • 一段HTML代码:先创建DOM对象,再包装成JQuery对象
    如:$("<div></div>").appendTo($(obj))
jQuery
选择器 parent > child 取得<div>下的所有<span>子节点
$("div > span")
Array
<Element(s)>
:first 选取所有<div>元素中第一个<div>元素
$("div:first")
jQuery
:last 选取所有<div>元素中最后一个<div>元素
$("div:last")
jQuery
:not(Selector) 选取所有class不是mytest的<div>元素
$("div:not(.mytest)")
Array
<Element(s)>
:even 查找表格的偶数行,从0开始计数
$("tr:even")
Array
<Element(s)>
:odd 查找表格的奇数行,从0开始计数
$("tr:odd")
Array
<Element(s)>
:eq(index) 匹配一个给定索引值的元素,从0开始计数
$("tr:eq(1)")
Array
<Element>
:gt(index) 匹配所有大于给定索引值的元素,从0开始计数
$("tr:gt(0)")
Array
<Element(s)>
:lt(index) 匹配所有小于给定索引值的元素,从0开始计数
$("tr:lt(2)")
Array
<Element(s)>
:animated 选取当前正在执行动画的所有元素
$(":animated")
Array
<Element(s)>
:contains(string) 选取所有文本内容包含“关键词”的<div>元素
$("div:contains('关键词')")
Array
<Element(s)>
:has 查找所有含有<p>子元素的<div>父元素
$("div:has(p)")
Array
<Element(s)>
:empty 选取所有空<div></div>的元素
$("div:empty")
Array
<Element(s)>
:visible 查找所有可见元素
$("tr:visible")
Array
<Element(s)>
[attribute = value] 选取文本输入框的input元素
$("input[type=text]")
Array
<Element(s)>
[attribute != value] 选取所有不是hidden的input元素,注意,没有type属性的input也会被选取
$("input[type!=hidden]")
Array
<Element(s)>
[attribute ^= value] 选取开头为mailto:的所有a链接
$("a[href^='mailto']")
Array
<Element(s)>
[attribute $= value] 选取所有结尾为.jpg的img图片
$("img[src$='.jpg']")
Array
<Element(s)>
表单选择器 :input 查找所有的input元素(包括input, textarea, select和button)
$(":input")
Array
<Element(s)>
:password 查找所有密码框
$(":password")
Array
<Element(s)>
:text 查找所有单行文本框
$(":text")
Array
<Element(s)>
:radio 查找所有单选按钮
$(":radio")
Array
<Element(s)>
:checkbox 查找所有复选框
$(":checkbox")
Array
<Element(s)>
:checked 查找所有选中的checkbox, radio
$("input:checked")
Array
<Element(s)>
:selected 查找所有选中的选项元素
$("select:selected")
Array
<Element(s)>
属性 attr(key)
取得一个属性的值
attr(key,value)
设置一个属性的值
HTML:
<img src="test.jpg"/>
jQuery:
$("img").attr("src");
Result:
test.jpg
jQuery
removeAttr(key)
删除一个属性
HTML:
<img src="test.jpg"/>
jQuery:
$("img").removeAttr("src");
Result:
[ <img /> ]
jQuery
addClass(class)
追加指定的类名
HTML:
<p>Hello</p>
jQuery:
$("p").addClass("selected highlight");
Result:
[ <p class="selected highlight">Hello</p> ] 如果要替换样式,用attr()
jQuery
removeClass()
移除样式

Html:
<p class="red">你最喜欢的是?</p>
JQuery:
$("p").removeClass("red");
Result:
<p >你最喜欢的是?</p>

可以同时移除多个样式:
$("p").removeClass("red bold");

或者全部移除样式:
$("p").removeClass();

jQuery
toggleClass()
如果节点存在该样式,则移除,不存在,则追加
$("p").toggleClass("blue"); jQuery
hasClass(class)
判断节点是否存在该样式,返回布尔值
$("p").hasClass("blue"); 该方法等价于:$("p").is(".blue"); jQuery
html()
取得或设置文本内容
类似innerHTML()
仅可用于html文档 String/
jQuery
text()
取得或设置文本内容
类似innerText()
可以用于html和xml文档 String/
jQuery
val()
取得或设置input文本框的值

Html
<input type="text" id="searchbox" value="搜索的内容…" />
JQuery:
$("searchbox").focus(function(){
if(this.val()=="搜索的内容…"){this.val("")}
});
$("searchbox").blur(function(){
if(this.val()==""){this.val(this.defaultValue)}
});
this.defaultValue 表示input文本框的默认value

通过val()还能做到将表单多选框,checkbox,radio事先选中:
$(":checkbox").val(["check2","check3"]);
$(":radio").val(["radio2"]);

String/
Array
节点匹配 each(callback)
为每一个匹配的元素执行一个函数

迭代两个图像,并设置它们的 src 属性
注意此处 this 指代的是 DOM 对象而非 jQuery 对象

HTML:
<img/><img/>
jQuery:
$("img").each(function(i){
this.src = "test" + i + ".jpg";
});
Result:
[ <img src="test0.jpg" />, <img src="test1.jpg" /> ]

jQuery
size()/length
获取对象中元素的个数
$("img").size();
$("img").length;
Number
index([subject])
匹配的元素,并返回相应元素的索引值,从0开始计数
HTML:
<ul>
<li id="foo">foo</li>
<li id="bar">bar</li>
<li id="baz">baz</li>
</ul>
jQuery:
$('li').index($('#bar')); //1
$('li').index($('li:gt(0)')); //1
$('#bar').index('li'); //1
$('#bar').index(); //1
Number
get()
以数组形式取得所有匹配的节点集合
get(index)
index存在则从中选择某一个DOM节点
HTML:
<img src="test1.jpg"/>
<img src="test2.jpg"/>
jQuery:
$("img").get(0);
Reslut:
[ <img src="test1.jpg"/> ]
Array
<Element>
Element
eq(index)
以对象形式获取第index个元素,位置从0算起

获取匹配的第二个元素

HTML:
<p> This is just a test.</p>
<p> So is this</p>
jQuery:
$("p").eq(1)
Result:
[ <p> So is this</p> ]

补充 .get(index)和.eq(index)的区别
.get(index)返回的是一个html数组
.eq(index)返回的是一个Jquery对象

$("ul li").get(1).css("color", "red");
//这个是错误的
$("ul li").eq(1).css("color", "red");
//这个是正确的 同理将JQuery对象转换为DOM对象可以使用get
alert一个非JQuery对象,如:
var $cr = $("#cr");
var cr = $cr.get(0);
alert(cr.checked);

jQuery
first()
获取匹配的第一个元素
$('li').first() 等价于 $('li:first') jQuery
last()
获取匹配的最后一个元素
$('li').last() 等价于 $('li:last') jQuery
filter(fn)
筛选出与指定函数返回值匹配的元素集合

保留子元素中不含有ol的元素。

HTML:
<p><ol><li>Hello</li></ol></p><p>How are you?</p>
jQuery:
$("p").filter(function(index) {
return $("ol", this).length == 0;
});
Result:
[ <p>How are you?</p> ]

jQuery
has(expr)
保留包含特定后代的元素,去掉那些不含有指定后代的元素
HTML:
<ul>
<li>list item 1</li>
<li>list item 2
<ul>
<li>list item 2-a</li>
<li>list item 2-b</li>
</ul>
</li>
<li>list item 3</li>
<li>list item 4</li>
</ul>
jQuery:
$('li').has('ul').css('background-color', 'red');
jQuery
not(expr)
删除与指定表达式匹配的元素

从p元素中删除带有 select 的ID的元素

HTML:
<p>Hello</p><p id="selected">Hello Again</p>
jQuery:
$("p").not( $("#selected")[0] )
Result:
[ <p>Hello</p> ]

jQuery
find(expr)
搜索所有与指定表达式匹配的元素

从所有的段落开始,进一步搜索下面的span元素。与$("p span")相同。

HTML:
<p><span>Hello</span>, how are you?</p>
jQuery:
$("p").find("span")
Result:
[ <span>Hello</span> ]

jQuery
next([expr])
取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合

找到每个段落的后面紧邻的同辈元素。
HTML:
<p>Hello</p><p>Hello Again</p>
<div><span>And Again</span></div>
jQuery:
$("p").next()
Result:
[ <p>Hello Again</p>,
<div><span>And Again</span></div> ]

找到每个段落的后面紧邻的同辈元素中类名为selected的元素。
HTML:
<p>Hello</p>
<p class="selected">Hello Again</p>
<div><span>And Again</span></div>
jQuery:
$("p").next(".selected")
Result:
[ <p class="selected">Hello Again</p> ]

jQuery
prev([expr])
前面的同辈元素
同上 jQuery
children([expr])
子元素集合
同上 jQuery
parent([expr])
父元素集合
同上 jQuery
siblings([expr])
符合条件的所有同辈元素的元素集合

找到每个div的所有同辈元素。

HTML:
<p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
jQuery:
$("div").siblings()
Result:
[ <p>Hello</p>, <p>And Again</p> ]

jQuery
is(expr)
如果元素集合中有一个元素符合表达式,返回true
Html:
<form><input type="checkbox" /></form>
JQuery:
$("input[type='checkbox']").parent().is("form")
Result
true

判断元素是否处于动画状态
if(!$(element).is(":animated")){…}
Boolean
end()
回到最近的一个"破坏性"操作之前。即,将匹配的元素列表变为前一次的状态

所谓的"破坏性"就是指任何改变所匹配的jQuery元素的操作。
如:add, andSelf, children, filter, find, map, next, nextAll, not, parent, parents, prev, prevAll, siblings, slice, clone。

选取所有的p元素,查找并选取span子元素,然后再回过来选取p元素

HTML:
<p><span>Hello</span>,how are you?</p>
jQuery:
$("p").find("span").end()
Result:
[ <p><span>Hello</span> how are you?</p> ]

jQuery
文本处理 append()
$(A).append(B) 将B的内容追加到A元素内
Html:
<p>我想说:</p>
JQuery:
$("p").append("<b>你好</b>");
Result:
<p>我想说:<b>你好</b></p>
jQuery
appendTo()
$(A).appendTo(B) 将A的内容追加到B元素内
Html:
<p>我想说:</p>
JQuery:
$("<b>你好</b>").appendTo("p");
Result:
<p>我想说:<b>你好</b></p>
jQuery
replaceWith()
$(A).replaceWith(B) 将B的内容替换到A节点
Html:
<p>你最喜欢的是?</p>
JQuery:
$("p").replaceWith("<b>你最不喜欢的是?</b>");
jQuery
replaceAll()
$(A).replaceAll(B) 将A的内容替换到B节点
Html:
<p>你最喜欢的是?</p>
JQuery:
$("<b>你最不喜欢的是?</b>").replaceAll("p");
jQuery
remove()
移出节点
JQuery:
$("ul li:eq(1)").remove();
$("ul li").remove("li[title!=菠萝]");
jQuery
empty()
清空节点
JQuery:
$("ul li:eq(1)").empty();
该节点里的文本内容和子节点将全部清空
jQuery
css css(name,value)
取得一个元素的css值或设定一个元素的css值
$("p").css("color","#cc0000");
和attr方法一样,可以同时赋值多个css属性
$("p").css({"color":"#cc0000","font-size":"14px"});
jQuery
offset()
取得元素在当前窗口中的定位值,返回两个属性left,top
var offset = $("p").offset();
var left = offset.left;
var top = offset.top;
Object
{top,left}
position()
取得元素相对于最近一个
position为relative
或position为absolute的父节点定位值,返回两个属性left,top
var position = $("p").position();
var left = position.left;
var top = position.top;
Object
{top,left}
scrollLeft([val])
获取或设置匹配元素相对滚动条左侧的偏移
取得浏览器滚动条的左边界
$(window).scrollLeft()

获取第一段相对滚动条顶部的偏移
HTML:
<p>Hello</p><p>2nd Paragraph</p>
jQuery:
var p = $("p:first");
$("p:last").text("scrollTop:" + p.scrollTop());
Result:
<p>Hello</p><p>scrollTop: 0</p>
Number
scrollTop([val])
获取或设置匹配元素相对滚动条顶部的偏移
取得浏览器滚动条的上边界
$(window).scrollTop()
Number
height([val])
取得对象的高度,或赋值对象的高度
浏览器可视区域的高
$(window).height()?
Number
width([val])
取得对象的宽度,或赋值对象的宽度
$("#gooDiv").width(300); Number
innerHeight() obj的自身大小 + padding大小 Number
innerWidth() 同上 Number
outerHeight([true])

obj自身大小 + padding大小 + border大小

如果属性true:
obj自身大小 + margin大小 + padding大小 + border大小

Number
outerWidth([true]) 同上 Number
事件 bind(type,[data,]fn)
对象事件响应,event可以是JS事件,也可以是JQuery事件

$('#foo').bind('click', function() {
alert('User clicked on "foo."');
});

多个事件捆绑,每个事件类型用空格分隔:
$('#foo').bind('mouseenter mouseleave', function() {
$(this).toggleClass('entered');
});

在jQuery 1.4中,可以通过传入一个映射对来一次绑定多个事件处理函数:
$('#foo').bind({
click: function() {
// do something on click
},
mouseenter: function() {
// do something on mouseenter
}
});

事件处理函数:
$('#foo').bind('click', function() {
alert($(this).text());
});

jQuery
trigger(type[,data])
让节点主动触发js/jQuery事件
可以触发多个事件,如:
$(obj).trigger("focus").trigger("select");
jQuery
hover(over,out)
模仿悬停事件的方法
$("td").hover(function(){
$(this).addClass("hover");
}, function(){
$(this).removeClass("hover");
});
jQuery
toggle(fn1,fn2[,fn3])
模拟多次点击情况的方法
另一个作用是切换可视状态
$("td").toggle(function(){
$(this).addClass("selected");
},function(){
$(this).removeClass("selected");
});
jQuery
click(fn) 无需多言 jQuery
focus(fn) 无需多言 jQuery
keyup(fn)

这里的event是JQuery返回的一个事件对象,event有一个which属性,可以获得键盘按键的键值。

inputObj.keyup(function(event){
var keycode = event.which;
//处理回车的情况
if(keycode == 13){
var inputtext = $(this).val();
//将td的内容修改成文本框的内容
tdObj.html(inputtext);
}
//处理esc的情况
if(keycode == 27){
tdObj.html(text);
}
});

1 = 鼠标左键,2 = 鼠标中键,3 = 鼠标右键13 = 回车,16 = shift17 = ctrl27 = ESC

另外event.pageXevent.pageY两个属性用于获得鼠标相对于页面的x坐标和y坐标。
$("a").click(function(event)){
alert("current mouse position:"+event.pageX+","+event.pageY);
return false;
}

jQuery
load(fn)
当对象加载完成时触发,
对应javascript中的onload事件
另一个作用时ajax加载页面
本例中捕捉图片加载完成的事件

//javascript的Image对象可以预装图片
var myImg = new image();
$(myImg).attr("src","images/car.jpg").load(function(){

});
jQuery
mousedown(fn) 无需多言 jQuery
mousemover(fn) 无需多言 jQuery
mouseout(fn) 无需多言 jQuery
mouseup(fn) 无需多言 jQuery
resize(fn) 当窗口对象的大小发生改变时
$(window).resize(function(){…});
jQuery
scroll(fn) 当窗口对象拖动滚动条时
$(window).scroll(function(){…});
jQuery
submit(fn) 无需多言
这里需要一个return false,来阻止默认的提交事件
jQuery
动画效果

show(speed,[callback])
高度宽度透明度一起变化

速度fast,normal,slow要用""括起来,单位毫秒 jQuery
hide(speed,[callback])   jQuery
toggle(speed,[callback])   jQuery
slideDown(speed,[callback])
高度变化
  jQuery
slideUp(speed,[callback])   jQuery
slideToggle(speed,[callback])   jQuery
fadeIn(speed,[callback])
透明度变化
  jQuery
fadeOut(speed,[callback])   jQuery
补充一个类似fadeToggle效果的小插件
jQuery.fn.fadeToggle = function( speed, easing, callback) {
return this.animate({opacity: 'toggle'}, speed, easing, callback);
};
jQuery
fadeTo(speed,[callback])   jQuery
$(obj).animate(css,speed,[callback])
其他动画的底层实现全部基于该方法

使某个节点的某个css属性在设定时间内变化

JQuery:
$("myphoto").animate({opacity:0},300);
$("myphoto").animate({left:"400px"},300);

累加动画:
$(this).animate({left:"+=500px"},300);
+=累加 -=累减,表示在当前位置累加500像素

多重动画:
$(this).animate({left:"500px",height: "200px"},300);

综合动画:
$(this).animate({left:"400px",height: "200px",opacity:"1"},3000).fadeOut("slow");
当animate完成后,再执行fadeOut,这就是链式队列

回调函数callback
以上列子如果将fadeOut("slow")
改成css("border","5px solid blue")
由于css方法并不是动画效果,并不会在链式队列中等待,而是直接实现了。如果想让它也在animate后执行,必须用callback
$(this).animate({left:"400px",height: "200px",opacity:"1"},3000,function(){
$(this).css("border","5px solid blue")});  

jQuery
stop([clearQueue], [gotoEnd])
停止所有在指定元素上正在运行的动画
  • clearQueue 表示是否要清空其他未完成的动画队列
  • gotoEnd 表示是否将正在执行的动画跳转到末状态

$("#panel").hover(function(){
$(this).stop().animate({height: "150px", width: "300px"},200);
},function(){
$(this).stop().animate({height: "22px", widht: "60px"},300);
});
如果这里不使用stop(),那么鼠标频繁触发事件的话,前面0.2秒还没完成,后面紧跟着的0.3秒效果就出不来,只能排队,越排越长。

stop()在无参数情况下,只能停止正在进行的一个动画,碰到多动画效果需要加上true参数:
$("#panel").hover(function(){
$(this).stop(true).animate({height:"150px"},200).animate({width:"300px"},300);
},function(){
$(this).stop(true).animate({height:"22px"},300).animate({widht:"60px"},200);
});

第二个参数gotoEnd,一般用法是stop(false,true),效果是不执行动画队列,但直接达到动画结束时的效果,如同直接用了css()设置了参数。

jQuery
dequeue(name)
让动画马上执行,即让两种或多种效果同时执行,而不用等待前一个动画效果结束(从队列最前端移除一个队列函数,并执行他)
$("button").click(function(){
("div").animate({left:'+=200px'}, 2000);
$("div").animate({top:'0px'}, 600);
$("div").queue(function () {
$(this).toggleClass("red");
$(this).dequeue();
});
$("div").animate({left:'10px', top:'30px'}, 700);
});
jQuery
Ajax load(url,[data],[callback])
load(url selector)

载入远程 HTML 文件代码并插入至 DOM 中
全部载入,必须是UTF-8编码,否则中文乱码;
只有符合css选择器的部分内容载入;
无论加载是否成功,callback都会触发。

$("#show div").load("test.html");??
$("#show div").load("test.html H2");
jQuery
$.get(url[,data][,callback][,type])
  • callback 只有返回状态是success才调用
  • type 返回内容的格式,包括xml, html, script, json, text 和_default

HTML:
<form id="form1" action="#">
<p>评论:</p>
<p>姓名:<input type="text" name="username" id="username" /></p>
<p>内容:<textarea name="content" id="content" rows="2" cols="20"></textarea></p>
<p><input type="button" id="send" value="提交" /></p>
</form>
<div class="comments">已有评论:
<div id="resText"></div>
</div>
JQuery:
$("#send").click(function(){
$.GET("GET1.PHP",{
username:$("#username").val(),
content:$("#conent").val()},
function(data,textStatus){
//data: 返回内容,HTML XML JSON 等
//textStatus: 请求状态4种success, error, notmodified, timeout
});
});

$.get("http://127.0.0.1/JQuery/userverify?username="+encodeURI(encodeURI(username)),null,function(response){ $("#result").html(response); });
//两次encodeURI转换编码,并在服务器代码中按utf-8方式做一次URLDecode可解决中文乱码问题。

XMLHttpRequest
$.post(url[,data][,callback][,type])  

GETPOST的区别:

  • GET请求会将参数跟着URL后进行传递,POST请求则作为HTTP消失实体内容发送给服务器。
  • GET方式传送的数据不能大于2KB,POST无限制
  • GET方式请求的数据会被浏览器缓存,比如跟在URL后的用户名和密码,有安全隐患,POST不会

$(function(){
$("#send").click(function(){
$.post("post.php",{
//由于带参数的load也是用post传递,所以也可以是
//load("post.php",{
username:$("#username").val(),
conent:$( "content").val()
},function(data){
$("#resText").append(data);
});
});
});

XMLHttpRequest
$.ajax([options])
jQuery 底层 AJAX 实现
几个常用options:
  1. type: GET/POST
  2. url:
  3. data:
  4. dataType: html/xml/script/json/jsonp/text
  5. success:function

用$.ajax()实现$.getScript()方法
$(function(){
$("#send").click(function(){
$.ajax({type:"GET", url:"test.js", dataType:"script"});
});
})

用$.ajax()实现$.getJSON()方法
$(function(){
$("#send").click(function(){
$.ajax({
type:"GET",
url:"test.json",
dataType:"json",
success:function(data){
$("#resText").empty();
var html = "";
$.each(data,function(index,comment){
html+="<div class=comment><h6>"+comment["username"]+":</h6>"
+"<p class=para>"+comment["content"]+"</p></div>"
});
$("#resText").html(html);
}
});
});
})

保存数据到服务器,成功时显示信息。
jQuery:
$.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});

XMLHttpRequest
ajaxComplete(callback)
AJAX 请求完成时执行函数
$("#msg").ajaxComplete(function(event,request, settings){
$(this).append("<li>请求完成.</li>");
});
jQuery
ajaxSuccess(callback)
AJAX 请求成功时执行函数
同上 jQuery
ajaxStart(callback)
AJAX 请求开始时执行函数
可以用bind给对象绑定2个ajax事件:

$("#show").bind("ajaxStart",function(){
$(this).slideDown(500);
}).bind("ajaxStop",function(){
$(this).slideUp(500);
});
jQuery
ajaxStop(callback)
AJAX 请求结束时执行函数
同上 jQuery
ajaxError(callback)
AJAX 请求发生错误时执行函数
同上 jQuery
ajaxSend(callback)
AJAX 请求发送前执行函数
同上 jQuery
serialize()
序列表表格内容为字符串

如果表单中的元素非常多,那么使用{key:value}的赋值方法就相当繁琐,所以可以改成:
HTML:
<p id="results"><b>Results: </b></p>
<form>
<select name="single">
<option>Single</option>
<option>Single2</option>
</select>
<select name="multiple" multiple="multiple">
<option selected="selected">Multiple</option>
<option>Multiple2</option>
<option selected="selected">Multiple3</option>
</select><br/>
<input type="checkbox" name="check" value="check1"/> check1
<input type="checkbox" name="check" value="check2" checked="checked"/> check2
<input type="radio" name="radio" value="radio1" checked="checked"/> radio1
<input type="radio" name="radio" value="radio2"/> radio2<br />
<input type="submit" name="" value="submit" />
</form>
jQuery:
$("input[type=submit]").click(function(){
$.get("get1.php",$("form").serialize(),function(data,textStatus){
$("#results").html(data);
});
})

serialize()可以查找form1表单下的所有元素值并转化成字符串 当我们处理中文数据时,需要使用encodeURIComponent进行转换,但是如果使用serialize()则会自动进行了编码。

serialize()方法,还可以用来选取元素,如:$(":checkbox, :radio").searialize();
复选框和单选框选中的值序列化成字符串形式

String
其他 data(name,data) 缓存数据
data(name) 取值
$(obj).data(name.value);
var data = $(obj).data(name);
Any
$.browser
可以判断浏览器类型
$.browser.msie == true
$.browser.safari == true
$.browser.opera == true
$.browser.mozilla == true
boolean
$.browser.version
判断浏览器的版本
$.browser.version.indexOf("8") String
$.trim(str)
去掉字符串起始和结尾的空格
$.trim("   hello, how are you?  "); String
JQuery载入
$(document).ready(function(){…});
简写$(function(){…});
 
JQuery插件声明 $.fn.pluginName = function(){
  this.click(); //方法中的this表示执行这个方法的对象,不用$(this)
  return this; //保证其他JQuery可以级联操作
}
分享到:
share

    图片原图

    loading

    loading