javascript 一段代码引发的思考第1/2页

 更新时间:2009年01月01日 15:30:50   作者:  
写在前面:这是一个关于Ext, Prototype, JavaScript方面的问题,其实下面遇到的问题本不是问题,都是因为错误的理解造成的,本文的宗旨是希望读者朋友避免我犯的同类错误,遇事三思而后行,同时也体会下发现问题,解决问题,反思问题这种精神活动所带来的快乐!
在2008年的最后一天,在此祝愿大家元旦快乐!!!
郑重声明:此问题根本不是问题,现在看来就是本人知识匮乏,庸人自扰,望广大朋友勿喷!!
细心发现问题,耐心解决问题,信心面对问题.
作者:白某人
长话短说:”服务员,上代码....”
测试代码:

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]

以下是在IE下的测试.我所期望的结果是(旁白:我已经开始犯错了):
<div id="div88">this is div88</div>
<div id="div2">this is div2</div>
<div id="div3">this is div3</div>
实际结果:
<div id="div88">this is div88</div>
问题:
Div2,div3 丢了?
发现问题怎么办?看代码.
Template.js line:197 (Extjs ver 2.2)
append : function(el, values, returnElement){
return this.doInsert('beforeEnd', el, values, returnElement);
}
在看 line201:
doInsert : function(where, el, values, returnEl){
el = Ext.getDom(el);
var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
return returnEl ? Ext.get(newNode, true) : newNode;
}
在在看:DomHelper.js line:267
insertHtml : function(where, el, html){
where = where.toLowerCase();
if(el.insertAdjacentHTML){
if(tableRe.test(el.tagName)){
var rs;
if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){
return rs;
}
}
switch(where){
case "beforebegin":
el.insertAdjacentHTML('BeforeBegin', html);
return el.previousSibling;
case "afterbegin":
el.insertAdjacentHTML('AfterBegin', html);
return el.firstChild;
case "beforeend":
el.insertAdjacentHTML('BeforeEnd', html);
return el.lastChild;
case "afterend":
el.insertAdjacentHTML('AfterEnd', html);
return el.nextSibling;
}
throw 'Illegal insertion point -> "' + where + '"';
}
//////后面省略
}
原来还是用的insertAdjacentHTML方法,为什么会有问题呢?
输出中间代码:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
tpl.append('div1',{id:'2'});
tpl.insertAfter('div2',{id:'3'});
$("result-area").innerText = Ext.getDom("div1").innerHTML;
//.........
结果如下:
this is div1
<DIV id=div2>this is div2</DIV>
<DIV id=div3>this is div3</DIV>
?????? 为什么会这样? “this is div1”两边的<div>标签呢?
在测试:
var tpl = new Ext.Template('<div id="div{id}">this is div{id}</div>');
tpl.append('div1',{id:'2'});
tpl.insertAfter('div2',{id:'3'});
$("result-area").innerText = Ext.getDom("div1").outerHTML;
//.........
结果如下:
<DIV id=div1>
this is div1
<DIV id=div2>this is div2</DIV>
<DIV id=div3>this is div3</DIV>
</DIV>
(旁白:本来到这就已经能发现问题所在了,但执迷不悟,继续犯错)
原来它把div2,div3插到div1的value/text 后边了.所以运行tpl.overwrite('div1',{id:'88'});后div2,div3没了.
在此附上tpl.overwrite源码(innerHTML直接赋值):
overwrite : function(el, values, returnElement){
el = Ext.getDom(el);
el.innerHTML = this.applyTemplate(values);
return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
}
问题知道了,可怎么办呢,改Ext源码?

相关文章

  • JavaScript Promise 用法

    JavaScript Promise 用法

    “Promises”渐渐成为JavaScript里最重要的一部分,大量的新API都开始promise原理实现。这篇文章主要为大家详细介绍了JavaScript Promise 用法,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 基于Three.js制作一个3D中国地图

    基于Three.js制作一个3D中国地图

    这篇文章主要为大家介绍一个用Three.js制作的3D中国地图,文中的示例代码讲解详细,对我们学习three.js有一定帮助,感兴趣的可以跟随小编一起试一试
    2022-01-01
  • 微信小程序实现导航栏选项卡效果

    微信小程序实现导航栏选项卡效果

    这篇文章主要为大家详细介绍了微信小程序实现导航栏选项卡效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Bootstrap在线电子商务网站实战项目5

    Bootstrap在线电子商务网站实战项目5

    这篇文章主要为大家分享了Bootstrap在线电子商务网站实战项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • JavaScript实现的多个图片广告交替显示效果代码

    JavaScript实现的多个图片广告交替显示效果代码

    这篇文章主要介绍了JavaScript实现的多个图片广告交替显示效果代码,涉及javascript数组遍历及页面元素动态操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • JS中数组Array的用法示例介绍

    JS中数组Array的用法示例介绍

    这篇文章主要介绍了JS中数组Array的用法,需要的朋友可以参考下
    2014-02-02
  • JavaScript Array.flat()函数用法解析

    JavaScript Array.flat()函数用法解析

    这篇文章主要介绍了JavaScript Array.flat()函数用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • javascript异步编程代码书写规范Promise学习笔记

    javascript异步编程代码书写规范Promise学习笔记

    这篇文章主要介绍了javascript异步编程代码书写规范Promise学习笔记,需要的朋友可以参考下
    2015-02-02
  • 详解JavaScript的数据类型以及数据类型的转换

    详解JavaScript的数据类型以及数据类型的转换

    这篇文章主要介绍了JavaScript的数据类型以及数据类型的转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • bootstrap Table的一些小操作

    bootstrap Table的一些小操作

    这篇文章主要为大家详细介绍了bootstrap Table的一些小操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论