下拉列表框select

下拉列表框select

CreateTime--2017年5月15日15:39:24

Author:Marydon

三、下拉列表框

  (一)语法

    <select></select>

  (二)<option>标签的value属性

  说明:<option>标签的value属性一定得加,不加的话,form表单提交数据时,会将<option>标签所包含的内容提交。

<select name="FVISTYPE" style=" 100px;">
    <!-- 如果value属性没有声明,提交的值是“全部”,而不是""空字符串 -->
    <option selected="selected" value="">
        全部
    </option>
    <option value="7">
        慢性病
    </option>
    <option value="19">
        门诊重大疾病
    </option>
</select>
<select id="FCOMLVL" name="FCOMLVL" style=" 100px;">
  <option value="">
     <c:out value="请选择"></c:out>
   </option>
   <c:forEach var="row" items="${model.leveldata}" varStatus="s">
     <option value="${row['FDICTCODE']}">
        <c:out value="${row['FDICTNAME']}"></c:out>
      </option>
   </c:forEach>
</select>

  (三)js控制下拉框的默认选中项

    1.重置下拉列表框

<select id="test" name="t">
    <option value="1"></option>            
    <option value="2"></option>            
    <option value="3" selected></option>            
</select>

    实现:

document.getElementById("test").selectedIndex = 0;//或"0"

    注:这里只介绍了第一种实现方式,更多实现方式见文章-js&jquery实现方式对比汇总。

    UpdateTime--2017年7月19日11:50:22

    2.通过根据隐藏域的值限制下拉框的选中项

    举例:

    HTML部分

<select id="aa" onchange="test(this);">
    <option value="">qingxuanze</option>
    <option value="1" selected>yi</option>
    <option value="2">er</option>
    <option value="3">san</option>
</select>
<input id="test2" type="hidden" value="3"/>

    JAVASCRIPT部分

    错误实现方式一:

function test (sender) {
    var test2 = $('#test2').val();
    var test1 = sender.value;
    if(test1 != test2) {
        $(sender + ' option').each(function(index){
            if (test2 == this.value) {
                this.selected = true;
            }
        });
    }
}

    错在哪里?

    目前没有搞清楚咋回事,反正这样会报错

    Syntax error, unrecognized expression: [object HTMLSelectElement] option

    不推荐使用的实现方式:

    HTML部分test("传该下拉框的id")

function test(senderId){
    var test1=$("#" + senderId).val();
    var test2=$("#test2").val();
    if(test1 != test2){
        $("#aa option[value=" + test2 + "]").attr("selected", true); 
    }
}

    实现效果:不管用户选择哪个选项,都只会选中与隐藏域的值相等的那个选项

    不推荐使用的原因:

     这种方式虽然实现了,但是问题在于:单独运行这几行代码没有问题,放到web项目中无效(虽然给标签option添加了selected属性,但是却无法选中这个选项)  

    猜想:

      造成这种现象的原因可能是:通过控制option标签的selected属性来实现选中该选项,仅仅在初次加载页面时绝对起作用(有效),页面加载完毕,使用js通过这种方式来控制下拉框的选中选项可能会失效。

    通过操作select标签来实现(推荐使用):

function test(senderId){
    var test1=$("#" + senderId).val();
    var test2=$("#test2").val();
    if(test1 != test2){
        $("#aa option[value=" + test2 + "]").attr("selected", true); 
        $("#" + senderId + ' option').each(function(index){
            if (test2 == this.value) {
                document.getElementById('aa').selectedIndex = index;
            }
        });
    }
}

    小结:

      通过js来实现对下拉框默认选中项进行控制,不要通过操作option标签来实现,而是通过操作select标签来实现。        

    实例:

    选择拟会诊医院后,可以添加医生信息;如果已经添加过医生信息,必须先清空医生信息才能更改下拉框默认选中项

    效果展示:

    a.初始化界面

    b.选择医院,增加医生信息

    c.切换医院,必须先删除医生信息,否则,下拉框选中原来的选项

  代码展示:

  HTML部分

<td class="tdbiejing" nowrap="nowrap">拟会诊医院</td>
<td nowrap="nowrap" class="tdStyle">
    <select id="nhzyy" onchange="consAppl_search.chooseHos('nhzyy');" class="TextBoxRequired" oldClass="TextBoxRequired" title="你必须从列表中选择一个项目">
        <option value="">请选择</option>
        <c:forEach items="${model.data }" var="hospital">
            <option value="${hospital.ORGID },${hospital.ORGNAME }">${hospital.ORGNAME }</option>
        </c:forEach>
    <lect>
    <!-- 拟会诊医院ID -->   
    <input type="hidden" name="CON_ORG_ID" id="CON_ORG_ID"/>
    <!-- 拟会诊医院名称 -->   
    <input type="hidden" name="CON_ORG_NAME" id="CON_ORG_NAME"/>
    <!-- 用于校验 -->   
    <input type="hidden" id="orgIdName" value=""/>
    
</td>

  JAVASCRIPT

/**
 * 选择拟会诊医院
 */
this.chooseHos = function(senderId) {
    // 获取下拉列表框的值
    var CON_ORG_IDName = $get(senderId).value;
    // 获取隐藏域的值
    var orgIdName = $get('orgIdName').value;
    // 1.初始化操作(选中请选择选项时)
    if ("" != CON_ORG_IDName && "" == orgIdName) {
        $get(senderId).setAttribute('title','');
        $get('CON_ORG_ID').value = CON_ORG_IDName.split(',')[0];
        $get('CON_ORG_NAME').value = CON_ORG_IDName.split(',')[1];
        $get('orgIdName').value = CON_ORG_IDName;
        return;
    }
    
    // 2.判断是否已经添加科室,医生信息
    // 获取科室,医生展示的table有多少行数据
    var rowsLength = $get('deptDocTable').rows.length;
    // 如果已根据拟会诊医院选择了科室和医生,想变更会诊医院时,添加校验
    if (CON_ORG_IDName != orgIdName && rowsLength > 1) {
        Dialog.Alert('消息提示','请先清空科室,医生信息!',null,null,100);
        // 恢复原来选中的选项
        $('#' + senderId + ' option').each(function(index) {
            // 两值相等选中该选项
            if (orgIdName == this.value) {
                $get(senderId).selectedIndex = index;
            }
        });
        return;
    }
    
    // 3.允许改变下拉框的值并执行相应操作
    if ("" == CON_ORG_IDName) {
        // 设置下拉框鼠标悬浮时的提示信息
        $get(senderId).setAttribute('title','你必须从列表中选择一个项目');
        // 信息置空
        $get('CON_ORG_ID').value = "";
        $get('CON_ORG_NAME').value = "";
        $get('orgIdName').value = "";
    } else {
        // 将下拉框的提示信息置空
        $get(senderId).setAttribute('title','');
        // 页面赋值
        $get('CON_ORG_ID').value = CON_ORG_IDName.split(',')[0];
        $get('CON_ORG_NAME').value = CON_ORG_IDName.split(',')[1];
        $get('orgIdName').value = CON_ORG_IDName;
    }
}

  (四)设置下拉框为必选项信息提示

.TextBoxRequired {
    border: solid 1px #3f93b7;
    width: 96%;
    color: #333333;
    background: #fefbbd;
} 
<select onchange="this.value!=''?this.setAttribute('title',''):this.setAttribute('title','你必须从列表中选择一个项目!');"
    name="HOSID_NAME" id="HOSID_NAME"
    class="TextBoxRequired" title="你必须从列表中选择一个项目!">
    <option value="">请选择</option>
    <option value="1">选项一</option>
    <option value="2">选项二</option>
</select>

  UpdateTime--2017年6月14日08:53:24

  (五)js动态添加下拉项

    方法一:

/**
 * 查询医院
 */
this.viewHosp = function() {
    var param = "";
    /**
     * 获取医院名称、医院编码及医院ID
     */
    var request = new $WebRequest(
            baseUrl + "/telemedicine/patient/viewHos.do", param,
            function(result) {
                getJsonResult(result, function() {
                    // 1.获取后台数据
                    var JOSNdata = result.HOSLIST;
                    // 2.将下拉框置空
                    $("#HOSID_NAME").empty();
                    // 3.拼接上"请选择"选项
                    $("#HOSID_NAME").append('<option value="">请选择</option>');
                    // 4.迭代拼接下拉选项
                    $(JOSNdata).each(function(i,item) {
                        $("#HOSID_NAME").append(
                                '<option value="' + item.ORGID + ',' + item.ORGNAME + '">'
                                        + item.ORGNAME + '</option>');
                    });
                });
            });
    request.Start();
}

    注:这里的Ajax请求是自己封装好的 

     方法二:(推荐使用)

$.getJSON(baseUrl + "/telemedicine/patient/viewHos.do", param,
    function(result) {
        // 1.获取后台数据
        var JOSNdata = result.HOSLIST;
        // 2.移出掉下拉框中的选项(除了第一项)
        $("#HOSID_NAME option:gt(0)").remove();
        // 3.迭代拼接下拉选项
        $(JOSNdata).each(function(i,item) {
            $("#HOSID_NAME").append(
                    '<option value="' + item.ORGID + ',' + item.ORGNAME + '">'
                            + item.ORGNAME + '</option>');
        });
    }
);

  UpdateTime--2017年6月14日17:13:41 

  (六)c标签迭代下拉列表框

    1.通常用于新增页面

    第一部分:HTML

<tr> 
    <td class="tdbiejing">科室</td>
    <td>
        <c:if test="${!empty model.data}">
            <select name="FDEPTCODE" class="TextBox" id="FDEPTCODE">
                <c:forEach items="${model.data }" var="dept">
                    <option value="${dept.FDEPTCODE }">${dept.FDEPTNAME }</option>
                </c:forEach>
            </select>
        </c:if>
        <c:if test="${empty model.data}">
            该医疗机构下没有维护科室!
        </c:if>
    </td>
</tr>

    第二部分:JAVASCRIPT

window.onload = function() {
    // id="FDEPTCODE"的标签,如果页面上存在就在下拉框最前面拼接上;若不存在也不会抛异常
    $('#FDEPTCODE').prepend('<option value="">请选择</option>');
   document.getElementById('FDEPTCODE').selectedIndex = 0; };

    2.通常用于修改页面

    第一部分:HTML 

<tr> 
    <td class="tdbiejing">科室</td>
    <td>
        <c:if test="${!empty model.data2}">
            <select name="FDEPTCODE" class="TextBox" id="FDEPTCODE">
                <c:forEach items="${model.data2 }" var="dept">
                    <option value="${dept.FDEPTCODE }" 
                        <c:if test="${model.data[0].FDEPTCODE==dept.FDEPTCODE}">selected</c:if>>
                        ${dept.FDEPTNAME }
                    </option>
                </c:forEach>
            </select>
        </c:if>
        <c:if test="${empty model.data2}">
            该医疗机构下没有维护科室!
        </c:if>
    </td>
</tr>

    第二部分:JAVASCRIPT

window.onload = function() {
    // id="FDEPTCODE"的标签,如果页面上存在就拼接上;若不存在也不会抛异常
    $('#FDEPTCODE').prepend('<option value="">请选择</option>');
}; 

  实现效果:

    新增页面:如果后台获取的数据不为空,显示下拉框,并添加一个空选项;否则,显示文本提示信息       

    修改页面:如果后台获取的数据不为空,显示下拉框,添加一个空选项并设置默认选中项;否则,显示文本提示信息

  UpdateTime--2017年8月8日10:01:39

  (七)自定义属性

    HTML部分

选择医生
<select onchange="setPhone(this);" id="DOCID_NAME">
    <option value="">请选择</option>
</select><br/>
联系方式
<input type="text" id="DOCTOR_PHONE"/>

    JAVASCRIPT部分

window.onload = function() {
    // 设置下拉选项标签并为option标签设置自定义属性
    var optionHtml = '<option fdoctorphone="15011111111" value="001,zhangsan">张三</option>';
    // 为下拉框添加选项
    $('#DOCID_NAME').append(optionHtml);
    
}
/**
 * 页面赋值联系方式
 */
function setPhone(sender) {
    // 获取医生下拉框的值
    var optionValue = sender.value;
    if ("" == optionValue) {
        // 医生联系方式置空
        $get('DOCTOR_PHONE').value="";
        return;
    }
    
    // 获取该选项的自定义属性FDOCTORPHONE
    // 这种方式获取不到
    // var FDOCTORPHONE = $(sender).attr('fdoctorphone');
    var FDOCTORPHONE = $('#DOCID_NAME option:selected').attr('fdoctorphone');
    
    if (null != FDOCTORPHONE) {
        $get('DOCTOR_PHONE').value = FDOCTORPHONE;
    } else {
        $get('DOCTOR_PHONE').value = "";
    }
} 

    注意:

      a.自定义属性必须全部小写,因为浏览器进行标签解读是会把所有的标签解读成小写;

      b.获取选中option标签中的自定义属性,需使用$('#DOCID_NAME option:selected').attr('fdoctorphone')这种方式实现。

小结:

  select标签绑定onchange事件时,传参this,this虽然代表当前select标签对象,只能通过这个对象获取选中选项的值(sender.value),无法进行其他操作((三)和(七)作证);

           

原文地址:https://www.cnblogs.com/Marydon20170307/p/6856666.html