使用JavaScript命名或重命名iframe不生效问题咨询
问题原因
iframe的name属于浏览上下文的绑定标识,浏览器会在iframe首次被插入DOM、完成初始化时,读取当时的name属性值作为该浏览上下文的唯一固定标识,后续你对DOM节点的name属性(不管是修改property还是attribute)都不会更新已经绑定好的浏览上下文标识。
你测试里看到的width、height修改生效,是因为这两个属于样式属性,不属于浏览上下文的初始化绑定属性,修改后会实时生效。而window.open第二个参数匹配的是浏览上下文的绑定标识,不是DOM节点的name属性,所以只会识别iframe初始化时的原始name,修改后的不生效,匹配不到对应浏览上下文就会新开标签页。
解决方法
分两种场景处理:
- 场景1:动态创建iframe使用,在将iframe插入DOM前就设置好
name,后续就可以正常使用该名称匹配:
// 正确示例:先设置name再插入DOM const newIframe = document.createElement('iframe') newIframe.setAttribute('name', 'targetFrame') newIframe.style.width = '400px' newIframe.style.height = '200px' // 插入DOM后浏览上下文绑定的name就是targetFrame document.body.appendChild(newIframe) // 可正常命中该iframe加载内容 window.open('https://example.com', 'targetFrame')
- 场景2:已存在的iframe需要修改
name,需要克隆原有iframe修改name后替换原节点,触发浏览器重新初始化浏览上下文绑定新名称:
function sesamOpenU(){ const oldIframe = document.querySelector('iframe'); // 深拷贝原有iframe,保留其他配置 const newIframe = oldIframe.cloneNode(true); // 修改为新名称 newIframe.name = 'myFrame1'; newIframe.style.height = '200px'; newIframe.style.width = '400px'; // 替换原节点,触发重新初始化 oldIframe.parentNode.replaceChild(newIframe, oldIframe); // 现在用新名称即可正常命中iframe const url = 'https://www.example.com/' window.open(url, 'myFrame1'); }
注意:替换iframe节点会导致原有iframe内加载的内容重置,属于正常现象。
内容的提问来源于stack exchange,提问作者FlipLucky
相关产品推荐
相关产品推荐

