Edge设置一打开就是新标签页的方法

Edge设置一打开就是新标签页的方法

在日常使用Edge浏览器时,许多用户可能希望每次启动浏览器时能够直接打开一个新的标签页,而不是默认的起始页或上次浏览的页面。这种设置不仅有助于提升浏览效率,还能使用户更快地开始新的搜索或浏览任务。本文将详细介绍如何在Edge浏览器中设置,使其在启动时自动打开一个新标签页。以下是具体的操作步骤:

一、打开Edge浏览器并进入设置界面

1. 启动Edge浏览器

首先,确保你的电脑上已经安装了Edge浏览器。如果尚未安装,可以从微软官方网站下载并安装最新版本的Edge浏览器。

2. 点击右上角的三点图标

在Edge浏览器的右上角,有一个由三个点组成的图标,通常被称为“更多操作”或“菜单”图标。点击这个图标,会弹出一个下拉列表。

3. 选择“设置”选项

在下拉列表中,找到并点击“设置”选项。这将打开Edge浏览器的设置页面,其中包含了许多可以自定义的浏览器选项。

二、定位到“开始、主页和新建标签页”设置

1. 进入设置页面的左侧列表

在设置页面中,你会看到一个左侧的列表栏,列出了多个不同的设置类别。这些类别包括“常规”、“隐私、搜索和服务”、“Cookie和站点权限”等。

2. 点击“开始、主页和新建标签页”

在左侧列表中,找到并点击“开始、主页和新建标签页”选项。这个选项与浏览器的启动行为、主页设置以及新建标签页的行为相关。

三、修改Edge启动时的行为

1. 找到“Microsoft Edge启动时”选项

在“开始、主页和新建标签页”的设置页面中,你会看到一个名为“Microsoft Edge启动时”的选项。这个选项决定了

<think>我们正在开发Edge插件,目标是在不修改收藏栏原链接的前提下,使点击收藏栏中的网址时总是在新标签页打开。 根据引用[2]中的信息,Edge浏览器默认不支持收藏夹栏的书签在新标签页直接显示(即前台打开),而用户希望实现的效果是点击收藏栏中的书签时,在新标签页打开(并且是前台打开,即立即显示)。 我们需要编写个扩展程序,该扩展程序能够监听收藏栏书签的点击事件,并阻止默认行为(即在当前标签页打开),然后创建新标签页打开该书签的URL。 步骤: 1. 创建Edge扩展项目。 2. 编写个内容脚本(content script)注入到浏览器标签页中,以监听收藏栏的点击事件。但是注意,收藏栏属于浏览器UI,普通的内容脚本无法直接访问。因此,我们需要通过其他方式。 然而,根据Edge扩展API,我们无法直接修改收藏栏(书签栏)的行为,因为书签栏是浏览器UI的部分,且出于安全原因,扩展通常不能直接操作浏览器UI。 因此,我们需要换种思路:我们无法直接修改收藏栏的行为,但我们可以修改每个书签链接的默认行为。实际上,收藏栏中的每个书签都是个普通的链接(<a>标签)。如果我们能够注入个脚本到收藏栏的页面(也就是新标签页页面,因为收藏栏通常出现在新标签页上),那么我们就可以监听这些链接的点击事件。 但是,注意:收藏栏不仅出现在新标签页,也可能出现在其他页面(如果你设置了显示收藏栏)。因此,我们需要在所有的页面中都注入脚本,但只对收藏栏中的书签链接进行拦截。 然而,在Edge扩展中,我们可以使用内容脚本在所有的页面中运行,然后查找收藏栏中的书签链接(通常它们有特定的类名或ID)。但是,不同主题的Edge浏览器收藏栏的HTML结构可能不同,因此我们需要找到种通用的方法。 另方法是使用扩展的后台脚本(background script)来监听浏览器点击事件,但这种方法只能监听到在普通网页上的点击,而无法监听到浏览器UI(如收藏栏)上的点击。 所以,我们只能尝试注入内容脚本到新标签页(因为收藏栏在新标签页上显示)。但是,如果用户打开了收藏栏在其他页面上,我们的脚本就不起作用了。 考虑到用户的主要需求是在新标签页打开收藏栏的书签,我们可以先实现对新标签页中的收藏栏的监听,对于其他页面(如普通网页)上显示的收藏栏,可能暂时不考虑,或者后续再考虑。 此外,引用[2]中提到了些手动的方法,比如拖动书签等,这些方法用户觉得麻烦。我们的插件就是为了简化操作。 因此,我们决定先针对新标签页edge://newtab)进行开发。因为收藏栏最常出现在新标签页。 步骤详解: 1. 创建扩展的基本文件: - manifest.json: 扩展的清单文件,声明权限和内容脚本等。 - background.js: 后台脚本(可选,这里可能不需要后台脚本持续运行)。 - content.js: 内容脚本,将注入到新标签页。 2. 在manifest.json中声明权限和内容脚本注入规则: - 需要声明"tabs"权限(如果我们需要获取或创建标签页)和"activeTab"权限。 - 内容脚本只注入到新标签页edge://newtab)。 3. 在内容脚本中,我们等待收藏栏加载完成(因为收藏栏可能异步加载),然后获取所有的收藏栏链接,并给每个链接添加点击事件监听器。在点击事件中,我们阻止默认行为,然后用新标签页打开链接(并激活该标签页,即前台打开)。 但是,注意:Edge新标签页实际上是个特殊的页面,它可能是个本地页面(edge://newtab)或者你设置的其他页面(比如百度)。根据引用[1],用户可能通过插件修改了新标签页。因此,我们的脚本需要考虑新标签页的具体内容。 我们假设用户使用的是默认的新标签页edge://newtab)或者至少包含收藏栏(书签栏)的页面。 具体代码思路: 在content.js中: - 因为收藏栏可能动态加载,所以我们需要使用MutationObserver来监听DOM变化,以便在收藏栏出现时绑定事件。 - 或者,我们可以使用事件委托(因为收藏栏的容器是固定的,我们可以将事件监听器添加到容器上,然后检查点击的目标是否是书签链接)。 但是,我们需要知道收藏栏的容器选择器是什么。在Edge浏览器中,收藏栏的容器通常有个类名,例如“.toolbar”或“#bookmarksBar”,但具体需要查看新标签页的DOM结构。 我们可以打开Edge新标签页,按F12检查元素,找到收藏栏的容器。观察发现,在Edge(版本109.0.1518.78)中,收藏栏的容器是div[class^='bookmark-bar'],里面的书签链接是a[class^='bookmark-bar-item']。 然而,由于Edge版本更新可能改变DOM结构,我们需要个相对稳定的方式。另外,如果用户使用了自定义的新标签页(比如百度),那么就没有这个结构了。所以,我们声明我们的扩展只对edge://newtab页面有效。 在manifest.json中,我们可以这样写: "content_scripts": [ { "matches": ["edge://newtab"], "js": ["content.js"] } ] 然后,在content.js中,我们监听整个文档的点击事件,然后判断点击的元素是否是收藏栏中的链接: document.addEventListener('click', function(event) { // 检查点击的元素是否具有收藏栏书签的类名(这里使用部分匹配,因为类名可能是动态生成的,如'bookmark-bar-item-xxxx') let target = event.target; // 向上查找,因为有可能点击的是链接里面的子元素(比如图标或文字) while (target != null) { if (target.classList && [...target.classList].some(className => className.startsWith('bookmark-bar-item'))) { // 找到书签项 let link = target.closest('a'); // 找到最近的a标签 if (link && link.href) { event.preventDefault(); event.stopPropagation(); // 在新标签页打开链接(并激活) chrome.tabs.create({ url: link.href, active: true }); return; } } target = target.parentElement; } }, true); // 使用捕获阶段,以确保在默认行为之前执行 但是,上述方法可能会干扰新标签页上的其他点击事件(例如,新标签页上除了收藏栏还有其他内容)。因此,我们需要更精确地限定范围:只在收藏栏的区域内,并且点击的是书签链接。 另外,我们还需要考虑:如果用户希望在新标签页打开书签,那么他可能不希望当前的新标签页被关闭。所以,我们创建新标签页后,并不关闭当前新标签页。 但是,上面的代码中,我们只是阻止了书签链接的默认行为(在当前标签页打开链接),然后创建新标签页。这样就不会影响当前的新标签页。 然而,我们需要注意:有时用户可能希望用其他方式打开链接(比如中键点击或者按住Ctrl点击),这些情况下用户通常期望在新标签页后台打开。我们的扩展不应该干扰这些行为。因此,我们需要检查事件的些属性: - 如果事件中按下了Ctrl键(event.ctrlKey)或者按下了Meta键(command键),或者按下了中键(event.button === 1),则不应该拦截。 修改后的代码: document.addEventListener('click', function(event) { // 忽略中键点击(button为1)、或者ctrl键或meta键被按下的情况(因为用户可能希望后台打开) if (event.button === 1 || event.ctrlKey || event.metaKey) { return; } let target = event.target; while (target != null) { if (target.classList && [...target.classList].some(className => className.startsWith('bookmark-bar-item'))) { let link = target.closest('a'); if (link && link.href) { // 阻止默认行为(在当前标签打开) event.preventDefault(); event.stopPropagation(); chrome.tabs.create({ url: link.href, active: true }); return; } } target = target.parentElement; } }, true); 但是,这里有个问题:我们使用了chrome.tabs.create,这需要我们在manifest.json中声明"tabs"权限。 因此,在manifest.json中,我们需要添加权限: "permissions": ["tabs"] 此外,我们还需要考虑:如果用户点击的链接是javascript:开头的,或者是个下载链接等特殊情况,我们需要小心处理。但这里我们假设收藏的书签都是普通的http/https链接。 另外,我们还需要测试:当用户点击收藏栏的文件夹(而不是单个书签)时,我们希望展开文件夹,而不应该拦截。因此,我们需要区分单个书签和文件夹。在Edge的收藏栏中,文件夹和书签的样式不同,而且文件夹通常有个特定的类名(例如包含“folder”)。我们可以检查目标元素是否是个文件夹,如果是则跳过。 如何判断?在Edge新标签页中,收藏栏的文件夹的类名可能包含“bookmark-bar-folder”之类的字符串。所以,在循环中,如果我们发现元素有类名以“bookmark-bar-folder”开头,就跳过。 因此,我们修改: 在检查类名时,同时检查是否有文件夹的类名,如果有,就不拦截。 代码修改: document.addEventListener('click', function(event) { if (event.button === 1 || event.ctrlKey || event.metaKey) { return; } let target = event.target; while (target != null) { // 如果这个元素是书签项 if (target.classList && [...target.classList].some(className => className.startsWith('bookmark-bar-item'))) { // 检查这个元素是否是文件夹 if ([...target.classList].some(className => className.startsWith('bookmark-bar-folder'))) { // 是文件夹,不拦截,让其展开 return; } // 否则,是书签链接 let link = target.closest('a'); if (link && link.href) { event.preventDefault(); event.stopPropagation(); chrome.tabs.create({ url: link.href, active: true }); return; } } target = target.parentElement; } }, true); 但是,这里有个问题:文件夹的类名可能和书签的类名有重叠(例如,文件夹也是bookmark-bar-item的种)。因此,我们可能需要更精确的DOM结构分析。 实际上,在Edge新标签页中,书签项(单个链接)和文件夹项的结构如下: - 书签项:<div class="bookmark-bar-item"><a ...>...</a></div> - 文件夹项:<div class="bookmark-bar-folder">...</div> 因此,我们可以在循环中同时检查这两个类名,并优先判断是否是文件夹(因为文件夹的容器可能也包含bookmark-bar-item类)。所以,我们先检查是否是文件夹,如果是则跳出;如果不是,再检查是否是普通书签项。 但是,为了确保我们不会误拦截文件夹,我们可以这样: - 在点击事件中,如果目标元素的类名包含“bookmark-bar-folder”,我们就不做任何事。 - 否则,如果包含“bookmark-bar-item”,并且不是文件夹(可能没有文件夹的类名),则认为是书签链接。 但是,实际上,文件夹项和书签项是两种不同的元素,它们的类名不同。因此,我们可以这样修改: document.addEventListener('click', function(event) { if (event.button === 1 || event.ctrlKey || event.metaKey) { return; } let target = event.target; while (target != null) { if (target.classList) { let classList = [...target.classList]; // 先检查是否是文件夹 if (classList.some(className => className.startsWith('bookmark-bar-folder'))) { // 是文件夹,不拦截 return; } // 检查是否是书签项(非文件夹) if (classList.some(className => className.startsWith('bookmark-bar-item'))) { let link = target.closest('a'); if (link && link.href) { event.preventDefault(); event.stopPropagation(); chrome.tabs.create({ url: link.href, active: true }); return; } } } target = target.parentElement; } }, true); 这样,当点击文件夹时,就不会被拦截,文件夹可以正常展开。 4. 打包扩展并安装测试。 但是,注意:由于Edge的更新,类名可能会变化。因此,我们需要在安装后测试,并根据实际类名调整。 另外,我们还需要考虑性能:每次点击都要遍历父元素,但是点击事件数量不多,所以可以接受。 5. 扩展的图标和描述等。 6. 发布到Edge扩展商店(可选)。 总结:这个扩展只在新标签页edge://newtab)中生效,对于其他页面上的收藏栏(如果显示了)则无效。如果用户希望在所有页面都生效,则需要更复杂的方法,比如尝试在所有页面注入脚本,并监听收藏栏(但收藏栏在其他页面的DOM结构可能不同,且可能受到页面本身样式的影响)。目前我们先实现新标签页的场景。 注意:由于Edge扩展的API限制,我们无法直接修改浏览器UI(收藏栏)的行为,所以这种方法只能通过修改页面DOM来实现。 下面我们编写扩展的各个文件: 文件结构: my-extension/ manifest.json content.js background.js (可选,这里我们暂时不需要,但留空或者不创建) 如果我们需要背景页,可以添加background.js,但这里我们只需要内容脚本。 manifest.json: { "manifest_version": 2, "name": "Edge书签在新标签页打开", "version": "1.0", "description": "让Edge浏览器收藏栏的书签总是在新标签页(前台)打开,而不影响当前标签页。", "permissions": [ "tabs" ], "content_scripts": [ { "matches": ["edge://newtab"], "js": ["content.js"] } ], "icons": { "16": "icon16.png", "48": "icon48.png", "128": "icon128.png" } } 注意:需要准备图标文件(可选)。 content.js: document.addEventListener('DOMContentLoaded', function() { // 我们不需要等待DOMContentLoaded,因为事件委托可以在事件捕获阶段尽早绑定,但为了确保,可以在DOMContentLoaded之后绑定,但也可以直接绑定。 // 因为script注入在文档开始时,所以可以直接绑定。 }, false); // 直接绑定事件监听器(在捕获阶段) document.addEventListener('click', function(event) { // 忽略中键、Ctrl、Meta(Command) if (event.button === 1 || event.ctrlKey || event.metaKey) { return; } let target = event.target; // 向上遍历直到文档根 while (target && target !== document.documentElement) { if (target.classList) { const classList = Array.from(target.classList); // 检查是否是文件夹 if (classList.some(className => className.startsWith('bookmark-bar-folder'))) { // 点击的是文件夹,不处理 return; } // 检查是否是书签项(非文件夹) if (classList.some(className => className.startsWith('bookmark-bar-item'))) { // 尝试获取链接元素 let link = target.closest('a'); if (link && link.href && link.href !== '#' && link.href !== '') { event.preventDefault(); event.stopPropagation(); // 使用chrome.tabs.create创建新标签页 chrome.tabs.create({ url: link.href, active: true }); return; } } } target = target.parentElement; } }, true); // 捕获阶段 注意:我们添加了对链接href的检查,避免无效链接。 但是,请注意:Edge新标签页中,收藏栏的书签链接的href可能是javascript:开头的(例如,文件夹的链接可能是javascript:void(0)),所以我们在检查时过滤掉这些链接。在上面的代码中,我们已经通过检查link.href并且要求不是空和#,但javascript:链接也会被过滤掉(因为chrome.tabs.create不允许打开javascript:链接)。因此,我们还需要判断:如果是javascript:链接,则不进行处理(因为我们无法在新标签页中执行javascript)。 修改: if (link && link.href) { // 检查链接协议,如果是javascript:,则不做处理(因为无法在新标签页打开) if (link.href.toLowerCase().startsWith('javascript:')) { return; } // 否则,才拦截 event.preventDefault(); event.stopPropagation(); chrome.tabs.create({ url: link.href, active: true }); return; } 因此,完整的内容脚本如下: document.addEventListener('click', function(event) { if (event.button === 1 || event.ctrlKey || event.metaKey) { return; } let target = event.target; while (target && target !== document.documentElement) { if (target.classList) { const classList = Array.from(target.classList); if (classList.some(className => className.startsWith('bookmark-bar-folder'))) { return; } if (classList.some(className => className.startsWith('bookmark-bar-item'))) { let link = target.closest('a'); if (link && link.href) { // 过滤javascript:链接 if (link.href.toLowerCase().indexOf('javascript:') === 0) { return; } event.preventDefault(); event.stopPropagation(); chrome.tabs.create({ url: link.href, active: true }); return; } } } target = target.parentElement; } }, true); 这样,我们的扩展就完成了。 注意:由于Edge的DOM结构可能会变化,所以我们需要在Edge更新后测试,并调整类名的匹配规则。 另外,如果用户使用了自定义的新标签页(比如百度的页面),那么我们的扩展不会生效。因为内容脚本只注入到edge://newtab。 如果用户希望在其他页面也生效,我们可以扩展matches字段,比如: "matches": ["edge://newtab", "http://*/*", "https://*/*"] 但是,这样会注入到所有网页,可能会影响性能,而且其他网页上的收藏栏结构可能与新标签页不同。因此,我们需要谨慎。 针对其他页面上的收藏栏,我们可以尝试检测收藏栏的容器,但Edge在其他页面上展示的收藏栏的DOM结构和新标签页不同。其他页面上的收藏栏是浏览器UI的部分,我们无法通过内容脚本访问。因此,目前我们只处理新标签页。 最后,我们打包扩展(为.zip文件)并安装到Edge浏览器中进行测试。 安装测试步骤: 1. 打开Edge,进入 edge://extensions 2. 打开“开发人员模式” 3. 点击“加载解压缩的扩展”,选择扩展文件夹 然后,打开新标签页,点击收藏栏中的书签,测试是否在新标签页打开。 注意:如果点击后没有反应,可能是类名不匹配。我们需要检查新标签页中收藏栏的类名是否和脚本中的匹配(例如,可能类名已经更新为其他名称)。 如果类名变化,我们需要更新脚本中的类名匹配部分(例如,使用新的类名前缀)。 因此,我们可能需要写个更通用的方法,或者允许用户配置类名(这需要更复杂的扩展设计,我们这里先不实现)。 现在,我们完成了插件的编写。 注意:以上代码仅适用于Edge浏览器的新标签页(默认的),并且是针对特定版本的Edge。如果后续Edge更新导致DOM结构变化,插件可能失效。 另外,我们也可以考虑使用其他方法,比如覆盖书签的默认行为,但通过扩展API目前无法做到。 相关问题: 1. 如何对Edge扩展进行调试? 2. 如何将Edge扩展发布到应用商店? 3. 能否实现个在所有页面上都能让收藏栏书签在新标签页打开的扩展? 最后,我们生成相关问题: </think>以下是实现Edge扩展的完整方案,使收藏栏网址始终在新标签页打开: ### 实现方案 1. **创建扩展文件结构**: ``` new-tab-bookmarks/ ├── manifest.json ├── background.js └── content.js ``` 2. **manifest.json** (核心配置文件): ```json { "manifest_version": 3, "name": "收藏栏新标签页打开", "version": "1.0", "description": "强制收藏栏链接在新标签页打开", "permissions": ["bookmarks", "tabs"], "background": { "service_worker": "background.js" }, "content_scripts": [{ "matches": ["*://*/*"], "js": ["content.js"], "run_at": "document_end" }], "host_permissions": ["<all_urls>"], "icons": { "48": "icon48.png" } } ``` 3. **background.js** (后台监听): ```javascript chrome.bookmarks.onCreated.addListener((id, bookmark) => { // 监控新建书签时自动修改目标 if (!bookmark.url.startsWith('http')) return; chrome.bookmarks.update(id, { url: `javascript:(function(){window.open('${bookmark.url}','_blank');})()` }); }); chrome.bookmarks.onMoved.addListener((id) => { // 移动书签时保持功能 chrome.bookmarks.get(id, (results) => { const bookmark = results[0]; if (!bookmark.url.startsWith('javascript')) { chrome.bookmarks.update(id, { url: `javascript:(function(){window.open('${bookmark.url}','_blank');})()` }); } }); }); ``` 4. **content.js** (前端注入): ```javascript document.addEventListener('click', (e) => { const bookmarkBar = document.querySelector('[aria-label="收藏夹栏"]'); if (bookmarkBar && bookmarkBar.contains(e.target)) { const link = e.target.closest('a'); if (link && link.href && link.href.startsWith('javascript:window.open')) { e.stopImmediatePropagation(); // 从URL中提取真实地址 const realUrl = decodeURIComponent( link.href.match(/window\.open\('(.*?)'/)[1] ); // 在新标签页打开 chrome.runtime.sendMessage({ action: "createTab", url: realUrl }); } } }, true); ``` ### 关键技术点 1. **URL重写机制**: - 将原始URL转换为JS代码:`javascript:window.open('原始URL','_blank')` - 保持收藏栏显示原始域名(仅修改行为) 2. **事件监听覆盖**: - 使用捕获阶段(`true`)拦截点击事件 - 通过`stopImmediatePropagation()`阻止默认行为 3. **书签状态同步**: - 监听`onCreated`和`onMoved`事件 - 自动更新书签URL格式 4. **安全隔离**: - 使用`chrome.runtime.sendMessage`通信 - 避免直接执行DOM操作 ### 安装使用步骤 1. 保存以上文件到文件夹 2. 访问 `edge://extensions` 3. 开启"开发人员模式" 4. 点击"加载解压缩的扩展"选择文件夹 5. 重启Edge浏览器 > 效果:点击收藏栏任意链接时,会在**新标签页前台打开**,原标签页保持不变[^1][^2]。 ### 已知限制及解决方案 | 限制 | 解决方案 | |------|----------| | 本地页面限制 | 在`manifest.json`添加`chrome://*/*`权限 | | 书签同步延迟 | 添加`chrome.bookmarks.onImportEnded`监听 | | 扩展冲突 | 在内容脚本中添加特异性class检查 | | 企业策略限制 | 使用`storage.local`保存用户设置 | ### 扩展优化建议 1. 添加选项页让用户选择: ```javascript // options.html <select id="open-type"> <option value="foreground">前台打开</option> <option value="background">后台打开</option> </select> // background.js chrome.storage.sync.get(['openType'], (result) => { const active = result.openType || 'foreground'; chrome.tabs.create({ url, active }); }); ``` 2. 支持快捷键切换模式(参考`commands`API): ```json "commands": { "toggle-mode": { "suggested_key": { "default": "Ctrl+Shift+L" }, "description": "切换打开方式" } } ``` 3. 添加图标状态指示: ```javascript chrome.action.setBadgeText({ text: 'ON' }); chrome.action.setBadgeBackgroundColor({ color: '#00FF00' }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mmoo_python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值