parentElement\parentNode.parentNode.childNodes用法例子

本文介绍了offsetParent、parentNode及parentElement的区别,并通过两个实例演示了如何使用这些属性来操作DOM元素。offsetParent用于获取与定位相关的父元素,而parentNode和parentElement则用于获取一般的父元素。
offsetParent,parentNode,parentElement 区别
offsetParent
指与位置有关的上级元素
parentNode
指与位置无关的上级元素
parentElement 和 parentNode一样,但parentNode是W3C标准的parentElement 只在IE中可用.

第一种方法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<SCRIPT LANGUAGE="JavaScript">
<!--
var row = -1;
function showEdit(obj){
var cell2 = obj.parentNode.parentNode.childNodes[1];
var rowIndex = obj.parentNode.parentNode.rowIndex;
cell2.innerHTML = "<input type='text' value='"+ cell2.innerHTML +"'>";
if(row != -1){
var oldCell2 = document.getElementById("tb").rows[row].cells[1];
oldCell2.innerHTML = oldCell2.childNodes[0].value;
}
row = rowIndex;
}
//-->
</SCRIPT>
</HEAD>

<BODY>
<TABLE id="tb">
<TR>
<TD><input type="radio" onclick="showEdit(this)" name="rad"></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD><input type="radio" onclick="showEdit(this)" name="rad"></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD><input type="radio" onclick="showEdit(this)" name="rad"></TD>
<TD></TD>
<TD></TD>
</TR>
</TABLE>
</BODY>
</HTML>

第二种方法

<table border=1 width=100%>
<tr>
<td><input name=m type=checkbox onclick="mm(this)"></td>
<td>1111</td>
<td><input name=aaa value="222" disabled></td>
<td><input name=bbb value="333" disabled></td>
</tr>
<tr>
<td><input name=m type=checkbox onclick="mm(this)"></td>
<td>1111</td>
<td><input name=aaa value="222" disabled></td>
<td><input name=bbb value="333" disabled></td>
</tr>
<tr>
<td><input name=m type=checkbox onclick="mm(this)"></td>
<td>1111</td>
<td><input name=aaa value="222" disabled></td>
<td><input name=bbb value="333" disabled></td>
</tr>
</table>

<SCRIPT LANGUAGE="JavaScript">

function mm(e)
{
var currentTr=e.parentElement.parentElement;
var inputObjs=currentTr.getElementsByTagName("input");
for(var i=0;i<inputObjs.length;i++)
{
if(inputObjs[i]==e) continue;
inputObjs[i].disabled=!e.checked;
}

}
</SCRIPT>
你当前打印出的 `$el` 是一个 **文本节点(TextNode)**,其 `nodeType === 3`,而不是你期望的 `HTMLElement`。 --- ## 🔍 问题分析 你打印的 `$el` 是这样的对象: ```js { nodeType: 3, nodeName: "#text", data: "", ... } ``` 这说明你获取到的 `$el` 是一个 **DOM 文本节点(TextNode)**,而不是一个 `div`、`input` 这样的 HTML 元素节点。 --- ## ❌ 为什么会出现这种情况? 这通常是因为你获取到的不是组件的根 DOM 元素,而是一个 Vue 的虚拟节点(VNode)的 `el` 属性,或者你错误地获取了某个文本节点。 --- ## ✅ 正确做法:如何获取到真正的 DOM 元素(`HTMLElement`) ### ✅ 方法一:确保 `ref` 指向的是组件本身,并且组件暴露了 `$el` ```vue <el-cascader ref="receiverRef" /> ``` ```ts const receiverRef = ref(); ``` 然后确保你获取的是 `$el`: ```ts const component = receiverRef.value; const $el = component.$el || component.el; if ($el instanceof HTMLElement) { console.log('$el 是一个 DOM 元素:', $el); } else { console.warn('获取到的不是 DOM 元素', $el); } ``` --- ## ✅ 方法二:使用 `querySelector` 定位真正的输入框 如果你已经确认 `$el` 是一个文本节点,你可以尝试向上查找父节点,或者直接定位 `.el-cascader__label` 或 `.el-input__inner`。 ```ts const cascaderEl = document.querySelector('.el-cascader'); if (cascaderEl) { const input = cascaderEl.querySelector('.el-input__inner'); if (input) { input.click(); // 打开面板 } } ``` --- ## ✅ 方法三:使用 `closest()` 确保获取到的是容器元素 如果你从某个子元素获取到的是文本节点,可以使用 `closest()` 向上查找最近的 `HTMLElement`: ```ts function getClosestElement(node) { while (node && node.nodeType !== 1) { node = node.parentNode; } return node; } const element = getClosestElement($el); if (element && element instanceof HTMLElement) { console.log('找到最近的 HTMLElement:', element); } ``` --- ## ✅ 补充:如何判断一个变量是不是 DOM 元素? ```ts function isHTMLElement(node) { return node instanceof HTMLElement; // 或者更宽松的写法 // return node && typeof node === 'object' && node.nodeType === 1; } if (isHTMLElement($el)) { console.log('这是一个 DOM 元素'); } else { console.warn('这不是一个 DOM 元素'); } ``` --- ## ✅ 完整修复示例 ```ts const focusCascader = async () => { await nextTick(); const component = receiverRef.value; if (!component) return; let $el = null; if (component.$el) { $el = component.$el; } else if (component.el && component.el.nodeType === 1) { $el = component.el; } if (!$el) { console.warn('无法获取 DOM 元素', component); return; } // 确保 $el 是 HTMLElement const el = $el.nodeType === 1 ? $el : getClosestElement($el); if (!el || !(el instanceof HTMLElement)) { console.warn('获取到的不是一个 HTMLElement', $el); return; } console.log('最终获取到的 DOM 元素:', el); const input = el.querySelector('.el-input__inner'); if (input) { input.click(); // 打开 cascader 面板 } }; ``` --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|----------| | `$el` 是文本节点 | 获取到的是 `TextNode` 而不是 `HTMLElement` | 使用 `instanceof HTMLElement` 判断 | | `el-cascader` 聚焦无效 | 没有找到 `.el-input__inner` | 使用 `querySelector` 定位 | | `ref.value.$el` 是 `undefined` | 组件未暴露 `$el` | 使用 `expose` 或 `el` 属性 | | `$el.nodeType === 3` | 是文本节点 | 使用 `getClosestElement()` 向上查找 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值