Select2 用法小贴士

Select2控件高级用法
本文详细介绍了Select2控件的初始化配置、动态赋值方法、解决输入焦点问题及值的获取方式,涵盖Ajax动态加载选项、启用函数设置、解决输入框无法获取焦点等问题。

适用于Select2 4.0.8

初始化:
标签

<div class="form-group col-md-6">
<select id="select2_id" class="form-control" name="select2_name">
</select>
</div>

ajax动态赋值

$.ajax({
		url:rootPath + "/project/select2_ids",
		type:"GET",
		success:function(result){
			//console.log(result);
			if(200==result.code){
				$.each(result.extend.select2_ids, function(index, item) { //select2_id为数组
					var option = $("<option></option>")
							.append(item.engineerItCode).attr("value", item.id);
					option.appendTo(ele);
				});
			}else{
				alert_message(result.code);
			}
		}
	});

启用函数

$("#select2_id").select2({
			placeholder : "Select a domain",
			allowClear : true
		});

动态赋值1

$("#select2_id").val(result.value).select2();
$("#select2_id").val("").select2();

动态赋值2
这里val()中的“[ ]”可以一定程度上保证及时更新

$("#select2_id").val([result.extend.query_result.project]).trigger("change");

解决select2的input框无法获取焦点,无法输入的问题
重写enforceFocus方法,在script中加入下面语句即可:

$.fn.modal.Constructor.prototype.enforceFocus = function() {};

select2使用模态框,搜索框无法输入
bootstrap的modal框中会自带一个属性tabindex="-1"
此属性作用是“设置键盘中的TAB键在控件中的移动顺序,即焦点的顺序。”
通过把tabindex设成1到32767的一个值,就可以把这个控件加入到TAB键的序列中。当浏览者使用TAB键在网页控件中移动时,将首先移动到具有最小tabIndex属性值的控件上,最后在具有最大tabIndex属性值的控件上结束移动。 如果有两个控件的tabIndex属性相同,则以控件在html代码中出现的顺序为准。默认的tabIndex属性为 0 ,将排列在在所有指定tabIndex的控件之后。 而若把tabIndex属性设为一个负值(如tabIndex="-1"),那么这个链接将被排除在TAB键的序列之外,光标也因此无法锚定在输入框中。

<div class="modal fade" id="add_task_modal" tabindex="-1" role="dialog"
		aria-labelledby="exampleModalCenterTitle" aria-hidden="true">

将上面代码中的tabindex="-1"删掉即可

获取Select2控件上的值

	$("#inpt_pjnm_selector").select2('data');
	$("#inpt_pjnm_selector").select2('val');
	$("#inpt_pjnm_selector").val();
	$("#inpt_pjnm_selector option:checked").text();
	$("#inpt_pjnm_selector option:checked").val();
在 Streamlit 中,默认情况下组件是**垂直堆叠排列**的,如果你希望将一个 `selectbox` 和其他元素(比如另一个下拉框、文本、按钮等)放在**同一行显示**,可以使用 `st.columns` 来实现。 --- ### ✅ 目标:让两个 `selectbox` 下拉框在同一行显示 ```python import streamlit as st # 创建两列,宽度相等 col1, col2 = st.columns(2) with col1: option1 = st.selectbox( "选择城市", ["北京", "上海", "广州", "深圳"], key="city" ) with col2: option2 = st.selectbox( "选择年份", [2021, 2022, 2023, 2024], index=3, key="year" ) # 显示选择结果 st.write(f"你选择了:{option1} - {option2}") ``` > ✅ 效果:两个下拉框并排显示在同一行。 --- ### ✅ 更复杂布局:多个组件混合排列 ```python col1, col2, col3 = st.columns([2, 1, 1]) # 第一列宽,后两列窄 with col1: name = st.text_input("姓名") with col2: gender = st.selectbox("性别", ["男", "女"], key="gender") with col3: age = st.selectbox("年龄", list(range(18, 101)), key="age") st.write(f"用户信息:{name},{gender},{age}岁") ``` > 📌 使用 `[2, 1, 1]` 控制每列的相对宽度,适合表单类布局。 --- ### ✅ 实现“标签 + 下拉框”在同一行(紧凑布局) 有时候你想让一个 **小标签或说明文字** 和下拉框紧挨着显示,也可以用 `columns` 模拟: ```python st.write("### 请选择分类") cols = st.columns([1, 3]) # 左边小列放标签,右边大列放下拉框 with cols[0]: st.markdown("<h6 style='margin-top:15px'>类别:</h6>", unsafe_allow_html=True) with cols[1]: category = st.selectbox( "类别选择", ["科技", "教育", "娱乐", "体育"], label_visibility="collapsed", # 隐藏 selectbox 自带标签 key="category" ) st.write(f"你选择的类别是:{category}") ``` > 💡 使用 `label_visibility="collapsed"` 隐藏原生标签,并通过 HTML 添加内联标签。 --- ### ✅ 多个 selectbox 水平滚动(适用于很多选项) 如果有很多下拉框要放一行,但屏幕不够宽,可以用 CSS 实现横向滚动: ```python st.markdown(""" <style> .horizontal-container { display: flex; gap: 10px; overflow-x: auto; white-space: nowrap; padding: 10px 0; } .stSelectbox { min-width: 150px; } </style> <div class="horizontal-container"> """, unsafe_allow_html=True) # 手动模拟多个 inline selectbox(Streamlit 不支持直接嵌套) for i in range(5): st.selectbox(f"选项{i+1}", ["A", "B", "C"], key=f"opt_{i}") st.markdown("</div>", unsafe_allow_html=True) ``` > ⚠️ 注意:这种方法视觉上接近“一行多个”,但由于 Streamlit 的渲染机制,不能完全像 HTML 那样自由布局。推荐优先使用 `st.columns`。 --- ### ✅ 小贴士 | 技巧 | 说明 | |------|------| | `key` 参数必加 | 当多个相同组件时,必须用唯一 `key` 区分 | | `label_visibility="collapsed"` | 隐藏标签实现更紧凑布局 | | 列数匹配 | `st.columns(n)` 后必须有 `n` 个 `with` 块 | | 响应式设计 | 在移动端,多列会自动变为单列堆叠 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值