
这两行代码要区分的是DOM对象和jQuery对象的区别。
DOM对象和jQuery对象是两种不同的对象,它们的实例也因此具有不同的属性和方法。通常要 *** 作页面中的节点,我们都需要想办法获取对该节点的引用。比如如下代码:
var dom = documentgetElementById('节点id');这是通过节点的id来获取一个页面节点,也就是对节点的引用。这个时候,我们对变量dom的任何 *** 作,实际上就是对页面节点的 *** 作,比如说修改样式、移除节点、获取属性等等。如下:
domstyledisplay = 'none'; // 隐藏节点domparentNoderemoveChild(dom); // 删除节点
var height = domoffsetHeight; // 获取节点高度
像上面的style、parentNode、removeChild、offsetHeight等等,都是DOM对象的属性或方法。
因为DOM对象不属于javascript的一部分,它是各个浏览器对javascript的扩展,但各个浏览器又都在实现上有一些不一致,导致javascript代码需要处理很多兼容性问题。为了解决这些兼容性问题,提高开发效率,jQuery库就诞生了。
jQuery解决了兼容性问题,再加上它的实现极其巧妙,因此得到了很多人的吹捧。以前有一点javascript基础的人,要写出稍微复杂些的特效,几乎都不可能,但因为jQuery的出现,类似显示隐藏、各种动画效果,都只需要简单的几行代码即可。有些人甚至觉得,jQuery甚至都能替代javascript,而且在各个前端学习的站点、博客中,也是将jQuery和javascript并列作为一类。
但问题是,不了解基础的javascript,在遇到问题、异常的时候,你就只能干瞪眼了。任何语言,框架和库都无法取代最基础的语法,而且框架和库也都是由最简单的语法丰富起来的。
jQuery实际上可以说是一个大的类——javascript实现的类。以一个简单的模型来说,如下:
;(function(window, undefined){window$ = windowjQuery = jQuery;
// 定义jQuery类
function jQuery(selector, content){
content = content || document;
var eles = contentquerySelectorAll(selector);
var len = eleslength;
// 给jQuery对象添加长度属性
thislength = len;
// 方便获取dom对象,获取实例:jQuery('#id')[0];
for(var i = 0; i < len; i++){
this[i] = eles[i];
}
}
// 扩展原型
jQueryprototype = {
// 构造函数
constructor : jQuery,
// 根据索引获取dom对象
get : function(index){
return this[index];
}
}
})(window);
这是一段jQuery的模拟代码,你可以使用如下方式调用:
var jqObj = new jQuery('class');因为jQuery的特殊处理,写jQuery代码的时候不需要new即可用,但这里没有处理,所以需要加上new关键字。
上面返回的jqObj,就是我定义的jQuery的一个对象,它是jQuery对象,已经不是DOM对象了。我可以写如下代码:
var dom = jqObjget(1); // 获取jQuery对象中下标为1的DOM对象然后变量dom就和之前的变量dom一样,可以使用DOM对象的属性和方法了。
但是,我们不能写下面的代码,否则它就会报异常:
jqObjstylecolor = 'red';因为jQuery对象的实例,根本就没有style这个属性。jQuery也是一样的,jQuery对象和DOM对象是两种不同的对象,它们的内部结构(比如上面的get方法是自定义的)也是不同的。当你把jQuery对象当做DOM对象使用时,你调用该对象的任何属性和方法,都有可能触发一个属性或方法未定义的异常,因为这个属性或方法确实不存在。
所以,如果你使用了jQuery库,那你就得在 *** 作节点的时候,注意区分这个节点对象到底是DOM对象,还是jQuery对象。基本上jQuery的方法如果返回节点对象,返回值大多是jQuery对象,但也有例外,比如get等。
回到你的题目,通过jQuery获取的canvas对象,实际上是jQuery对象封装后的对象。它没有getContext方法,所以会报错。但jQuery对象可以像访问数组一样,通过中括号来获取对应的DOM对象,所以第二种返回了最原始的Canvas对象,它是具有getContext方法的。
用我自己的理解和你说一遍,网页说到底就是容器的嵌套,也就是DOM树,<html></html>是最外层的容器,接着是<head></head>、<body></body>,在这两个容器我们可以继续加别的东西,形象一点就是大盒子里放小盒子,小盒子里面再放盒子,这是直观的理解,抽象一点就是DOM树,<html></html>是树根,<head></head>、<body></body>,则是它的延伸、子集,可以看做树干,接下来的又是<head></head>、<body></body>,的子集,可以看做枝叶,DOM树加载就相当于从树根到枝叶把这棵树构造出来,换到网页就是整个网页的显示层面全部加载显示,$(document)ready()函数做的事就是看这个树那儿不好,修剪一下,换到网页就是对最原始的显示进行排版美化等一系列你想做的事。
直白的说就是这么回事,希望对你有帮助
MVC: M,即model,指数据层 V,指view, 即视图层 C, controller,控制器
View层发起数据请求,Controller层接到请求后,接收参数,把命令传向Model层,Model层处理数据后,把数据传回controller,而controller把数据传回客户端,也就是view层
典型代表: nodejs的Egg框架, php的ThinkPHP框架都是使用的MVC模式
MVVM: M: model,数据层 V: view,视图层,即UI , VM (ViewModel)是视图层和数据层的中间层
典型代表: Vue框架
Vue的双向数据绑定就得益于MVVM框架, 视图层改变,底层封装好的VM层会更新数据,而数据改变,VM层会更新视图
一、虚拟DOM就是一个JS对象,用它来描述真实DOM
二、为什么要用虚拟DOM
越多的真实dom *** 作,越损耗性能
而用虚拟dom *** 作数据要大大的减少性能损耗,提高渲染效率
二、虚拟DOM的渲染流程
1、获取数据
2、根据数据创建VDOM (相当于给对象赋值)
3、根据VDOM渲染生成真实DOM ( 根据createElement(‘DIV’) )
4、当数据发生改变后,又会生成新的VDOM
5、通过 diff 算法 比对 多次生成的 VDOM, 将不同的内容比对出来,然后再进行真实DOM渲染,
一样的内容是不会进行渲染的,这就是VDOM 的 ‘就地复用’ | ‘惰性原则’
DOM 层级关系
Window
windowhistory - 对history对象的只读引用。
windowlocation - 用于窗口或框架的Location对象。
windownavigator - 对Navigator对象的只读引用。
windowscreen - 对Screen 对象的只读引用。
Navigator
不包含其它元素对象。
Screen
不包含其它元素对象。
History
不包含其它元素对象。
Location
以上就是关于js中提到的dom引用是什么意思全部的内容,包括:js中提到的dom引用是什么意思、jquery中的DOM的理解、MVC和MVVM的区别 & vue的虚拟DOM的理解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)