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 History对象原理解析

    javascript History对象原理解析

    这篇文章主要介绍了javascript History对象原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • JavaScript中slice和padEnd的使用小结

    JavaScript中slice和padEnd的使用小结

    本文介绍了JavaScript中slice和padEnd的使用小结,常常被用于数据处理、格式化和切割任务中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • js iframe跨域访问(同主域/非同主域)分别深入介绍

    js iframe跨域访问(同主域/非同主域)分别深入介绍

    js跨域是个讨论很多的话题。iframe跨域访问也被研究的很透了,本文今天就叨叨两句,感兴趣的朋友可以了解下,就当巩固知识了,希望本文对你有所帮助
    2013-01-01
  • 原生js ActiveXObject获取execl里面的值

    原生js ActiveXObject获取execl里面的值

    使用原生js获取execl里面的值,想必有很多的朋友都不会吧,下面有个不错的方法主要是使用ActiveXObject来实现,感兴趣的朋友可不要错过
    2013-11-11
  • Webpack完整打包流程深入分析

    Webpack完整打包流程深入分析

    webpack是一种前端资源构建工具,一个静态模块打包器(module bundler),下面这篇文章主要给大家介绍了关于Webpack完整打包流程的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • PHPExcel中的一些常用方法汇总

    PHPExcel中的一些常用方法汇总

    这篇文章主要介绍了PHPExcel中的一些常用方法汇总,本文直接给出操作代码实例,代码中对常用方法给出了注释,需要的朋友可以参考下
    2015-01-01
  • 基于HTML+JS实现简单的年龄计算器

    基于HTML+JS实现简单的年龄计算器

    JavaScript提供了一些内置的日期和时间函数,有助于从日期(出生日期)开始计算年龄。本文主要介绍了使用这些JavaScript方法,制作一个简单的年龄计算器,快来跟随小编一起学习学习吧
    2021-12-12
  • 微信小程序实现点击图片放大预览

    微信小程序实现点击图片放大预览

    这篇文章主要为大家详细介绍了小程序实现点击图片放大预览功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • JavaScript中的Proxy对象

    JavaScript中的Proxy对象

    这篇文章主要介绍了JavaScript中的Proxy对象的相关资料,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下
    2020-11-11
  • js判断登陆用户名及密码是否为空的简单实例

    js判断登陆用户名及密码是否为空的简单实例

    下面小编就为大家带来一篇js判断登陆用户名及密码是否为空的简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05

最新评论