`
yiminghe
  • 浏览: 1460139 次
  • 性别: 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:'...

    Ext.form.FieldSet的用法.pdf

    8. **bodyCfg**:这是一个 `Ext.DomHelper` 配置对象,用于定义 FieldSet 内容区域(body)的结构。你可以用它来创建特定的 HTML 结构,比如居中内容。 9. **headerCfg** 和 **footerCfg**:这两个配置分别用于定义...

    ExtJS入门教程(超级详细)

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

    ext核心api详解(2)

    EXT 核心 API 详解(四) - Ext.DomQuery/DomHelper/Template EXT JS 是一个专注于构建前端用户界面的JavaScript框架,它独立于后台技术,主要利用Ajax技术实现丰富的交互效果。本文将深入探讨EXT JS的核心API,特别...

    EXT核心API详解.doc

    9. **Ext.DomHelper类**:用于创建和修改DOM元素的工具类,提供了更简洁的API。 10. **Ext.Template类**:模板类,可以用来生成动态HTML内容。 11. **Ext.EventManager类**:事件管理类,负责事件的监听和分发。 ...

    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 设计模式之一.docx

    通过这种方式,ExtJS确保了像`Ext.DomHelper`和`Ext.DomQuery`这样的工具类在整个应用中只被初始化一次,从而提高了性能并减少了内存消耗。 #### 四、单例模式的优点 - **唯一性**:确保在整个应用中只有一个实例...

    Ext.form.FieldSet的用法.docx

    1. **checkboxToggle**: 如果设置为`true`,FieldSet会在legend标签前添加一个复选框,用户可以通过勾选这个复选框来展开或折叠FieldSet。你可以传递一个DOMHelper配置对象来定制这个复选框的外观。 2. **checkbox...

    EXT核心API详解(第一部分)

    4. **String**:EXT对字符串对象也进行了扩展,添加了诸如`String.capitalize`首字母大写,`String.format`格式化字符串,`String.trim`去除两端空格等实用方法。 5. **EXT核心API详解(三)-Ext.DomQuery DomHelper ...

    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....

    extJs 2.1学习笔记

    目录 1. ExtJs 结构树 2 2. 对ExtJs的态度 3 3. Ext.form概述 4 4. Ext.TabPanel篇 5 5. Function扩展篇 7 6. Ext.data.Store篇 10 ...27. extJs 2.0学习笔记(DomHelper.js篇) 76 28. extJs 2.0学习笔记(ext.js篇) 77

    Ext API详解--笔记

    在`EXT核心API详解(三)-Ext.Element.txt`中,你将了解到如何选择元素、添加和移除CSS类、处理事件、动画效果以及布局调整。 2. **Array, Date, Function, Number, String**: 在`EXT核心API详解(二)-Array Date ...

Global site tag (gtag.js) - Google Analytics