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

属性选择器的固定示例不代表任意用户输入都能安全拼接。动态标识要按所使用的查询语法正确处理,并在读取结果后核对匹配数量。