1. 程式人生 > >彈窗中修改select默認值遇到的問題

彈窗中修改select默認值遇到的問題

java name 沒有效果 style 賦值 utf show input 顯示

彈窗中修改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的部分偽代碼如下:

 1 //拼接通用的select標簽
 2             var  tempStr = "<select name=‘s‘ id=‘s‘ value=‘2‘>"+
 3                     "<option value=‘a‘>1a</option>"+
 4
"<option value=‘b‘>2a</option>"+ 5 "<option value=‘c‘>3a</option>"+ 6 "</select>"; 7 8 //從對象中取出對應的value 9 var reg = jsonObj[key]; 10 11 //如果值存在則替換對應的option個字符串 12 if(reg){///如果reg的值是b 13 tempStr = tempStr.replace(reg+"‘",reg+" ‘selected=‘selected‘") 14 } 15 16 //將select標簽字符串添加到父dom對象中 17 $(#parent).append(tempStr);

其他參考代碼:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8" />
 5         <title></title>
 6     </head>
 7     <script type="text/javascript" src="js/jquery-1.8.0.js"></script>
 8     <body>
 9         <div id="d1">
10             哈哈
11         </div>
12         <!--<select name="s" id="s" value="2">
13             <option value="1">1a</option>
14             <option value="2">2a</option>
15             <option value="3">3a</option>
16         </select>-->
17         <input type="button" name="" id="b" onclick="butClick()" />
18     </body>
19     <script>
20         
21         function butClick(){
22             alert(11)
23             $("#d1").append("<div id=‘d2‘>嘿嘿    </div>");
24             
25             $("#d2").append(<select name="s" id="s" value="2">+
26                 <option value="a">1a</option>+
27                 <option value="b">2a</option>+
28                 <option value="c">3a</option>+
29             </select>);
30             
31             var t = "b";
32             $("#s").val(t);//修改select默認選中值(當前顯示選中值)
33             /*這樣就可以動態修改select的默認選項了*/
34             
35 /*
36  動態添加的標簽是可以直接在添加時、或者添加後用js方法改select默認值的。
37  但是要註意的是 如果是  彈出框 中的動態拼接出的select,用js修改默認顯示選中值時,
38  一定要 在彈出窗口的代碼執行後再寫修改選項的就是,這樣修改選中值的js代碼在頁面上才會生效。
39  否則 先寫修改選項的js,再執行彈出窗口代碼,會造成先寫得js代碼沒有效果。
40  */
41         }
42         
43         $(function(){
44             /*下面這樣也可以動態修改select的默認選項*/
45 //            $(‘#s‘).find(‘option‘).eq(1).attr("selected","selected")
46 //            $("#s").val(3);
47             var j=5;
48             var obj={};//定義對象
49             /*obj.a=1;
50             obj.b=2;*/
51             obj["a"]=1; //給對象賦值,增加鍵值對
52             obj["b"]=2;    /*如果鍵是直接的字符串,存入時要加上雙引號*/
53             obj[j]=7;     /*如果鍵是變量,可以直接寫變量【不帶雙引號的是變量】*/
54 //            alert(obj);
55 //            alert(JSON.stringify(obj));
56         });
57         
58     </script>
59 </html>

彈窗中修改select默認值遇到的問題