JQuery选择器,选择ID以xx开头的一组标签

本文介绍如何使用JQuery的选择器来选取一组ID前缀相同的按钮元素,并通过点击事件弹出各自的value值,同时也展示了如何选取特定后缀或包含特定字符串的元素。
部署运行你感兴趣的模型镜像

在JQuery中可以通过选择器来选取指定的元素,但如果有一组Button它们的ID都是以my_button_xxx这样的形式书写的

<button id="my_button_oo1" value="001"/>
<button id="my_button_oo2" value="002"/>
<button id="my_button_oo3" value="003"/>
<button id="my_button_oo4" value="004"/>

 如果他们的作用都是alert出自己的value,这时我们可以通过这样的形式来选择:

$(function(){
  $("button[id^='my_button']").click(function(){
     alert(this.value);
  });
});

 通过这种形式我们可以把id以my_button开头的所有button 都给选择,而不用为每个button写出一个。

 

$("input[id$='bottom']")       选择所有的id属性以'bottom'结尾的input元素
$("input[id*='contain']")      选择所有的id属性包含'contain'的input元素

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think> 我们分析给定的前端JSP页面代码片段,该代码使用jQuery的$.post方法通过AJAX实现下拉框的动态加载。 原始代码: <head> <title>$Title$</title> <script src='js/pintuer.js'></script> <script type='text/javascript'> $(function (){ $.post("xx.do?method=findAll", function (f){ $.each(f, function (i, e){ $("#sel").append("<option value='"+e.cid+"'>"+e.cname+"</option>"); }); }, "json"); }); </script> </head> 我们将从以下几个方面进行分析: 1. 代码功能实现原理 2. 可能存在的问题 3. 优化建议 一、功能实现原理 该代码片段位于JSP页面的<head>部分。当页面加载完成后(由$(function(){...})触发),它会向服务器发送一个POST请求(通过$.post方法),请求的URL是"xx.do?method=findAll"。 期望服务器返回一个JSON格式的数据(通过指定"json"参数)。返回的数据应该是一个数组(或类数组对象),其中每个元素e包含cid和cname属性。 然后,使用jQuery的$.each方法遍历返回的数据数组,对每个元素e,动态创建一个<option>元素,并将其追加到id为"sel"的下拉框(<select>)中。 二、可能存在的问题 1. 没有处理下拉框初始状态:在追加新选项之前,没有清空下拉框原有的选项(除了默认的第一个选项,如果存在的话),这会导致多次加载的数据重复追加。 2. 没有错误处理:当AJAX请求失败(如网络错误、服务器错误等)时,没有任何错误处理逻辑,用户可能无法感知数据加载失败。 3. 硬编码URL:URL以字符串形式硬编码在JS中,如果URL需要变更,则必须修改JS代码,不利于维护。 4. 代码健壮性:假设服务器返回的数据一定是预期的格式(即数组),如果返回的数据格式不正确(如返回错误信息字符串或空等),会导致遍历出错。 5. 下拉框选择效率:在循环中多次追加选项(每次遍历都追加一个选项)会导致页面多次重绘,效率较低,尤其是数据量大的时候。 三、优化建议 1. 清空选项:在追加新选项前,先清空下拉框(除了默认选项,如果需要保留默认选项,则注意不要清除它)。可以使用$("#sel").empty(),然后如果需要再添加默认选项(如“请选择”)。 2. 添加错误处理:使用$.ajax方法代替$.post,因为$.ajax可以设置error回调函数。或者使用$.post的fail回调(由于原始代码使用$.post,可以改为链式调用.fail())。 3. 避免硬编码URL:可以将URL放在一个变量中,或者使用JSP表达式动态生成URL(如使用${pageContext.request.contextPath}来获取上下文路径,避免路径错误)。 4. 数据格式校验:在遍历之前,检查返回的数据是否为数组,如果不是,则进行相应处理(如提示错误信息)。 5. 提高性能:在循环内拼接好所有option的HTML字符串,然后一次性追加到下拉框中,减少DOM操作次数。 优化后的代码示例: <head> <title>$Title$</title> <script src='js/pintuer.js'></script> <script type='text/javascript'> $(function (){ // 使用JSP表达式动态生成URL,避免硬编码 var url = "${pageContext.request.contextPath}/xx.do?method=findAll"; $.ajax({ type: "POST", url: url, dataType: "json", success: function(f) { // 清空下拉框(注意:如果下拉框有默认选项,比如“请选择”,则应该保留,这里假设清空全部) var $sel = $("#sel"); $sel.empty(); // 如果需要默认选项,追加一个 // $sel.append('<option value="">--请选择--</option>'); // 检查数据是否为数组 if (Array.isArray(f)) { var options = []; // 遍历数组,拼接所有option $.each(f, function(i, e) { options.push("<option value='" + e.cid + "'>" + e.cname + "</option>"); }); // 一次性追加 $sel.append(options.join('')); } else { console.error("返回的数据格式不正确!", f); // 可以添加错误提示 } }, error: function(xhr, status, error) { console.error("AJAX请求失败: ", status, error); // 可以显示错误信息给用户 alert("数据加载失败,请重试!"); } }); }); </script> </head> 注意:上述优化代码中,我们使用了$.ajax来代替$.post,因为这样可以更灵活地设置请求参数和错误处理。 另外,使用数组缓存所有option的HTML字符串,然后一次性追加,这样只需操作一次DOM,提高性能。 四、其他可能的优化 1. 如果下拉框数据量非常大,可以考虑分页加载或使用带搜索功能的下拉框(如Select2插件)。 2. 可以考虑在请求发送时显示一个加载指示器(如loading图标),在请求完成后隐藏,改善用户体验。 3. 如果服务器返回的数据可能包含特殊字符(如引号、尖括号等),直接拼接HTML可能会导致XSS攻击或显示问题。应该对动态内容进行转义(可以使用jQuery.text()方法,但这里需要将文本放入option的标签内和属性中,所以需要对e.cid和e.cname进行转义)。或者使用jQuery的DOM操作来创建option元素,避免拼接字符串。 例如,安全地创建option元素: var option = $('<option></option>'); option.val(e.cid); // 这里jQuery会处理转义 option.text(e.cname); options.push(option); 然后使用$sel.append(options); (注意:此时options是jQuery对象数组,但jQuery的append可以接受数组) 具体修改如下: var $sel = $("#sel"); $sel.empty(); if (Array.isArray(f)) { $.each(f, function(i, e) { $sel.append($('<option></option>').val(e.cid).text(e.cname)); }); } 这样虽然每次循环都append一次,但jQuery内部有优化,而且如果数据量不大,性能影响不明显。如果数据量大,可以先用文档片段(document fragment)或者先构建一个包含所有option的数组,然后一次性追加(但注意这里追加的是jQuery对象,不能直接拼接字符串,所以可以先创建文档片段)。 文档片段方式: var fragment = document.createDocumentFragment(); $.each(f, function(i, e) { var option = document.createElement('option'); option.value = e.cid; // 注意:这里设置属性是安全的,浏览器会自动转义 option.textContent = e.cname; // 使用textContent设置文本内容,避免XSS fragment.appendChild(option); }); $sel.append(fragment); 这种方式在性能上更优,并且避免了XSS问题。 综合考虑性能和安全性,推荐使用文档片段或jQuery对象数组的方式。 因此,我们可以调整优化后的success回调函数为: success: function(f) { var $sel = $("#sel"); $sel.empty(); // 如果需要默认选项,可以在这里添加 // $sel.append($('<option></option>').val('').text('--请选择--')); if (Array.isArray(f)) { var fragment = document.createDocumentFragment(); $.each(f, function(i, e) { var option = document.createElement('option'); option.value = e.cid; // 安全,浏览器自动处理 option.textContent = e.cname; // 设置文本,安全 fragment.appendChild(option); }); $sel.append(fragment); } else { console.error("返回的数据格式不正确!", f); // 显示错误信息 } } 这样既避免了XSS,又确保了性能。 总结: 原始代码在功能上是可行的,但存在健壮性和性能问题。通过上述优化,我们增强了代码的健壮性(错误处理)、安全性(避免XSS)、性能(减少重绘)和可维护性(动态URL)。 最后,注意在JSP页面中,如果使用${pageContext.request.contextPath},需要确保页面开头已经声明了pageContext(标准的JSP页面默认就有)。 根据上述分析,我们提供优化后的完整代码。 </think> ### 前端JSP页面使用$.post实现AJAX下拉框的代码分析及优化 #### 一、原始代码分析 ```jsp <head> <title>$Title$</title> <script src='js/pintuer.js'></script> <script type='text/javascript'> $(function(){ $.post("xx.do?method=findAll", function(f){ $.each(f, function(i,e){ $("#sel").append("<option value='"+e.cid+"'>"+e.cname+"</option>"); }); },"json") }) </script> </head> ``` ##### 实现原理 1. **页面加载初始化**:`$(function(){...})` 在DOM加载完成后立即执行[^2] 2. **AJAX请求**:`$.post()` 向后端发送HTTP POST请求获取数据 - 请求URL:`xx.do?method=findAll` - 响应格式:JSON(通过`"json"`参数指定) 3. **数据处理**:使用`$.each()`遍历JSON数组 4. **DOM操作**:动态追加`<option>`到ID为`sel`的下拉框 ##### 存在问题 1. **缺少清空机制**:未清除下拉框原有选项,导致重复追加 2. **硬编码URL**:URL路径缺乏灵活性,维护困难 3. **安全性风险**:直接拼接字符串可能导致XSS攻击 4. **无错误处理**:未处理网络错误或服务端异常 5. **缺少加载状态**:无加载提示,用户体验不佳 6. **效率问题**:逐条追加选项导致多次DOM重绘 #### 二、优化方案及代码实现 ##### 1. 基础优化版本(解决核心问题) ```jsp <head> <title>$Title$</title> <script src="js/pintuer.js"></script> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function() { // 清空下拉框并添加默认选项 $("#sel").empty().append('<option value="">--请选择--</option>'); // 使用ContextPath构建动态URL $.post("${pageContext.request.contextPath}/xx.do?method=findAll", function(response) { // 安全创建Option元素 response.forEach(item => { const option = new Option(item.cname, item.cid); $("#sel").append(option); }); }, "json" ).fail(function(xhr) { console.error("请求失败: ", xhr.statusText); alert("数据加载失败,请重试"); }); }); </script> </head> ``` **优化点说明**: - ✅ 使用`empty()`清空原有选项 - ✅ 通过`new Option()`安全创建元素,防止XSS攻击 - ✅ 添加`.fail()`错误处理 - ✅ 使用`${pageContext.request.contextPath}`动态获取项目路径[^1] ##### 2. 高级优化版本(完整解决方案) ```jsp <head> <title>$Title$</title> <script src="js/pintuer.js"></script> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(function() { initDropdown(); function initDropdown() { const $dropdown = $("#sel"); $dropdown.empty() .append('<option value="" disabled selected>加载中...</option>'); // 封装AJAX请求 $.ajax({ url: "${pageContext.request.contextPath}/xx.do", type: "POST", data: { method: "findAll" }, dataType: "json", beforeSend: function() { $dropdown.prop("disabled", true); } }).done(function(response) { $dropdown.empty().append('<option value="">--请选择--</option>'); // 文档片段批量操作 const fragment = document.createDocumentFragment(); response.forEach(item => { fragment.appendChild(new Option(item.cname, item.cid)); }); $dropdown.append(fragment); }).fail(function(xhr) { console.error(`请求失败 (${xhr.status}): ${xhr.statusText}`); $dropdown.empty().append('<option value="">加载失败,点击重试</option>') .on('click', initDropdown); }).always(function() { $dropdown.prop("disabled", false); }); } }); </script> </head> ``` **高级优化说明**: 1. **性能优化**: - 使用`DocumentFragment`批量添加选项,减少DOM操作次数[^1] - 避免字符串拼接,改用`new Option()`创建元素 2. **用户体验**: - 添加加载状态提示 - 禁用下拉框防止操作冲突 - 错误状态提供重试机制 3. **代码健壮性**: - 使用完整的`$.ajax`替代`$.post`,支持更多配置 - 分离初始化逻辑到独立函数 - 添加HTTP状态码日志 4. **安全加固**: - 上下文路径动态注入 - 参数通过`data`属性传递,避免URL拼接 #### 三、关键优化技术解析 1. **DOM操作优化** `DocumentFragment`作为轻量级DOM容器,批量操作比单个追加效率高$N$倍($N$为选项数量): $$ \text{操作耗时} = \begin{cases} O(N) & \text{单个追加} \\ O(1) & \text{批量追加} \end{cases} $$ 2. **XSS防御机制** 使用`new Option(text, value)`代替字符串拼接: ```javascript // 安全方式(自动转义特殊字符) new Option("<script>alert(1)</script>", "1"); // 危险方式(执行恶意脚本) $("#sel").append("<option><script>alert(1)</script></option>"); ``` 3. **AJAX性能公式** 请求响应时间优化模型: $$ T_{total} = T_{request} + \frac{D_{size}}{B} + T_{render} $$ - $T_{request}$ = 网络握手时间 - $D_{size}$ = 数据大小 - $B$ = 带宽 - $T_{render}$ = 渲染时间 **优化策略**:减小$D_{size}$(分页加载)、降低$T_{render}$(批量DOM操作)[^2] #### 四、最佳实践建议 1. **后端配合优化**: - 添加分页参数:`xx.do?method=findAll&page=1&size=20` - 返回标准JSON结构:`{ code: 200, data: [...] }` ```java // Spring MVC示例 @PostMapping("/xx.do") @ResponseBody public ResponseEntity<?> findAll( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) { Page<Category> result = categoryService.findAll(page, size); return ResponseEntity.ok(Map.of("code", 200, "data", result)); } ``` 2. **前端扩展功能**: ```javascript // 添加搜索过滤 $("#search").on("input", function() { const term = $(this).val().toLowerCase(); $("#sel option").each(function() { $(this).toggle($(this).text().toLowerCase().includes(term)); }); }); // 本地缓存 const cacheKey = "dropdown_cache"; if(localStorage.getItem(cacheKey)) { renderOptions(JSON.parse(localStorage.getItem(cacheKey))); } ``` 3. **大数据的优化方案**: ```javascript // 虚拟滚动(仅渲染可见项) $("#sel").on("scroll", function() { const scrollTop = this.scrollTop; const viewportHeight = this.clientHeight; // 计算渲染范围 }); ``` ### 总结 原始代码实现了基本的下拉框动态加载,但存在**安全风险、重复渲染、无错误处理**等关键缺陷。优化方案通过: 1. 使用`DocumentFragment`提升渲染性能 2. 采用`new Option()`防止XSS攻击 3. 添加完整的异常处理流程 4. 实现加载状态反馈机制 5. 支持动态路径配置和参数传递 建议在实际项目中采用高级优化版本,尤其对数据量较大或安全性要求高的场景[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值