如果您想了解javascript–为什么在控制器中操作DOM被认为是个坏主意?的相关知识,那么本文是一篇不可错过的文章,我们将对js操作dom为什么消耗性能进行全面详尽的解释,并且为您提供关于3、Ja
如果您想了解javascript – 为什么在控制器中操作DOM被认为是个坏主意?的相关知识,那么本文是一篇不可错过的文章,我们将对js操作dom为什么消耗性能进行全面详尽的解释,并且为您提供关于3、JavaScript操作DOM对象、asp.net – 为什么在web.config中保存动态数据是个坏主意?、asp.net – 在服务器端级别渲染javascript.好主意还是坏主意?、javascript – Ajax被认为是客户端还是服务器端脚本?的有价值的信息。
本文目录一览:- javascript – 为什么在控制器中操作DOM被认为是个坏主意?(js操作dom为什么消耗性能)
- 3、JavaScript操作DOM对象
- asp.net – 为什么在web.config中保存动态数据是个坏主意?
- asp.net – 在服务器端级别渲染javascript.好主意还是坏主意?
- javascript – Ajax被认为是客户端还是服务器端脚本?
javascript – 为什么在控制器中操作DOM被认为是个坏主意?(js操作dom为什么消耗性能)
这样做的最佳实践是什么?如何完成?
解决方法
Technically controller should be smaller & compact,it should not be
playing with a DOM. Controller will only interested to have a business logic & binding level logic that are being called on events.
根据我的观点,“你不应该从控制器操纵DOM”背后的原因是,这只是因为关注的分离.如果你从控制器进行DOM操作,那么它会与你的控制器紧密耦合,&那段代码不能成为可重用的.因此,通过在指令中编写该代码,相同的代码可以很容易地成为一个可插拔的代码.可重用的组件.只需放置指令标记/元素,就可以在其他地方使用相同的DOM操作.
看一下指令定义,然后你将分析它只是意味着使用DOM,因为它在使用preLInk函数和放大器渲染它之前为DOM提供控制器.也可以在postLink函数中获得DOM的渲染.
另外指令使你可以使用指令元素,你不需要编译它,因为该元素已经用jQLite编译,jQLite是在angular中使用的jQuery的较小版本.这里不需要选择器来获取指令元素DOM.
3、JavaScript操作DOM对象
3、JavaScript操作DOM对象
操作DOM
@H_301_5@DOM:Document Object Model(文档对象模型)
组成:
DOM
HTML-DOM DOM Core css-DOM
节点和节点关系
文档:document
根节点:html
head body
title img h1 p
文本:DOM节点 文本:xxx 文本:DOM应用
访问节点
@H_301_5@使用getElement系列方法访问指定节点 @H_301_5@ getElementById()、getElementsByName()、getElementsByTagName() 根据层次关系访问节点
根据层次关系访问节点
@H_301_5@节点属性
属性名称 | 描述 |
---|---|
parentNode | 返回节点的父节点 |
childNodes | 返回子节点集合,childNodes[i] |
firstChild | 返回节点的第一个子节点,最普遍的用法是访问该元素的文本节点 |
lastChild | 返回节点的最后一个子节点 |
nextSibling | 下一个节点 |
prevIoUsSibling | 上一个节点 |
@H_301_5@element属性
属性名称 | 描述 |
---|---|
firstElementChild | 返回节点的第一个子节点,最普遍的用法是访问该元素的文本节点 |
lastElementChild | 返回节点的最后一个子节点 |
nextElementSibling | 下一个节点 |
prevIoUsElementSibling | 上一个节点 |
oNext = oParent.nextElementSibling || oParent.nextSibling
oPre = oParent.prevIoUsElementSibling || oParent.prevIoUsSibling
oFirst = oParent. firstElementChild || oParent.firstChild
oLast = oParent.lastElementChild || oParent.lastChild
节点信息
@H_301_5@nodeName:节点名称 nodeValue:节点值 nodeType:节点类型
节点类型 | NodeType值 |
---|---|
元素element | 1 |
属性attr | 2 |
文本text | 3 |
注释comments | 8 |
文档document | 9 |
操作节点
操作节点的属性
@H_301_5@getAttribute(“属性名”) setAttribute(“属性名”,“属性值”)
创建和插入节点
名称 | 描述 |
---|---|
createElement (tag Name) | 创建一个标签名为tagName的新元素节点 |
A.appendChild (B) | 把B节点追加至A节点的末尾 |
insertBefore (A,B) | 把A节点插入到B节点之前 |
cloneNode(deep) | 复制某个指定的节点 |
删除和替换节点
名称 | 描述 |
---|---|
removeChild (node) | 删除指定的节点 |
replaceChild(newNode, oldNode) 属性attr | 用其他的节点替换指定的节点 |
/*
删除指定的节点
*/
var delNode=document.getElementById("first");
//删除节点
delNode.parentNode.removeChild(delNode);
/*
用其他的节点替换指定的节点
*/
var oldNode=document.getElementById("second");
//创建新节点
var newNode=document.createElement("img");
//给新节点设置属性
newNode.setAttribute("src","images/f03.jpg");
//替换节点
oldNode.parentNode.replaceChild(newNode,oldNode);
操作节点样式
@H_301_5@改变样式的属性 @H_301_5@ style属性 className属性
style属性
@H_301_5@HTML元素 . style . 样式属性 = “值”
//示例
document.getElementById("titles").style.color="#ff0000";
document.getElementById("titles").style.fontSize="25px ";
名称 | 描述 |
---|---|
onclick | 当用户单击某个对象时调用事件 |
onmouSEOver | 鼠标移到某元素之上 |
onmouSEOut | 鼠标从某元素移开 |
onmousedown | 鼠标按钮被按下 |
className属性
@H_301_5@HTML元素 . className = “样式名称”
function over(){
document.getElementById("cart").className="cartOver";
document.getElementById("cartList").className="cartListOver";
}
function out(){
document.getElementById("cart").className="cartOut";
document.getElementById("cartList").className="cartListOut";
}
获取元素的样式
@H_301_5@HTML元素 . style . 样式属性
alert(document.getElementById("cartList").display);
//getComputedStyle()不兼容IE浏览器
document.defaultview.getComputedStyle(元素,null).属性;
//示例
var cartList=document.getElementById("cartList");
alert(document.defaultview.getComputedStyle(cartList,null).display);
//currentStyle()兼容IE浏览器
HTML元素. currentStyle.样式属性;
//示例
alert(document.getElementById("cartList").currentStyle.display);
HTML中元素属性
@H_301_5@元素属性应用
属性 | 描述 |
---|---|
offsetLeft | 返回当前元素左边界到它上级元素的左边界的距离,只读属性 |
offsetTop | 返回当前元素上边界到它上级元素的上边界的距离,只读属性 |
offsetHeight | 返回元素的高度 |
offsetWidth | 返回元素的宽度 |
offsetParent | 返回元素的偏移容器,即对最近的动态定位的包含元素的引用 |
scrollTop | 返回匹配元素的滚动条的垂直位置 |
scrollLeft | 返回匹配元素的滚动条的水平位置 |
clientWidth | 返回元素的可见宽度 |
clientHeight | 返回元素的可见高度 |
@H_301_5@document.documentElement.scrollTop; (标准浏览器) document.documentElement.scrollLeft; (标准浏览器) 或者 document.body.scrollTop; (Chrome) document.body.scrollLeft; (Chrome)
//示例代码
var sTop=document.documentElement.scrollTop||document.body.scrollTop;
asp.net – 为什么在web.config中保存动态数据是个坏主意?
James Curran发表在这个答案Dynamically change connectionString in web.config中以编程方式修改web.config是一个坏主意,但他没有解释为什么这是一个坏主意.
我正在寻找说服我的老板不在web.config文件中存储任何动态数据的理由.特别感谢与优秀文章的链接.
解决方法
asp.net – 在服务器端级别渲染javascript.好主意还是坏主意?
现在是一个社区维基!
我想先说清楚:这不是关于服务器端Javascript或运行JavaScript服务器端的问题.这是关于从服务器端代码呈现Javascript代码(将在客户端执行)的问题.
话虽如此,请看下面的ASP.net代码,例如:
hlRemoveCategory.Attributes.Add("onclick", "return confirm('Are you sure you want to delete this?');")
这是在服务器端规定客户端onclick事件.
反对在客户端编写Javascript:
$('a[rel=remove]').bind('click', function(event) {
return confirm('Are you sure you want to delete this?');
}
现在我想问的问题是:从服务器端代码渲染javascript有什么好处?或反之亦然?
我个人更喜欢将客户端UI /行为连接到HTML元素的第二种方法,原因如下:
>服务器端执行它已经需要的任务,包括数据验证,事件委托等;和
>服务器端看到的事件不一定是客户端的相同过程.也就是说,客户端还有更多的事件(只看自定义事件);和
>在事件期间,客户端和服务器端发生的事情可能完全不相关并且分离;和
>客户端发生的事情发生在客户端,服务器无需知道.服务器应该处理并运行给予它们的内容,如果客户端事件发生,那么进程如何生效并不是由他们决定的;等等等等.
这显然是我的想法.我想知道其他人的想法以及是否有关于这个主题的讨论.
从这个参数分支的主题可以达到:
>代码管理:从服务器端渲染所有内容是否更容易?
>关注点分离:如果将客户端逻辑分离到服务器端逻辑,是否更容易?
>效率:在编码和运行方面效率更高?
在一天结束时,我正试图让我的团队走向第二种方法.这支球队中有很多老球员都害怕这种变化.我只想用正确的事实和统计数据说服他们.
让我知道你的想法.
更新1:看起来我们所有参与这篇文章的人都有共同的想法;很高兴知道其他人也有同样的想法.现在要说服这些人;)谢谢大家.
解决方法:
你的第二个例子远远优于第一个例子. Javascript是您的行为层,应该与您的语义标记(内容)和CSS(演示文稿)分开.这是更好的架构有很多原因:
>鼓励逐步提升.正如您所提到的,后端代码应该在没有JS的情况下正常工作.您不能依赖拥有JS的客户.这样你可以在没有JS的情况下构建一次,然后可以增强那些使用JS的人的体验(例如通过添加客户端验证以及服务器端验证,以便客户端可以获得即时反馈)
>清洁标记.通常会减少下载大小.一个可重用的选择器在一个单独的JS文件中,可以在页面之间缓存和共享,而不是每个元素上的处理程序.
>所有的JS都在一个重复使用的地方.例如如果您的代码打开了一个弹出窗口并且您决定更改窗口的尺寸,那么您将在JS文件的代码中更改一次,而不必在每个内联处理程序中更改它.
还有很多其他论点和理由,但它们应该让你开始……
此外,从您的示例中可以看出,您的文档中有一个可以删除内容的普通链接.这也是一种不好的做法.删除或更新内容的任何内容都应该在POST(而不是GET)请求上完成.所以它应该是提交表格的结果.否则例如只需抓取您的网页,googlebot就会意外删除您的所有内容(搜索引擎机器人不执行JS,因此您的警报无法帮助)
javascript – Ajax被认为是客户端还是服务器端脚本?
解决方法
今天关于javascript – 为什么在控制器中操作DOM被认为是个坏主意?和js操作dom为什么消耗性能的介绍到此结束,谢谢您的阅读,有关3、JavaScript操作DOM对象、asp.net – 为什么在web.config中保存动态数据是个坏主意?、asp.net – 在服务器端级别渲染javascript.好主意还是坏主意?、javascript – Ajax被认为是客户端还是服务器端脚本?等更多相关知识的信息可以在本站进行查询。
本文标签: