您好!欢迎访问家园网-www.jy.wang!

家园网

open的target有几种

网络 作者:本站 点击:

window.open() 的 target 参数主要有以下几种形式:

1. 标准保留关键字(4种)

① _blank


window.open('page.html', '_blank');

效果

  • 总是在新窗口或新标签页中打开

  • 每次点击都会创建新窗口

  • 最常用的方式

② _self


window.open('page.html', '_self');

效果

  • 当前窗口/标签页中打开

  • 等同于直接导航或 <a> 标签的默认行为

③ _parent


window.open('page.html', '_parent');

效果

  • 父级框架中打开(如果存在框架)

  • 如果没有框架,等同于 _self

④ _top


window.open('page.html', '_top');

效果

  • 最顶层窗口中打开(跳出所有框架)

  • 如果没有框架,等同于 _self

2. 自定义窗口名称


// 自定义名称(如之前的例子中的 'new')
window.open('page.html', 'myWindow');

特点

  • 如果已经存在同名窗口,则在该窗口中打开(复用)

  • 如果不存在,则新建窗口

  • 后续可通过这个名称操作窗口

示例

// 第一次点击:创建新窗口
window.open('page1.html', 'myWindow');
// 第二次点击(相同代码):在已存在的窗口中加载新页面
window.open('page2.html', 'myWindow'); // 会覆盖 page1.html

3. 特殊用法和注意事项

结合特性参数


// 创建带特性的自定义窗口
window.open('page.html', 'myPopup', 'width=400,height=300');

框架内的目标


<!-- 在框架结构中使用 -->
<frameset cols="50%,50%">
    <frame name="frameLeft" src="left.html">
    <frame name="frameRight" src="right.html">
</frameset>
<script>
// 在框架页面中可以这样使用
window.open('new.html', 'frameLeft');  // 在左侧框架打开
window.open('new.html', 'frameRight'); // 在右侧框架打开
</script>

4. 实际应用对比

场景1:总是打开新窗口


<!-- 广告、外部链接等不希望离开本站的情况 -->
<a href="https://external.com" target="_blank" rel="noopener">外部链接</a>
<script>
// JavaScript 方式
window.open('https://external.com', '_blank');

场景2:控制已有窗口


// 保持同一窗口打开多个页面(如后台管理)
function openInSameWindow(url) {
    window.open(url, 'adminPanel', 'width=1200,height=800');
}
// 所有调用都在同一个窗口中打开
openInSameWindow('dashboard.html');   // 创建窗口
openInSameWindow('users.html');       // 替换为users
openInSameWindow('settings.html');    // 替换为settings

场景3:框架导航


<!-- 多窗口应用,每个功能在独立窗口 -->
<button onclick="openFinance()">财务</button>
<button onclick="openHR()">人事</button>
<script>
function openFinance() {
    window.open('finance.html', 'financeWindow', 'width=800,height=600');
}
function openHR() {
    window.open('hr.html', 'hrWindow', 'width=800,height=600');
}
// 财务和人事会在各自独立的窗口中打开
</script>

5. 现代Web开发中的变化

不再是窗口名称,而是上下文名称

现代浏览器中,target 参数更多作为浏览上下文(browsing context)的名称

rel 属性的配合使用

<!-- 安全最佳实践 -->
<a href="https://external.com" 
   target="_blank" 
   rel="noopener noreferrer">
   外部链接
</a>
<!-- JavaScript 对应写法 -->
<script>
const newWindow = window.open('https://external.com', '_blank');
if (newWindow) {
    newWindow.opener = null;  // 安全措施
}
</script>

弹窗拦截的考虑


// 安全的打开方式
function safeOpen(url, target = '_blank') {
    // 确保在用户交互事件中触发
    const newWindow = window.open(url, target);
    
    if (!newWindow) {
        // 可能被浏览器拦截
        alert('弹窗被阻止,请允许弹出窗口或直接访问。');
        return null;
    }
    
    // 安全设置
    newWindow.opener = null;  // 防止新窗口通过opener操作原窗口
    return newWindow;
}

6. 返回值

window.open() 返回对新窗口的引用(如果成功)或 null(如果失败或被拦截):


const popup = window.open('page.html', 'myWindow');
if (popup === null) {
    console.log('弹窗被浏览器拦截!');
} else {
    console.log('弹窗已打开');
    // 可以操作新窗口
    popup.focus();  // 聚焦到新窗口
}

7. 特殊技巧

检查窗口是否已存在


function openOrFocusWindow(url, winName) {
    // 尝试聚焦现有窗口
    const existingWindow = window.open('', winName);
    
    if (existingWindow && existingWindow.location.href !== 'about:blank') {
        // 窗口已存在,聚焦它
        existingWindow.focus();
        // 如果需要,可以导航到新URL
        if (existingWindow.location.href !== url) {
            existingWindow.location.href = url;
        }
    } else {
        // 窗口不存在,创建新窗口
        window.open(url, winName, 'width=800,height=600');
    }
}

总结表格

target 值含义是否创建新窗口典型场景
_blank新窗口/标签页总是创建外部链接、不想离开当前页
_self当前窗口不创建同页面导航、表单提交
_parent父框架不创建(在父框架打开)框架页面导航
_top顶层窗口不创建(在顶层打开)跳出框架
自定义名称指定名称的窗口如果不存在则创建控制特定窗口、复用窗口

最佳实践建议

  1. 优先使用 _blank:对于弹窗和外部链接

  2. 添加安全属性

    window.open(url, '_blank', 'noopener,noreferrer');

  3. 处理弹窗拦截:检查返回值是否为 null

  4. 避免过多弹窗:现代用户体验不喜欢过多弹窗

  5. 考虑替代方案:模态框(Modal)通常是更好的选择

在原始代码中,使用 'new' 作为自定义名称,这意味着如果用户多次点击,所有内容都会在同一个窗口中打开(后打开的会覆盖先前的)。

标签: