`
yiminghe
  • 浏览: 1434202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ext.DomHelper 添加 option 问题

阅读更多

   随着Ext 3.0 core beta的降临,积极响应号召,一步步将ext core应用到 web page上面,当然先用稳定的ext 2.2了。

 

   今天碰到一个奇怪的问题 ,希望与大家分享,免得再遇到。

 

   首先看下面的一段代码:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
	<head>
<title>select 测试 </title>
<script src='ext-base.js' type='text/javascript'></script>
<script src='ext-core.js' type='text/javascript'></script>
</head>
<body>
	<select id='test_select'>
		
	</select>
	
<script type='text/javascript'>
	Ext.onReady(function() {
		
	
		Ext.DomHelper.append(Ext.get('test_select'), {tag:'option',value:1,html:'出来了'});
	});
		
	
</script>	

</body>
</html>
 

    我们期望的是 select 的 option 元素能够动态创建 ,事实上 确实 firefox成功达到了我们的期望,而ie系列则不出意料奇怪的失败了。

 

 

 

那么就分析一下 : Ext.DomHelpe.append 吧

 

append : function(el, o, returnElement){
        el = Ext.getDom(el);
        var newNode;
        //默认 useDom 为 false
        if(this.useDom){
            newNode = createDom(o, null);
            el.appendChild(newNode);
        }else{
         
         //我们到这了 ,构造 <option> html 串
            var html = createHtml(o);
          // 主要是这个
            newNode = this.insertHtml("beforeEnd", el, html);
        }
        return returnElement ? Ext.get(newNode, true) : newNode;
    },

 

那么主要就看 insertHtml   ,将 构造的 option 串 插入到 select 中。

 

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 + '"';
        }
        var range = el.ownerDocument.createRange();
        var frag;
        switch(where){
             case "beforebegin":
                range.setStartBefore(el);
                frag = range.createContextualFragment(html);
                el.parentNode.insertBefore(frag, el);
                return el.previousSibling;
             case "afterbegin":
                if(el.firstChild){
                    range.setStartBefore(el.firstChild);
                    frag = range.createContextualFragment(html);
                    el.insertBefore(frag, el.firstChild);
                    return el.firstChild;
                }else{
                    el.innerHTML = html;
                    return el.firstChild;
                }
            case "beforeend":
                if(el.lastChild){
                    range.setStartAfter(el.lastChild);
                    frag = range.createContextualFragment(html);
                    el.appendChild(frag);
                    return el.lastChild;
                }else{
                    el.innerHTML = html;
                    return el.lastChild;
                }
            case "afterend":
                range.setStartAfter(el);
                frag = range.createContextualFragment(html);
                el.parentNode.insertBefore(frag, el.nextSibling);
                return el.nextSibling;
            }
            throw 'Illegal insertion point -> "' + where + '"';
    }
 

 

 

可见 ,ext 出于 性能的考虑 ,默认不直接采用dom插入,而采用 构造html 串 ,对于 ie 利用 insertAdjacentHTML ,而对 fx 则使用 range .

 

 

Ext的作者 考虑到了 对于 table 需要特殊处理  ,对于 table 系列 则采用 insertIntoTable.

 

而对于 option 作者 不知为什么没有考虑 ,于是 ie 的 insertAdjacentHTML 失效了.

(  ps : 后来查到 很早的一个源于1.x 的 bug : http://extjs.com/forum/archive/index.php/t-1902.html

 

jack.slocum

01-28-2007, 02:24 PM
IE doesn't support any HTML injection with selects. Sorry, I should have been a little clearer.

不知为什么 ,作者一直没在代码里特殊判断 ,直到 最新的Ext 3.0 beta  还是 ie 不起作用。)



解决方法 若果要通用的话只能 采用 强制 采用dom 方式了


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
	<head>
<title>select 测试 </title>
<script src='ext-base.js' type='text/javascript'></script>
<script src='ext-core.js' type='text/javascript'></script>
</head>
<body>
	<select id='test_select'>
		
	</select>
	
<script type='text/javascript'>
	Ext.onReady(function() {
		
		//为了使 ie 能够运行 :
		Ext.DomHelper.useDom=true;
		Ext.DomHelper.append(Ext.get('test_select'), {tag:'option',value:1,html:'出来了'});
	});
		
	
</script>	

</body>
</html>
 

ps :John  Resig 关于 insertAdjacentHTML  的一点看法   http://ejohn.org/blog/dom-insertadjacenthtml/



 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    EXT核心API详解

    9、Ext.DomHelper类 …………………… 14 10、Ext.Template类 …………………… 14 11、Ext.EventManager类 ……………… 15 12、Ext.EventObject类 ………………… 15 13、Ext.CompositeElement类 ………… 16 14、...

    Ext grid To Excel

    fd=Ext.DomHelper.append(Ext.getBody(),{tag:'form',method:'post',id:'frmDummy',action:'exportexcel.jsp', target:'_blank',name:'frmDummy',cls:'x-hidden',cn:[ {tag:'input',name:'exportContent',id:'...

    ExtJS入门教程(超级详细)

    9、Ext.DomHelper类 …………………… 14 10、Ext.Template类 …………………… 14 11、Ext.EventManager类 ……………… 15 12、Ext.EventObject类 ………………… 15 13、Ext.CompositeElement类 ………… 16 14、...

    ExtJSWeb应用程序开发指南(第2版)

    6.3.2 Ext.core.DomHelper.applyStyles() 6.3.3 createTemplate() 6.3.4 insertAfter() 6.3.5 insertBefore() 6.3.6 insertFirst() 6.3.7 insertHtml() 6.3.8 overwrite() 6.4 Ext.core....

    ext 中文 api

    API 参考 API 参考里面详细描述了所有能在 Ext 类库里面找到的类和组件。最常用的类有: Ext.Element Ext.BorderLayout Ext.DomHelper Ext.TabPanel Ext.UpdateManager

    extJs 2.1学习笔记

    extJs 2.1学习笔记 此资料收集于网上.. 1. ExtJs 结构树 2 2. 对ExtJs的态度 3 3. Ext.form概述 4 4. Ext.TabPanel篇 5 ...27. extJs 2.0学习笔记(DomHelper.js篇) 76 28. extJs 2.0学习笔记(ext.js篇) 77

    ExtJs学习笔记,共30讲

    ExtJs学习笔记,共30讲 1. ExtJs 结构树 2 2. 对ExtJs的态度 3 3. Ext.form概述 4 4. Ext.TabPanel篇 5 5. Function扩展篇 7 ...27. extJs 2.0学习笔记(DomHelper.js篇) 76 28. extJs 2.0学习笔记(ext.js篇) 77

    Ext深入浅出 数据传输

    11.2.2 Ext.DomHelper. applyStyles函数.............275 11.2.3 Template模板....................276 11.2.4 Ext.DomHelper. createTemplate函数......278 11.2.5 复杂模板XTemplate..........279 11.3 用Ext....

    精通JS脚本之ExtJS框架.part1.rar

    6.3.6 DomHelper简介 6.4 DomQuery入门 6.4.1 元素选择符Selector 6.4.2 属性选择符Attributes Selectors 6.4.3 CSS值元素选择符 6.4.4 Ext.query与Ext.select 6.5 应用模板 6.5.1 Ext.Template 6.5.2 Ext....

    EXTJS总结.txt

    1.Ext.get var el = Ext.get('myElementId');//获取元素,等同于document.getElementById('myElementId');//会缓存 2. Ext.fly var el = Ext.fly('myElementId')//不需要缓存。 注:享元模式(Flyweight Design ...

    精通JS脚本之ExtJS框架.part2.rar

    6.3.6 DomHelper简介 6.4 DomQuery入门 6.4.1 元素选择符Selector 6.4.2 属性选择符Attributes Selectors 6.4.3 CSS值元素选择符 6.4.4 Ext.query与Ext.select 6.5 应用模板 6.5.1 Ext.Template 6.5.2 Ext....

    Ext 开发指南 学习资料

    1.2. 看看ext-2.0.2的文档 1.3. 为什么有的例子必须放在服务器上才能看到效果? 1.4. 为什么自己按照例子写的代码,显示出来总找不到图片 1.5. 我们还需要什么? 1.6. 入门之前,都看helloworld。 1.6.1. 直接使用...

    掏钱学Ext(完整版) 附全部源码

    1.2. 看看ext-1.1.1的文档 1.3. 看看ext-2.0的文档 1.4. 为什么有的例子必须放在服务器上才能看到效果? 1.5. 为什么自己按照例子写的代码,显示出来总找不到图片 1.6. 我们还需要什么? 2. 震撼吧!让你知道...

    EXT2.0中文教程

    1.2. 看看ext-1.1.1的文档 1.3. 看看ext-2.0的文档 1.4. 为什么有的例子必须放在服务器上才能看到效果? 1.5. 为什么自己按照例子写的代码,显示出来总找不到图片 1.6. 我们还需要什么? 1.7. 入门之前,都看hello...

    轻松搞定Extjs_原创

    二、Ext.DomHelper类 36 三、Ext.XTemplate 38 四、小结 39 第七章:格式化 40 一、用户需要优秀体验的内容 40 二、Ext.util.Format类 40 三、再谈XTemplete 44 四、如果连Format都不能满足XTemplete的需要呢? 45 ...

    EXT教程EXT用大量的实例演示Ext实例

    1.2. 看看ext-1.1.1的文档 1.3. 看看ext-2.0的文档 1.4. 为什么有的例子必须放在服务器上才能看到效果? 1.5. 为什么自己按照例子写的代码,显示出来总找不到图片 1.6. 我们还需要什么? 1.7. 入门之前,都看...

    ext JS API 实战

    其它控件都是建立在这些底层api的基础上,底层api位于源代码目录的core子目录中,包括DomHelper.js、Element.js等文件,如图xx所示。 控件(widgets):控件是指可以直接在页面中创建的可视化组件,比如面板、...

    ExtJS 2.0实用简明教程 之Ext类库简介

    其它控件都是建立在这些底层api的基础上,底层api位于源代码目录的core子目录中,包括DomHelper.js、Element.js等文件,如图xx所示。   控件(widgets):控件是指可以直接在页面中创建的可视化组件,比如面板、选项...

    esperanto-problem:说明世界语 CLI 问题的回购

    世界语问题说明世界语 CLI 问题的回购。 运行esperanto -b -i htmlbars-runtime.js -o htmlbars-runtime-bundle.js --strict 查看runtime-bundle文件。 在底部注意以下代码行: __export ( 'hooks' , function ( ) {...

Global site tag (gtag.js) - Google Analytics