jQuery ajax

题目1: jQuery 中, $(document).ready()是什么意思?

描述:当DOM准备就绪的时候,指定一个函数来执行。
虽然JavaScript提供了load事件,当页面呈现时执行这个事件,直到所有东西,如图像已经完全接收前,此事件不会被触发。大多数情况下,只要DOM结构已完全加载时,脚本就可以运转了。传递处理函数给ready()方法,能保证DOM准备就绪好后执行这个函数,因此,这里是进行多有其他事件绑定及运行其他jQuery代码最佳的地方。当脚本依赖css属性值时,需要特别注意,保证外部的样式或内嵌样式被加载完后执行,在调用脚本。
如果执行代码需要在元素被加载之后才使用,(例如,取得图片大小需要在图片加载之后才知道),就需要将这样的代码放到load事件中去。

ready()方法通常和<body onload="">属性时不兼容的。如果load必须使用,要么就不要使用ready(),要么使用
jQuery的load()方法向window或一些指定元素绑定load事件。

一下三个语法全部等价:

  • $(document).ready(handler)
  • $().ready(handler)
  • $(handler)
例子:
.ready()方法通常用于一个匿名函数:
  $(document).ready(function(){
      //handler for .ready() called.
  });
这等价与调用:
  $(function(){
      //handler for .ready() called.
  });

题目2: $node.html()和$node.text()的区别?

$node.html()在没有参数的时候,获取集合中的第一个匹配元素的HTML内容,当有参数的时候表示,设置每个匹配元素的html内容;
$node.text()在没有参数的时候,获取集合中每个元素的文本内容,包括后代(内容从父元素往子元素排列),有参数的时候,设置匹配元素集合中的每个元素的文本内容为指定文本内容。

题目3: $.extend 的作用和用法?

描述:将两个或更多的内容合并到第一个对象。

jQuery.extend(target[,object1][,objectN])   1.0版本
target
类型:object
一个对象,如果附加的对象被传递给这个方法那么它将接收新的属性,如果它是唯一的参数将扩展jQuery的命名空间。
object1
类型:object
一个对象,它包含额外的属性合并到第一个参数
objextN
类型:object
包含额外的属性合并到第一个参数

jQuery.extend([deep],target[,object1][,objectN])  1.1.4版本
deep
类型:Boolean
如果是true,合并成为递归(又叫做深拷贝)。
target
类型:object
一个对象,如果附加的对象被传递给这个方法那么它将接收新的属性,如果它是唯一的参数将扩展jQuery的命名空间。
object1
类型:object
一个对象,它包含额外的属性合并到第一个参数
objectN
类型:object
包含额外的属性合并到第一个参数

当我们提供两个或多个对象给$.extend(),对象的所有属性都添加在目标对象(target参数)。
请记住,目标对象将被修改,并且将通过$.extend()返回。然而,如果想保留原对象,我们可以通过传递一个空对象作为目标对象:

var object = $.extend({}, object1, object2);

在默认情况下,通过$.extend()合并操作不是递归(深拷贝)的;如果第一个对象的属性本身是一个对象或数组,那么它将完全用第二个对象相同的 key 重写一个属性。这些值不会合并。如果将true做为该函数的第一个参数,那么会在对象上进行递归的合并。
注意:第一个参数不支持false。

例子:
var object1 = {
    red: 100,
    box: { height: 100, weight: 20 , width: 100},
    background: 10
};

var object2 = {
    box: { height: 200,  width: 200},
    background: 97
};

$.extend(object1, object2);   合并两个对象,并修改第一个对象。
// object1 = {
       red: 100,
       box: { height: 200,  width: 200},
       background: 97
   }

$.extend(true, object1, object2);  采用递归方式合并两个对象,并修改第一个对象。
// object2 = {
       red: 100,
       box: { height: 200, weight: 20,  width: 200},
       background: 97
  }

题目4: jQuery 的链式调用是什么?

对同意个jQuery对象,我们可以用$(this).parents().siblings().addClass('hover')这样简化代码。
不用链式调用:

var $parents = $(this).parents();
var $siblings = $parents.siblings();
$siblings.addClass('hover');

题目5: jQuery 中 data 函数的作用

在匹配元素上存储任意相关的数据 或 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。
contents:

  • .data(key, value)
    • .data(key, value)
    • .data(obj)
  • .data(key)
    • .data(key)
    • .data()

.data(key, value)

描述:在匹配元素上存储任意相关数据

.data(key, value)
    key    类型:String     一个字符串,用于存储数据的名称。
    value    类型:Object    新的数据值,它可以是任意的JavaScript数据类型,包括Array、Object.
.data(obj)
    obj   type: Object    一个用于更新数据的 键/值对

例子:
$("body").data("foo" , 18);
$("body").data("abc", { name: "text", sex: 20 });
$("body").data({cba:[a,b,c]});
$("body").data("foo"); // 18
$("body").data() // {foo: 18, abc: {name: "text", sex: 20}, cba:[a,b,c]}

.data(key)

描述:返回匹配的元素集合中的第一个元素的给定名称的数据存储的值

.data(key)
    key  type: String    存储数据名。
.data()
    这个方法不接受任何参数。得到匹配元素的所有存储的数据 

例子:
$('body').data('foo'); // undefined
$('body').data(); // undefined

题目6:写出以下功能对应的 jQuery 方法:

  • 给元素 $node 添加 class active,给元素 $noed 删除 class active
$node.addClass('active'); 添加
$node.removeClass('active'); 删除
  • 展示元素$node, 隐藏元素$node
普通
$node.hide(); 隐藏
$node.show(); 显示
$node.toggle(); 切换隐藏和显示

渐变
$node.fadeOut(); 隐藏
$node.fadeIn(); 显示
$node.fadeToggle(); 通过匹配的元素的不透明度动画,来显示或隐藏它们,方法执行匹配元素的不透明度动画。

滑动
$node.slideDown(); 显示
$node.slideUp(); 隐藏
$node.slideToggle(); 滑动的方式来切换显示或隐藏
  • 获取元素$node 的 属性: id、src、title, 修改以上属性
获取
$node.attr('id');
$node.attr('src');
$node.attr('title');
修改
$node.attr('id', 'newId');
$node.attr('src', '/hello/a.jpg');
$node.attr('title', 'jQuery');
  • 给$node 添加自定义属性data-src
$node.attr('data-src', '/hello/a.jpg');
  • 在$ct 内部最开头添加元素$node
$ct.prepend($node);
$node.prependTo($ct);
  • 在$ct 内部最末尾添加元素$node
$ct.append($node);
$node.appendTo($ct);
  • 删除$node
$node.remove();
  • 把$ct里内容清空
$ct.empty();
  • 在$ct 里设置 html <div class="btn"></div>
$ct.html(' <div class="btn"></div>');
  • 获取、设置$node 的宽度、高度(分别不包括内边距、包括内边距、包括边框、包括外边距)
获取
不包括内边距
$node.height();
$node.width();
包括内边距
$node.innerHeight();
$node.innerWidth();
包括边框
$node.outerHeight();
$node.outerWidth();
包括边框
$node.outerHeight(true);
$node.outerWidth(true);

设置
不包括内边距
$node.height( '100px' );
$node.width( '100px' );
包括内边距
$node.innerHeight( '100px' );
$node.innerWidth( '100px' );
包括边框
$node.outerHeight( '100px' );
$node.outerWidth( '100px' );
包括边框
$node.outerHeight( '100px', true );
$node.outerWidth( '100px', true );
  • 获取窗口滚动条垂直滚动距离
$(widnow).scrollTop();
  • 获取$node 到根节点水平、垂直偏移距离
获取
$node.offset().left 水平
$node.offset().top   垂直
设置
$node.offset( {left: 100 , top: 100} ); 设置 $node 水平垂直距离
  • 修改$node 的样式,字体颜色设置红色,字体大小设置14px
$node.css({
    'color': 'red',
    'font-size': '14px'
});

$node.attr({
    'color': 'red',
    'font-size': '14px'
});
  • 遍历节点,把每个节点里面的文本内容重复一遍
$node.each(function(){
    $(this).text().+$(this).text();
});
  • 从$ct 里查找 class 为 .item的子元素
$ct.children('.item');
$ct.find('.item');
$ct.has('.item');
  • 获取$ct 里面的所有孩子
$ct.children();
  • 对于$node,向上找到 class 为'.ct'的父亲,在从该父亲找到'.panel'的孩子
$node.parents('.ct').find('.panel');
$node.parents('.ct').children('.panel');
  • 获取选择元素的数量
$('li').length;
  • 获取当前元素在兄弟中的排行
$('ul').index($(this));

题目7:用jQuery实现以下操作

  • 当点击$btn 时,让 $btn 的背景色变为红色再变为蓝色
$btn.on('click', function(){
    $(this).animate({
        'background-color': 'red',
    },1000, function(){
          'background-color': 'bule',
      });
});
  • 当窗口滚动时,获取垂直滚动距离
$(window).scrollTop(); 
  • 当鼠标放置到$div 上,把$div 背景色改为红色,移出鼠标背景色变为白色
$div.on('hover', function(){
    $(this).css('background-color', 'red');
}, function(){
    $(this).css('backgrund-color', '#fff')
});
  • 当鼠标激活 input 输入框时让输入框边框变为蓝色,当输入框内容改变时把输入框里的文字小写变为大写,当输入框失去焦点时去掉边框蓝色,控制台展示输入框里的文字

$('input').on('focusin', function(){
    $(this).css('border', 'blue');
    var $text = $(this).val();
    $text.toUpperCase();
});

$('input').on('focusout', function(){
    $(this).removeAttr('border');
    console.log( $(this).val().toUpperCase());
});
  • 当选择 select 后,获取用户选择的内容
$('div').select(function(){
   console.log( $(this).text() );
})

题目8: 用 jQuery ajax 实现如下效果。当点击加载更多会加载数据展示到页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>加载更多</title>
    <style>
      body,
      ul,
      li,
      a {
          margin: 0;
          padding: 0;
      }

      ul,
      li {
          list-style: none;
      }
        
      a {
          text-decoration: none;
      }

      #load-more {
          display: block;
          margin: 30px auto 0 auto;
          text-align: center;
          cursor: pointer;
      }
      
      #load-more img {
          width: 40px;
          height: 40px;
      }

      #ct li {
          margin: 10px 20px;
          padding: 10px;
          background: #ccc;
          border-radius: 4px;
          cursor: pointer;
      }

      .btn {
          height: 40px;
          line-height: 40px;
          width: 160px;
          background: orange;
          border-radius: 4px;
          color: #333;
      }

       #ct .hover {
          background: #c78;
          color: #000;
      } 


    </style>
</head>
<body>
    <ul id="ct">
        <li>内容1</li>
        <li>内容2</li>
        <li>内容3</li>
        <li>内容4</li>
        <li>内容5</li>
    </ul>
    <a href="#" class="btn" id="load-more">
      加载更多
    </a>
    <script src = 'http://apps.bdimg.com/libs/jquery/1.9.1/jquery.js'></script>
    <script>
        //定义接口
        /*
        url: '/loadMore'
        type: 'get'
        dataType: 'json'
        入参:data: {
            index: 5
            len: 5
        }
        回参:{
            status: 1 正常状态 0 失败状态
            data:{
                status: 1
                data: [新闻1,新闻2,新闻3,新闻4,新闻5]
            }
        }

        */
        $loadMore = $('#load-more');
        $ct = $('#ct');

        idx = 6;
        
        //鼠标放置上去和移除的样式, 这里由于 Li是动态添加的,所以必须要事件代理
        $('#ct').on('mouseenter', 'li', function(){
            $(this).addClass('hover');
        });
        $('#ct').on('mouseleave', 'li', function(){
            $(this).removeClass('hover');
        });

        $loadMore.on('click',function(e){
            e.preventDefault(); // 取消a的默认事件

            if($(this).data('isloading')){
                return;
            };

            $(this).data('isloading', true)           // 设置一个状态锁,防止数据加载回来之前用户多次点击
                   .html("<img src = 'loading.gif'>");

            $.ajax({
                url: '/loadMore',
                datatype: 'json',
                type: 'get',
                data: {
                    index: idx,
                    len: 5
                },
                success: function(json){
                    onSuccess(json);
                },
                error: function(){
                    onError();
                }
            });

            function onSuccess(json){
                $loadMore.data('isloading', false)
                         .text('加载更多');
                if(json.status === 1){
                    append(json.data);
                    idx += 5;
                }else{
                    alert('数据出错');
                }
            };

            function onError(){
                $loadMore.data('isLoading', false)
                            .text('加载更多');            //链式调用,换行也没关系,对齐好看些
                alert('系统异常');
            }

            function append(arr){
                var html = '';
                for(var i = 0; i < arr.length; i++){
                    html += '<li>' + arr[i]+ '</li>';
                };
                $ct.append(html);
            }
        });
    </script>
</body>
</html>
模拟服务器
app.get('/loadMore' , function(req, res){
    var curIndex= req.query.index;
    var len = req.query.len;
    var Obj = {
        status: 1,
        data: []
    };
    
    for(var i = 0; i < len; i++) {
       Obj.data.push('新闻'+ (parseInt(curIndex) + i));
    }
    res.header("Access-Control-Allow-Origin", "*");
    res.send(Obj);

});
175159135.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容