在firefox, webkit中我们可以使用DOMNodeInsertedIntoDocument事件,但这个事件很快变废弃了,虽然浏览器还是很有节操地支持它们,但哪一天不在也很难说。比如说firefox22已经不支持了,IE则始终不支持此事件。

这里有个脚本,可以判定浏览器是否支持变动事件

  1. var mutations = (function (document) {
  2. // (C) WebReflection - Mit Style License
  3. var
  4. type = [
  5. "DOMSubtreeModified",
  6. "DOMNodeInserted",
  7. "DOMNodeRemoved",
  8. "DOMNodeRemovedFromDocument",
  9. "DOMNodeInsertedIntoDocument",
  10. "DOMAttrModified",
  11. "DOMCharacterDataModified"
  12. ],
  13. documentElement = document.documentElement,
  14. method = "EventListener",
  15. data = "deleteData",
  16. p = document.createElement("p"),
  17. mutations = {},
  18. i
  19. ;
  20. function check(addOrRemove) {
  21. for (i = type.length; i--;) {
  22. p[addOrRemove](type[i], cb, false);
  23. documentElement[addOrRemove](type[i], cb, false);
  24. }
  25. }
  26. function cb(e) {
  27. mutations[e.type] = true;
  28. }
  29. check("add" + method);
  30. documentElement.insertBefore(
  31. p,
  32. documentElement.lastChild
  33. );
  34. p.setAttribute("i", i);
  35. p = p.appendChild(document.createTextNode(i));
  36. data in p && p[data](0, 1);
  37. documentElement.removeChild(p = p.parentNode);
  38. check("remove" + method);
  39. return (p = mutations);
  40. }(document));

《Detect DOM Node Insertions with JavaScript and CSS Animations》这篇文章中,作者提供了一个方法,教我们利用keyframe CSS3开始动画事件来监听节点的插入。

  1.  
  2. /* set up the keyframes */
  3. @keyframes nodeInserted {
  4. from { clip: rect(1px, auto, auto, auto); }
  5. to { clip: rect(0px, auto, auto, auto); }
  6. }
  7.  
  8. @-moz-keyframes nodeInserted {
  9. from { clip: rect(1px, auto, auto, auto); }
  10. to { clip: rect(0px, auto, auto, auto); }
  11. }
  12.  
  13. @-webkit-keyframes nodeInserted {
  14. from { clip: rect(1px, auto, auto, auto); }
  15. to { clip: rect(0px, auto, auto, auto); }
  16. }
  17.  
  18. @-ms-keyframes nodeInserted {
  19. from { clip: rect(1px, auto, auto, auto); }
  20. to { clip: rect(0px, auto, auto, auto); }
  21. }
  22.  
  23. @-o-keyframes nodeInserted {
  24. from { clip: rect(1px, auto, auto, auto); }
  25. to { clip: rect(0px, auto, auto, auto); }
  26. }
  27.  
  28. #parentElement > li {
  29. padding: 10px;
  30. background: #FF6A6A;
  31. margin-bottom: 10px;
  32. animation-duration: 0.001s;
  33. -o-animation-duration: 0.001s;
  34. -ms-animation-duration: 0.001s;
  35. -moz-animation-duration: 0.001s;
  36. -webkit-animation-duration: 0.001s;
  37. animation-name: nodeInserted;
  38. -o-animation-name: nodeInserted;
  39. -ms-animation-name: nodeInserted;
  40. -moz-animation-name: nodeInserted;
  41. -webkit-animation-name: nodeInserted;
  42. }
  43.  
  44. <script>
  45. window.onload = function() {
  46.  
  47. var count = 0,
  48. insertListener = function(event){
  49. console.warn("Another node has been inserted! ", event);
  50. if (event.animationName == "nodeInserted") {
  51. event.target.textContent = "Element " + count++ + " has been injected!";
  52. }
  53. }
  54.  
  55. document.addEventListener("animationstart", insertListener, false); // standard + firefox
  56. document.addEventListener("MSAnimationStart", insertListener, false); // IE
  57. document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari
  58.  
  59. // Insert a new element
  60. setInterval(function(){
  61. document.getElementById("parentElement").appendChild(document.createElement("li"))
  62. }, 2000);
  63.  
  64. };
  65. </script>
var WeakMap = WeakMap || function(){
/*!(C) WebReflection - Mit Style !*/
// WARNING: DO NOT FORGET TO DELETE KEYS WHEN POSSIBLE
// MEMORY GREEDY, UNSAFE, BROKEN SHIM
var w = [].indexOf || function(v){
for(i=this.length;i--&&this[i]!==v;);return i},
i, k, v;
function c(){
k = [];
v = [];
}
function h(o) {
return -1

再看一下它的替代品MutationObserver,发现这厮不支持这功能,它只能监听自身或其后代的变化。因此还是用CSS方法或animationstart,IE6-9只能setInterval了!

posted on
2013-07-15 21:24 
司徒正美 
阅读(...) 
评论(...) 
编辑 
收藏

判定元素正在插入到DOM树——DOMNodeInsertedIntoDocument的更多相关文章

  1. 判定元素是否刚插入到DOM树

    上接<这篇博文>,其应用于avalon的if绑定.如果一个节点还没有插入DOM树,那么avalon将延时对它进行扫描渲染,直到它再次插入到DOM树为止.由于CSS3 keyframe动画的 ...

  2. 通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置

    zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我 ...

  3. DOM树操作

    DOM 操作 访问与树关系(节点) 绘制 DOM 树: childNodes, attributes 从一个中心元素访问其所有的直系亲属元素 访问父节点: parentNode 访问上一个兄弟节点: ...

  4. 从Chrome源码看浏览器如何构建DOM树

    .aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } p { font-size: 1 ...

  5. JS的Dom树小结

    一[DOM树节点]  DOM节点分为三大类:元素节点.文本节点.属性节点 文本节点.属性节点,为元素节点的两个子节点:  通过getElement系列方法,可以去到元素节点.     二[查看节点] ...

  6. DOM树节点和事件

    一.前言:DOM树节点是JS的基础语句.通过节点,能够取到HTML代码中的任意标签,从而对其进行修改和添加各种视觉效果. 二.DOM树节点    DOM节点分为三大类: 元素节点,属性节点,文本节点  ...

  7. 深入解析浏览器的幕后工作原理(三) 呈现树和 DOM 树的关系

    呈现树和 DOM 树的关系 呈现器是和 DOM 元素相对应的,但并非一一对应.非可视化的 DOM 元素不会插入呈现树中,例如"head"元素.如果元素的 display 属性值为& ...

  8. 超全面的JavaWeb笔记day04<dom树等>

    1.案例:在末尾添加节点(*****) 创建标签 createElement方法 创建文本 createTextNode方法 把文本添加到标签下面 appendChild方法 2.元素对象(了解) 如 ...

  9. DOM树节点关系

    DOM是JS中专门操作HTML页面内容的 他的三种基本使用方法是: 1.  document.getElementById(''):  ——>选取html页面中带有Id的属性名: 2.docum ...

随机推荐

  1. hdu 4810 Wall Painting (组合数学+二进制)

    题目链接 下午比赛的时候没有想出来,其实就是int型的数分为30个位,然后按照位来排列枚举. 题意:求n个数里面,取i个数异或的所有组合的和,i取1~n 分析: 将n个数拆成30位2进制,由于每个二进 ...

  2. Android Camera 使用小结

    Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Inten ...

  3. Trianglify – 五彩缤纷的 SVG 背景图案

    Trianglify 是一个能够生成五颜六色的三角形图案的 JavaScript 库,可以用来作为 SVG 图像和 CSS 背景.它的灵感来自于 Btmills 的 Geopattern,并使用 d3 ...

  4. 搜索浅谈(Elasticsearch和Lucene4分享)

    刚刚过去的双11,真是给线下运营商好好上了一课.当今的互联网真是炙手可热,大家对互联网的热情是如此之高.相信电商之间的竞争将更加的激烈和残酷,不过,搜索,作为用户体验很重要的一点,各大电商也做的越来越 ...

  5. HDU 1548 A strange lift 奇怪的电梯(BFS,水)

    题意: 有一座电梯,其中楼层从1-n,每层都有一个数字k,当处于某一层时,只能往上走k层,或者下走k层.楼主在a层,问是否能到达第b层? 思路: 在起点时只能往上走和往下走两个选择,之后的每层都是这样 ...

  6. 微软推出首个Microsoft Azure Stack技术预览版

    Mike Neil,微软公司企业云副总裁 怀着对于提高业务灵活性.加速创新的期待,很多企业正在向云平台迅速迁移.伴随着这样的趋势,我们也见证了微软智能云Azure业务在全球市场的快速增长--每个月近1 ...

  7. python numpy array 的一些问题

    1 将list转换成array 如果list的嵌套数组是不规整的,如 a = [[1,2], [3,4,5]] 则a = numpy.array(a)之后 a的type是ndarray,但是a中得元素 ...

  8. Android 高仿微信 获取最近刚刚拍照的缩略图 功能实现

    原理其实挺简单的,android 中文件 修改 增加 删除等等 都会在数据库里的某个表里记录下来,你需要的时候 只要迅速的去查找这个表里的值 即可得到你想要的所有信息. 实际上 如果真正理解这个表结构 ...

  9. MVC-READ5(asp.net web from PK asp.net MVC)

    webform: ViewState问题 页面生命周期 不能很好的分解关注点 对HTML操控受限 抽象不完全 可测试性弱

  10. ulimit 命令

    用途:ulimit用于shell启动进程所占用的资源. 类别:shell内建命令 语法格式:ulimit [-acdfHlmnpsStvw] [size] 参数: -H 设置硬资源限制. -S 设置软 ...