ホームページ >ウェブフロントエンド >jsチュートリアル >HTML DOM を操作するためのネイティブ API を破壊するノード操作用の API ノード_JavaScript スキル
第一次看到敏捷开发的定义,我就被敏捷开发迷住了。通俗来说,敏捷开发可以让我们用过的代码可以再次重用,因为是再次重用,所以相对安全,再次调试也没有第一次那么费心,省时省力。不断重用代码的过程中把存在的bug不断的修复,也因为不断的去重用, 这个模板变得起越来越独立,适用的情况越来越广范,最后在安全方面达到铜墙铁壁,在开发方面达到随心所欲,在维护方面达到从容面对。
敏捷开发的确是利害,但如何练就这种深奥的武功呢?就我自身的情况靠人传授武功是不可能了,因为公司就我一个做开发的,苦思幂想之后,决定从开源的优秀框架入手,把它一行一行代码看懂,然后再为我所用。因为是一个人开发,前台和后台都得包办,哪从那一面做起呢? 之前有过一二个月的开发经验,觉得前台的JS很费时,而且老觉得在做重复的事情,比如发ajax请求,接收结果之后操作节点(有时候遇到不兼容的情况,如select和table在IE下不支持使用innerHTML,style在IE不会自动转化为字符串,要用cssText代替,一旦这些情况遇上,真得是无比打击程序员的积极性,因为你要为此花时间去找替代方案,去调试),还有节点轮换,弹出层,表单验证等一系列烦琐工作。所以我就坚决从前台的JS做起。为了练就怎么把JS的重用性提高,我选择向Jquery取经。花了几个月看了一大半,略有所得。我其中之一的JS模块“无限深度操作节点”(文采不好,名字不妥别见怪)出来了。有了它,我在操作节点方面变得容易,代码变得精简,而且不用写额外的代码去兼容浏览器,谈笑中,功能就完成了。
//执行代码: $id('jkit').innerHTML = ''; //IE下并没有报任何错误,但select一个option节点都没有了。如果你对table使用innerHTML,IE会报unknown runtime error |
//执行代码: $id('jkit').innerHTML = ''; //这样IE也成功改变select,但这种做法有个缺点,如果你对select注册过事件,这些事件会全部丢失,你要外加代码来重新注册事件。 |
//现在我想在jkit之前多加一个option,用原生的DOM方法实现: var newNode = document.createElement('option'),//新建一个节点 selector = document.getElementById('jkit3'), /* 也可以用selector.options,但getElementsByTagName更通用。 那用childNodes怎么?最好也不要,对于空白节点,IE和FF的处理方式不一样, 就这例子,在FF中,select的firstChild是空白文本节点, 因为select和第一个option之间有换行以及空白字符, FF会为其创建节点,而IE会忽略 */ options = document.getElementsByTagName('option'); newNode.setAttribute('value','new'); //newNode.setAttribute('text','NewNode');text不支持这样设置 //newNode.text = 'NewNode';ie不支持这种方式 newNode.innerHTML = 'NewNode'; selector.insertBefore(newNode,options[1]);//在kit之前插入 |
//现在我想在第一个li之前多加一个option,用原生的DOM方法实现: newNode = document.createElement('li'), table = document.getElementById('jkit4'), //取li的父节点: uls = table.getElementsByTagName('ul'), /* getElementsByTagName虽然通用,但如果li标签里面嵌套了li,li父节点的兄弟节点也有li的话,那么getElementsByTagName都会取到这些节点,如果你的html结构真有哪么复杂,取出来结果后你也很难定位到你想找的li节点。遇到这情况,你只以通过childNodes一层层往下找,但之前提过childNodes在IE和FF中行为是不致的,所以你还要做兼容处理。*/ lis = table.getElementsByTagName('li'); newNode.innerHTML = 'NewNode'; //在指定位置插入 uls[0].insertBefore(newNode,lis[0]); |
|
/* 以下のコードは、新しいオブジェクトを再構築することに相当する、無制限の層のオブジェクトのオブジェクトを示しています。新しいオブジェクト バンドには、新しい作成方法があります。新しいオブジェクトの参照は table であり、table も新しいルートです。その後続オブジェクトは 2 番目のパラメータchilds によって決定されます。新しいルート参照は、後続オブジェクトを操作するためのエントリです。childs は次の 2 番目のパラメータです。数値グループの最初の要素は tr であり、dom ルート ルートの子ポイント tr が存在しない場合、新しいオブジェクトは構築されません。tr 内に tr が存在する場合、オブジェクトは再構築されません。 、 2 番目の要素は td 番目、つまり 2 つあるということですか? th は、新しいオブジェクトを構築すると同時に削除され、スペースで区切られ、検出される順序が制限されない場合には、td であってもよい。第三个元素为select ul,为什么这两个可以写在一起?因为他们位于同一层次的,相对于根节点,它们都在第三层。只要同一层次的都可以写在一起。后面的以此类推,数量不限,就是无限层次了。新对象树的层次结构和原dom树的层次结构是一一对应的。 */ root = document.getElementById('category'), childs = ['tr', 'td th', 'select ul', 'li option'], table = $CL.newObj('maNode', [root, childs]); |