jQuery 取不到预期内容时,可以沿三步排查:先确认匹配了几个元素,再确认搜索范围,最后确认读取的是值、文本还是 HTML。
1. 对象存在,不等于元素存在
var input = $("#target");
if (input.length > 0) {
console.log(input.val());
}
$(“#target”) 即使没有匹配结果,也返回 jQuery 对象,因此 if ($(“#target”)) 不能判断目标是否存在。
原生 document.getElementById 未找到时返回 null;通常是继续访问这个空结果的成员才报错,不是查询本身必然报错。无论用哪种方式,都应先确认结果。
2. 组合条件与查找范围分开
var buttons = $("input[id='target'][name='field'][type='button']");
var startsWith = $("select[id^='prefix']");
var endsWith = $("select[id$='suffix']");
var contains = $("select[id*='part']");
var visibleWithinBlock = $("#orderBlock")
.find("[id^='order_']:visible").length;
连写属性条件要求同一个元素同时满足条件;前缀、后缀和包含匹配则有不同含义。find 只搜索容器后代,最后一个计数不是整个页面的元素总数。
:visible 表达 jQuery 对布局可见性的判断,不等于元素一定在屏幕视口内,也不等于业务上应该处理。是否统计隐藏项,应由具体需求决定。
3. 取表单值,还是取展示文字
<select id="category">
<option value="A1">分类一</option>
</select>
<table id="records">
<tbody>
<tr>
<td><span>12313</span></td>
<td><button class="read-row" type="button">读取</button></td>
</tr>
</tbody>
</table>
在 DOM 就绪后:
var code = $("#category").val();
var label = $("#category").find("option:selected").text();
$("#records").on("click", ".read-row", function () {
var text = $(this).closest("tr")
.children("td").first().children("span").text();
console.log(text);
});
val 读取表单值,text 读取文本,html 读取标记,不能当作等价替代。用 closest 取得最近一行,比把所有祖先 tr 都找出来更符合这个扁平表格结构;复杂嵌套表格仍应限制作用范围。
如果是多选 select,val 可能返回数组,而不是拼接后的展示文字。空集合的 val 返回 undefined;未选择的多选在 jQuery 3.0 起返回空数组,旧版可能是 null。jQuery val
4. 没有元素,与输入框内容为空不同
var input = $("#target");
if (!input.length) {
console.log("未找到输入框");
} else if (input.val() === "") {
console.log("输入框存在,当前为空字符串");
}
是否把纯空白视为空值、数字 0 是否有效,以及数组如何判断空,都属于业务规则,不能用一次宽松相等比较包办。
5. ID 中的点号需要按选择器语法处理
List0.checkFlg1 可以是一个完整 ID,但 CSS 中的点号有类选择器含义。固定值示例:
var element = document.getElementById("List0.checkFlg1");
var byAttribute = $("[id='List0.checkFlg1']");
var byEscapedId = $("#List0\\.checkFlg1");
最后一行在 JavaScript 源码中先经过字符串转义,再经过 CSS 选择器解析。原生 getElementById 接收的是 ID 本身,不需要把它改写成 CSS 选择器。
jQuery 3.0 起,也可以使用:
var literalId = "List0.checkFlg1";
var byId = $("#" + $.escapeSelector(literalId));
这要求实际版本支持该 API。jQuery escapeSelector
属性选择器的固定示例不代表任意用户输入都能安全拼接。动态标识要按所使用的查询语法正确处理,并在读取结果后核对匹配数量。