GVKun编程网logo

javascript – 为什么在控制器中操作DOM被认为是个坏主意?(js操作dom为什么消耗性能)

2

如果您想了解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为什么消耗性能)

javascript – 为什么在控制器中操作DOM被认为是个坏主意?(js操作dom为什么消耗性能)

许多人告诉我,在控制器中操作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对象

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中保存动态数据是个坏主意?

    asp.net – 为什么在web.config中保存动态数据是个坏主意?

    我的公司有一个应用程序,它以编程方式在web.config文件中存储一个值. web.config文件大约每五分钟更新一次.

    James Curran发表在这个答案Dynamically change connectionString in web.config中以编程方式修改web.config是一个坏主意,但他没有解释为什么这是一个坏主意.

    我正在寻找说服我的老板不在web.config文件中存储任何动态数据的理由.特别感谢与优秀文章的链接.

    解决方法

    每次修改web.config时,应用程序都会重新启动.

    asp.net – 在服务器端级别渲染javascript.好主意还是坏主意?

    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 – Ajax被认为是客户端还是服务器端脚本?

    Ajax被视为客户端或服务器端脚本吗?

    解决方法

    协调 AJAX方法(即 javascript)的技术是客户端的,尽管需要服务器端脚本/ servlet来提供响应.

    今天关于javascript – 为什么在控制器中操作DOM被认为是个坏主意?js操作dom为什么消耗性能的介绍到此结束,谢谢您的阅读,有关3、JavaScript操作DOM对象、asp.net – 为什么在web.config中保存动态数据是个坏主意?、asp.net – 在服务器端级别渲染javascript.好主意还是坏主意?、javascript – Ajax被认为是客户端还是服务器端脚本?等更多相关知识的信息可以在本站进行查询。

    本文标签: