jquery 中的 $(“#”) 与 js中的document.getElementById(“”) 的区别

以前没注意过,认为jquery 中的 $("#") 与 document.getElementById("") 是一回事,指的是同一个东西。
这次项目开发在使用验证码生成的时候,发现两者不同,使用时需要注意!

通过以下测试:
js中代码

function reloadValidCode(o) 

alert(o);

    o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" new Date().getMilliseconds(); 

}

 

function refresh() 

alert($("#imageYZ"));

   document.getElementById("imageYZ").src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliseconds(); 

}

jsp中代码

<img src="${pageContext.request.contextPath }/validCodeServletid="imageYZ" alt="换一张onclick="reloadValidCode(this)"/>

看不清?<href="#this" onclick="refresh();"> 换一张</a>


我很打算在refresh()函数中使用
$("#imageYz").src = "${pageContext.request.contextPath }/validCodeServlet?timed=" new Date().getMilliseconds(); 
进行设置,但是发现不行;原来alert(o)的结果是:
[object HTMLCanvasElement]
alert($("#imageYZ"))的结果是:
[objec Object]
从这里不难看出两者真的不一样;
再用firebug调试看一下,
$("#imageYZ")和document.getElementById("imageYZ")倒底是什么内容。调试结果如下:

$("#imageYZ")                         [img#imageYZ]
    
document.getElementById("imageYZ")    img#imageYZ

想必,看到这里,不用我说,大家也会想到结果了。

实际上,$("#imageYZ")[0]等同于 document.getElementById("imageYZ")

<think>我们正在处理一个前端问题:尝试通过jQuery获取iframe内部的文档对象时,使用`$("#operatorConfigIframe").contentDocument`或`$("#operatorConfigIframe").document`无法获取到元素。 原因分析: 1. 首先,`$("#operatorConfigIframe")`获取的是一个jQuery对象,它封装了DOM元素(即iframe元素)。但是,jQuery对象本身并没有`contentDocument`或`document`属性。 2. 正确的做法是:先通过jQuery获取到DOM元素(使用索引0或get(0)),然后使用DOM元素的`contentDocument`属性(对于现代浏览器)或`contentWindow.document`(为了兼容老浏览器)。 解决方案: 获取iframe内部的document对象,应该这样做: ```javascript // 方法1:使用contentDocument(推荐) var iframe = $("#operatorConfigIframe")[0]; // 获取DOM元素 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; // 方法2:使用contents()方法(jQuery方式,但要求同源) // 注意:此方法要求iframe父页面同源,否则会因为同源策略而失败 var iframeDoc = $("#operatorConfigIframe").contents().get(0); // 然后就可以在iframeDoc上使用jQuery $(iframeDoc).find(&#39;selector&#39;); // 或者直接使用jQuery的contents()方法获取内容 $("#operatorConfigIframe").contents().find(&#39;selector&#39;); ``` 注意事项: - 同源策略:如果iframe的src父页面不同源,那么除了使用`postMessage`进行通信外,无法直接访问其内部文档。 - 加载时机:确保在iframe加载完成后再访问其内容,可以在iframe的load事件中执行操作。 示例代码(确保加载完成): ```javascript $("#operatorConfigIframe").on("load", function() { // 获取iframe的document var iframeDoc = this.contentDocument || this.contentWindow.document; // 或者使用jQuery的方式 var $iframeContents = $(this).contents(); // 在iframe内部查找元素 var innerElement = $iframeContents.find("#someElement"); }); ``` 错误原因总结: 1. 直接在jQuery对象上访问`contentDocument`或`document`属性是不正确的,因为jQuery对象本身没有这些属性。 2. 需要先获取到原生的DOM元素,再使用原生属性。 因此,正确的做法是:从jQuery对象中提取DOM元素,然后使用`contentDocument`(或`contentWindow.document`)来获取iframe内部的文档对象。 §§相关问题§§ 1. 使用jQuery操作iframe内部元素时,如何确保iframe已经完全加载? 2. 如果iframe跨域,除了`postMessage`还有哪些安全的方法可以实现父子页面通信? 3. 在获取`contentDocument`时,`contentDocument``contentWindow.document`有什么区别? 4. 如何在不使用jQuery的情况下,通过原生JavaScript安全地获取iframe中的元素? 5. 当页面中有多个iframe时,如何避免在`load`事件中获取错误的iframe文档? </think> ### 问题分析:`$("#operatorConfigIframe").contentDocument` 无法获取元素的原因 #### 核心问题:**jQuery对象DOM属性的混淆** 1. **jQuery对象无`contentDocument`属性** `$("#operatorConfigIframe")` 返回的是 **jQuery对象**,而非原生DOM元素。 jQuery对象没有`contentDocument`或`document`属性,需转换为原生DOM: ```javascript // 正确做法:获取原生DOM元素 const iframeDom = $("#operatorConfigIframe")[0]; // 或 .get(0) const iframeDoc = iframeDom.contentDocument; ``` 2. **跨域限制(最常见原因)** 若iframe的`src`父页面**不同源**(协议/域名/端口任一不同),浏览器会阻止访问: ```javascript // 控制台错误提示 Uncaught DOMException: Blocked a frame from accessing a cross-origin frame ``` 3. **时序问题:iframe未完成加载** 在iframe内容加载完成前访问`contentDocument`会返回`null`: ```javascript console.log(iframeDom.contentDocument); // 可能返回 null ``` --- ### 解决方案 #### 1. 正确获取文档对象 ```javascript // 方法1:通过原生DOM const iframeDom = document.getElementById("operatorConfigIframe"); const iframeDoc = iframeDom.contentDocument || iframeDom.contentWindow.document; // 方法2:通过jQuery转换 const iframeDoc = $("#operatorConfigIframe")[0].contentDocument; ``` #### 2. 处理跨域场景 ```javascript // 使用postMessage通信(父子页面双向) // 父页面发送指令 iframeDom.contentWindow.postMessage({ cmd: "getElement", id: "targetId" }, "*"); // iframe内监听 window.addEventListener("message", (event) => { if (event.data.cmd === "getElement") { const el = document.getElementById(event.data.id); event.source.postMessage({ elementData: el.outerHTML }, "*"); } }); ``` #### 3. 确保加载完成 ```javascript $("#operatorConfigIframe").on("load", function() { const iframeDoc = this.contentDocument; const targetEl = iframeDoc.getElementById("key"); console.log("元素获取成功:", targetEl); }); ``` #### 4. 同源情况下的快捷操作 ```javascript // 同源时可直接使用jQuery $("#operatorConfigIframe").contents().find("#key").css("color", "red"); ``` --- ### 关键排查步骤 1. **检查控制台错误**:确认是否出现跨域安全错误 2. **验证iframe加载状态**: ```javascript console.log($("#operatorConfigIframe").prop("complete")); // 是否加载完成 ``` 3. **同源测试**:临时将iframe设为同源URL测试是否解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值