弹窗中修改select默认值无效

前提
项目中遇到一个需求,
在一个弹窗中,有很多个select都是在打开弹窗的同时由js自动生成的(每次打开都自动重新生成一遍)。
弹窗打开后,从每个select的下拉选中选中一个值。然后弹窗下面有个确定按钮。
点确定 按钮,将每个select选中的值保存起来。
下次再次打开弹窗时,每个自动生成的select中都默认值显示上次选中的值。

我的思路是

1、在每次点 确定 按钮 时:
新建一个 js 对象jsonObj,每次点 确定后把 每个select的id(也可以是其他标记)和此次的选中值,
以模拟键值对的形式存入到 对象中。
然后把jsonObj对象转为json串 JSON.stringify(jsonObj),存入到页面上的一个 input隐藏域中。

2、第二次再打开 弹窗时,
先从隐藏域中取出jsonStr对象字符串,转成json对象 jsonObj = JSON.parse(jsonStr)

生成通用的select标签及option,
从jsonObj对象中根据key即每个要修改的select标签的id,取出对应的默认选中值 value。

3、修改每个新生成的select的默认选中值为对应的value。

遇到的问题
在第3步中,每次我用 设置val()或者给option添加selected=selected的方法,在页面上显示时都无效,
都是默认显示第一个。

经过同事的指导,发现最终问题的原因是,项目中用的公司封装的 dragBoxShow(弹窗dom的id)的打开弹窗方法,
只有在弹窗打开后,所有的select和option都展示在页面上后,再用js来修改select的默认选中值才有效。
也就是,修改select默认值的js代码必须要在打开弹窗代码后执行才有效,否则总是选第一个

产生此问题的具体原因我不清楚。

解决方法

方法1:将修改默认select选项的代码放在弹窗显示代码后执行。
【此方法有个问题,就是如果逻辑复杂,有时并不能这样做。也就是 业务逻辑必须要求最后显示弹窗】

方法2:为了避免方法1的局限性,我用了方法2:
不是在select和option生成dom标签后用js修改。
而是在生成dom前的的 字符串拼接阶段就将默认值设置好,通过给option加上selected属性。
拼接好后,再加入父dom中。【用这种方法就可以不用先显示弹窗,再用js修改默认值了】

方法2的部分伪代码如下:

 //拼接通用的select标签
var tempStr = "<select name='s' id='s' value='2'>"+
"<option value='a'>1a</option>"+
"<option value='b'>2a</option>"+
"<option value='c'>3a</option>"+
"</select>"; //从对象中取出对应的value
var reg = jsonObj[key]; //如果值存在则替换对应的option个字符串
if(reg){///如果reg的值是b
tempStr = tempStr.replace(reg+"'",reg+" 'selected='selected'")
} //将select标签字符串添加到父dom对象中
$(#parent).append(tempStr);

其他参考代码:

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<script type="text/javascript" src="js/jquery-1.8.0.js"></script>
<body>
<div id="d1">
哈哈
</div>
<!--<select name="s" id="s" value="2">
<option value="1">1a</option>
<option value="2">2a</option>
<option value="3">3a</option>
</select>-->
<input type="button" name="" id="b" onclick="butClick()" />
</body>
<script> function butClick(){
alert(11)
$("#d1").append("<div id='d2'>嘿嘿 </div>"); $("#d2").append('<select name="s" id="s" value="2">'+
'<option value="a">1a</option>'+
'<option value="b">2a</option>'+
'<option value="c">3a</option>'+
'</select>'); var t = "b";
$("#s").val(t);//修改select默认选中值(当前显示选中值)
/*这样就可以动态修改select的默认选项了*/ /*
动态添加的标签是可以直接在添加时、或者添加后用js方法改select默认值的。
但是要注意的是 如果是 弹出框 中的动态拼接出的select,用js修改默认显示选中值时,
一定要 在弹出窗口的代码执行后再写修改选项的就是,这样修改选中值的js代码在页面上才会生效。
否则 先写修改选项的js,再执行弹出窗口代码,会造成先写得js代码没有效果。
*/
} $(function(){
/*下面这样也可以动态修改select的默认选项*/
// $('#s').find('option').eq(1).attr("selected","selected")
// $("#s").val(3);
var j=5;
var obj={};//定义对象
/*obj.a=1;
obj.b=2;*/
obj["a"]=1; //给对象赋值,增加键值对
obj["b"]=2; /*如果键是直接的字符串,存入时要加上双引号*/
obj[j]=7; /*如果键是变量,可以直接写变量【不带双引号的是变量】*/
// alert(obj);
// alert(JSON.stringify(obj));
}); </script>
</html>

弹窗中修改select默认值遇到的问题的更多相关文章

  1. MySQL5.7中的sql_mode默认值

    简介 在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本.作为DBA在考虑数据库版本升级带来的影响时,一般会有几个注意点: sql_mode 默认值的改变 optimizer_switc ...

  2. PostgreSQL中实现更新默认值(二)

    今天我们用表继承+触发器的方案,来实现表中的更新默认值.这也许是PostgreSQL里最佳的解决方案. 一. 创建一张表,作为父表 create table basic_update( t_updat ...

  3. SQL修改字段默认值、获取字段默认值

    一.SQL修改字段默认值 alter table 表名 drop constraint 约束名字 说明:删除表的字段的原有约束 alter table 表名 add constraint 约束名字 D ...

  4. Sqlserver添加加字段、删除字段、修改字段类型、修改字段名、修改字段默认值

    参考:https://www.cnblogs.com/pangpanghuan/p/6432331.html 初始化表: --.添加字段 --1.1.为null alter table DataTab ...

  5. 在函数中修改全局变量的值,需要加global关键字

    一.引用 使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字.如: #! /usr/bin/python a = 1 b = [2, 3] def func(): if ...

  6. Mysql 修改字段默认值

    环境:MySQL 5.7.13 问题描述:建表的时候,users_info表的role_id字段没有默认值,后期发现注册的时候,需要提供给用户一个默认角色,也就是给role_id字段一个默认值. 当前 ...

  7. struts2视频学习笔记 03-06(Struts 2配置文件无提示问题,Action配置中的各项默认值,各种转发类型)

    课时3 解决Struts 2配置文件无提示问题(eclipse):window→preference→XML→XML Catlog

  8. sqlserver中GUID的默认值设置

    sqlserver中GUID的默认值设置 YID uniqueidentifier not null default (NEWSEQUENTIALID()), //有序GUID(只能用于表设计的时候的 ...

  9. c++ 中bool 的默认值

    比如在Test.h中定义变量: _isFirst; //Test.h头文件 #ifndef __TEST_H__ #define __TEST_H__ class Test{ private: boo ...

随机推荐

  1. Linux系统本地yum源环境配置记录

    由于IDC的一些服务器没有外网,不能对外访问.所以打算部署一套内网的yum源环境,以供内网服务器使用.以下简单记录下操作过程: 1)下载centos6.9和centos7.3的镜像,并挂载 [root ...

  2. NSCache的简单使用

    简介 1)NSCache 是苹果官方提供的缓存类,用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它来管理缓存. 2)NS ...

  3. 基于SSH的高校网上选课系统的质量属性的实现

    我对于基于SSH的高校网上选课系统的质量属性的实现是从可用性.性能.安全性.可维护性.易用性五个方面进行的实现. 可用性方面: 实现方式:(1)当系统试图超出限制范围来进行课程查询或选课时必须进行错误 ...

  4. 过滤器Filter的使用(以登录为例子)

    使用过滤器步骤: (1)在web.xml文件中添加过滤器(以下例子是过滤多个请求) <!-- 用户登录过滤 --> <filter> <filter-name>lo ...

  5. Java Swing 实现系统托盘图标

    在实现托盘图标时,出现弹出式菜单显示中文乱码,无法显示正确的文字 查询相关资料后发现是字符编码不匹配,查询资料出处 解决方法 1.通过修改Java项目的默认编码为GBK: 2.在Run Configu ...

  6. Tomcat启动失败

    前景:使用的是tomcat9.0,配置好后,使用一切正常,刷慕课跟着做练习,也一切正常.出事在于,老师为了方便直接拷之前写的一个项目,我照做了,老师改了虚拟路径了,我忘记改了,然后跑了一下项目就出毛病 ...

  7. 伪静态与重定向--RewriteBase

    RewriteBase用于设置目录级重写的基准URL,即所有的重定向都是基于这个URL.内部重定向可能看不出效果,但是在外部重定向(使用R flag后),如果不手动指定 / 为根目录,那么就会去整个磁 ...

  8. HDU 2075 A|B?

    http://acm.hdu.edu.cn/showproblem.php?pid=2075 Problem Description 正整数A是否能被正整数B整除,不知道为什么xhd会研究这个问题,来 ...

  9. Maven-Build Lifecycle(构建生命周期)

    https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html https://www.w3cschoo ...

  10. Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法

    USE mysql;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';FLUSH PR ...