• DOM对象和jQuery对象的区别


    var cvs = $("#cvs_"+this.index).getContext("2d"); //错的

    var cvs = $("#cvs_"+this.index)[0].getContext("2d");//对的

    DOM对象和jQuery对象是两种不同的对象,它们的实例也因此具有不同的属性和方法。通常要操作页面中的节点,我们都需要想办法获取对该节点的引用。比如如下代码:

    1
    var dom = document.getElementById('节点id');

    这是通过节点的id来获取一个页面节点,也就是对节点的引用。这个时候,我们对变量dom的任何操作,实际上就是对页面节点的操作,比如说修改样式、移除节点、获取属性等等。如下:

    1
    2
    3
    dom.style.display = 'none'// 隐藏节点
    dom.parentNode.removeChild(dom); // 删除节点
    var height = dom.offsetHeight; // 获取节点高度

    像上面的style、parentNode、removeChild、offsetHeight等等,都是DOM对象的属性或方法。

    因为DOM对象不属于javascript的一部分,它是各个浏览器对javascript的扩展,但各个浏览器又都在实现上有一些不一致,导致javascript代码需要处理很多兼容性问题。为了解决这些兼容性问题,提高开发效率,jQuery库就诞生了。

    jQuery解决了兼容性问题,再加上它的实现极其巧妙,因此得到了很多人的吹捧。以前有一点javascript基础的人,要写出稍微复杂些的特效,几乎都不可能,但因为jQuery的出现,类似显示隐藏、各种动画效果,都只需要简单的几行代码即可。有些人甚至觉得,jQuery甚至都能替代javascript,而且在各个前端学习的站点、博客中,也是将jQuery和javascript并列作为一类。

    但问题是,不了解基础的javascript,在遇到问题、异常的时候,你就只能干瞪眼了。任何语言,框架和库都无法取代最基础的语法,而且框架和库也都是由最简单的语法丰富起来的。

    jQuery实际上可以说是一个大的类——javascript实现的类。以一个简单的模型来说,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ;(function(window, undefined){
             
        window.$ = window.jQuery = jQuery;
         
        // 定义jQuery类
        function jQuery(selector, content){
            content = content || document;
            var eles = content.querySelectorAll(selector);
            var len = eles.length;
             
            // 给jQuery对象添加长度属性
            this.length = len;
             
            // 方便获取dom对象,获取实例:jQuery('#id')[0];
            for(var i = 0; i < len; i++){
                this[i] = eles[i];
            }
        }
         
        // 扩展原型
        jQuery.prototype = {
            // 构造函数
            constructor : jQuery,
             
            // 根据索引获取dom对象
            get : function(index){
                return this[index];
            }
             
        }
    })(window);

    这是一段jQuery的模拟代码,你可以使用如下方式调用:

    1
    var jqObj = new jQuery('.class');

    因为jQuery的特殊处理,写jQuery代码的时候不需要new即可用,但这里没有处理,所以需要加上new关键字。

    上面返回的jqObj,就是我定义的jQuery的一个对象,它是jQuery对象,已经不是DOM对象了。我可以写如下代码:

    1
    var dom = jqObj.get(1); // 获取jQuery对象中下标为1的DOM对象

    然后变量dom就和之前的变量dom一样,可以使用DOM对象的属性和方法了。

    但是,我们不能写下面的代码,否则它就会报异常:

    1
    jqObj.style.color = 'red';

    因为jQuery对象的实例,根本就没有style这个属性。jQuery也是一样的,jQuery对象和DOM对象是两种不同的对象,它们的内部结构(比如上面的get方法是自定义的)也是不同的。当你把jQuery对象当做DOM对象使用时,你调用该对象的任何属性和方法,都有可能触发一个属性或方法未定义的异常,因为这个属性或方法确实不存在。

    所以,如果你使用了jQuery库,那你就得在操作节点的时候,注意区分这个节点对象到底是DOM对象,还是jQuery对象。基本上jQuery的方法如果返回节点对象,返回值大多是jQuery对象,但也有例外,比如get等。

    回到你的题目,通过jQuery获取的canvas对象,实际上是jQuery对象封装后的对象。它没有getContext方法,所以会报错。但jQuery对象可以像访问数组一样,通过中括号来获取对应的DOM对象,所以第二种返回了最原始的Canvas对象,它是具有getContext方法的。

  • 相关阅读:
    线上查询及帮助命令:
    windows: 2.7 3.5 (主要)
    get the execution time of a sql statement.
    java-kafka安装以及使用案例
    java-黑马头条 weex前端路由
    MYSQL安装
    缓存
    Flask中current_app和g对象
    [ValueError: signal only works in main thread]
    Flask-SQLAlchemy操作
  • 原文地址:https://www.cnblogs.com/zhxling/p/5262787.html
Copyright © 2020-2023  润新知