关于动态创建option 【copy from 姬光】

news/2024/10/16 23:30:17/

在处理表单的时候,经常会有这样的需求:给定一定的数据来生成某个selectoption,或者更进一步,某些option或许预先选中或者有高亮显示。

 

下面我们就来温习一下几种option的创建方式。这个需求要求某些选项要预先有高亮显示,可以通过添加class来处理。

 

首先定义一个高亮的class,为了简单处理,只定义红色高亮:

 

<style type="text/css">

         .hot-games{

                   background-color: #f00;

         }

</style>

 

然后预先定义一些用来生成选项的数据:

 

<script type="text/javascript">

         var gameOptions = {

                   "options" : [

                   {

                            "name" : "魔兽世界",

                            "value" : "50007361",

                            "isHot" : "false"

                   },

                   {

                            "name" : "龙之谷",

                            "value" : "50007937",

                            "isHot" : "false"

                   },

                   {

                            "name" : "永恒之塔",

                            "value" : "50007385",

                            "isHot" : "true"

                   },

                   {

                            "name" : "奇迹世界",

                            "value" : "50007800",

                            "isHot" : "false"

                   }

                   ]

         };

</script>

 

这里是select元素,需要制定idname属性:

 

<select id="cat" name="cat" style="width:130px;"></select>

 

大致有三种方案可以增加option,一种是通过new Option() 构造函数,第二种是通过select.add()函数,第三种是通过增加innerHTML。下面比较一下三种方式的异同:

 

首先获取到select元素:

 

var gameCat = document.getElementById('cat');

 

第一种方案,通过new Option()构造函数,该函数属0DOM,所有浏览器都支持:

 

// 方案1:new Option()构造函数

for(var i=0, j=gameOptions.options.length; i<j; i++){

         gameCat.options[i] = new Option(gameOptions.options[i].name, gameOptions.options[i].value);

         if(gameOptions.options[i].isHot == 'true'){

                   gameCat.options[i].className = 'hot-games';

         }

}

 

new Option(text, value)第一个参数为显示的文字,第二个为value值,如果想设置其他属性需要单独操作。

 

第二种方案,通过document.createElement()来创建选项,然后再设置选项的属性。在这里w3c标准是可以设置optionlabel属性即为显示文本,但事实证明FF并不支持,只是给option增加了一个label属性。而w3c中定义的readonly的属性text,在FF中却可以设置。那么是否需要判断浏览器类型呢?当然不用,该方案代码如下:

 

// 方案2:add()

for (var i = 0, j = gameOptions.options.length; i < j; i++) {

         var option = document.createElement('option');

                  

                   try{

                            // 二级DOM中该属性为readonly,但FF确可写,且可显示为选项内容

                            option.text = gameOptions.options[i].name;

                   }catch(e){

                            // IE支持label,可以直接显示为选项的文字

                            option.label = gameOptions.options[i].name; 

                   }

 

                   option.value = gameOptions.options[i].value;

                   option.className = (gameOptions.options[i].isHot == 'true') ? 'hot-games' : '';

        

         // 如果不传第二个参数,FF下会报错

         gameCat.add(option, null);

}

 

这里要注意的add()函数的第二个参数,该参数为before,可以指定选项插到哪个选项之前,如果为null则插到最后。如果不指定这个参数在IE系不会有问题,FF下会报错,提示Not enough arguments,参数不足,所以最好传个null先。

 

第三种方案,比较少用于select元素上,IE下是无效的,但是动态添加其他元素的孩子时经常用到。当然也可以设置元素属性后appendChild(),同方案二。这里要先把select隐藏掉,这样可以减少浏览器重绘次数,对于display='none'的元素的操作不会引起重绘或回流。再改变完之后再显示出来:

 

// 方案3innerHTML

// IE无效,FF可用

gameCat.style.display = 'none';

for (var i = 0, j = gameOptions.options.length; i < j; i++) {

         var isHot = (gameOptions.options[i].isHot == 'true') ? ' class="hot-games" ' : '';

         gameCat.innerHTML += '<option value='+gameOptions.options[i].value+isHot+'>'+gameOptions.options[i].name+'</option>';

}

gameCat.style.display = 'block';

 

这三种方式最常用的就是第一种了,没有兼容性问题,其他两种只是在此作为例子,展示创建option的方法。


http://www.ppmy.cn/news/394955.html

相关文章

js动态添加options(转载)

JS动态添加Option的几种方式 在处理表单的时候&#xff0c;经常会有这样的需求&#xff1a;给定一定的数据来生成某个select的option&#xff0c;或者更进一步&#xff0c;某些option或许预先选中或者有高亮显示。 下面我们就来温习一下几种option的创建方式。这个需求要求某…

编程菜鸟看云计算、移动互联网和物联网

通过联机黑白棋看云计算、移动互联网和物联网 一、联机黑白棋 终于把通信的一个小项目——联机版的黑白棋做出来了~ 说来真是惭愧&#xff0c;本来在暑假结束的时候就应该去做的&#xff0c;但是~╮(╯▽╰)╭ 先来说说黑白棋吧&#xff1a; 胡老师说&#xff1a;不要在没做一件…

C# 从零开始编写一个修改“植物大战僵尸”阳光的内存辅助

相信很多朋友都喜欢玩游戏&#xff0c;那么大多数人都会选择开挂 虽然最近在做一个C#天谕模拟G(类小精灵) 目测账号已被 封要求5000天币解冻 不然等三天、当时差点没吓一跳500 软妹币 知道有很多人都开过小挂挂 但是开的时间久以后免 会萌生自己研发外挂的想法 那么我先简…

游戏服务器开发技术小结

转载请自觉标明原创出处 原文链接&#xff1a;http://gameislife.info/archives/category/游戏开发 游戏服务器开发技术小结 1 概述 本文从开发者的视角&#xff0c;浅析游戏服务器开发涉及到的几个技术层面&#xff0c;并说明这几个层面我们可以选择的解决方案。 一般地&a…

游戏开发流程

游戏服务器开发技术小结1 概述本文从开发者的视角&#xff0c;浅析游戏服务器开发涉及到的几个技术层面&#xff0c;并说明这几个层面我们可以选择的解决方案。 一般地&#xff0c;会把游戏服务器的架构划分如下三层&#xff1a;网络接入层、游戏逻辑层、数据存储层&#xff0…

面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 作者&#xff1a;李强&#xff0c;腾讯web开发工程师商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。原文链接&#xff1a;http://wetest.qq.com/lab/view/348.html 一、什么是同构直…

第六天 - 字典

1.字典简介 字典(dict) python中唯一的映射类型&#xff0c;根据key计算内存地址&#xff0c;再以key:value保存在这个地址里面 hash算法无序的 故而key必须是可hash的(如果你搞不懂什么是可哈希,暂可记成,可改变的都不可哈希的) 可哈希(不可改变)的数据类型: int,str,tuple,bo…

面向亿万级用户的QQ一般做什么?——兴趣部落的Web同构直出分享

作者&#xff1a;李强&#xff0c;腾讯web开发工程师 商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。 一、什么是同构直出&#xff1f; 直出这个名词是在node出现后才有的&#xff0c;在node出现前叫做服务端渲染。 所以可以把直出定义为&#xff1a;“…