- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我希望将 Safari 中的新标签重定向到某个 URL,本质上是更改默认的新标签页。但是,我不想重定向通过以下链接打开的新选项卡。
Windows and Tabs API描述选项卡“打开”事件,但是当任何打开新选项卡(包括从链接打开的新选项卡)时会触发这些事件。
有没有办法只为那些通过单击新标签按钮创建的标签捕获新标签事件?
最佳答案
在您的open
事件处理程序中,首先检查事件目标是否为选项卡。如果是,请为该选项卡上的 beforeNavigate
事件注册一个事件处理程序。如果 beforeNavigate
事件没有在(比方说)50 毫秒内触发,还可以设置一个超时来注销处理程序。例如:
function handleOpen(e) {
if (e.target instanceof SafariBrowserTab) {
e.target.addEventListener('beforeNavigate', handleBeforeNavigate, false);
setTimeout(function () {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
}, 50);
}
}
现在,标签页打开事件之后的 beforeNavigate
事件有三种相关的可能结果。
情况 1:beforeNavigate
事件不会在超时时间内触发。这通常意味着选项卡是空的。一个空标签不可能是点击链接的结果,所以我们可以在超时函数中放一些代码来做我们想做的事:
function handleOpen(e) {
if (e.target instanceof SafariBrowserTab) {
e.target.addEventListener('beforeNavigate', handleBeforeNavigate, false);
setTimeout(function () {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
takeOverTab();
}, 50);
}
}
情况 2:beforeNavigate
事件将触发,其 url
属性的值为 null
.这意味着该选项卡将加载 Top Sites 页面或书签页面(两个特殊的 Safari 页面,它们是新选项卡的选项)。就像一个空标签一样,这样的标签不可能是点击链接的结果,所以我们可以对标签做我们喜欢的事情。例如:
function handleBeforeNavigate(e) {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
if (e.url === null) {
takeOverTab();
}
}
情况 3:beforeNavigate
将触发,其 url
值将是一个非空字符串:即,一个实际的 URL .这是一个棘手的案例,因为该选项卡可能是由链接单击、新选项卡命令(如果用户已将 Safari 配置为在其主页上打开新选项卡)或其他应用程序或扩展程序的操作引起的。我们将选项卡是链接点击结果的情况称为情况 3A;它是 new-tab 命令的结果的情况,情况 3B;和其他应用案例,案例 3C。
我想不出区分 3B 和 3C 的方法。如果真的没有办法区分这两种情况,则可能对您的应用非常不利,因为您可能不想重定向由其他应用打开的选项卡。
如果您不关心您的应用是否会干扰 3C 标签,至少有一种方法可以区分 3A 标签和 3B/3C 标签。这是我想到的方式:
在每个页面中使用注入(inject)脚本来监听链接点击。单击链接时,将 URL 和单击时间转发到全局页面,全局页面将记住它们以备将来引用。例如:
function handleMessage(e) {
if (e.name === 'linkClicked') {
lastClickedLinkUrl = e.message.url;
lastLinkClickTime = e.message.clickTime;
}
}
在您的 beforeNavigate
处理程序中,测试事件的 url
值是否与上次单击的链接的 URL 不同。如果是,则新选项卡不是由该链接点击产生的,因此它可能不是由任何链接点击产生的。如果这两个 URL 相同,请检查自上次链接点击后是否经过了超过 100 毫秒的时间。如果是这种情况,那么 URL 相同可能只是巧合,因此您可以再次推断新标签页不是由链接点击产生的。例如:
function handleBeforeNavigate(e) {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
if (e.url === null) {
takeOverTab();
} else if (e.url !== lastClickedLinkUrl || (new Date) - lastLinkClickTime > 100) {
takeOverTab();
}
}
请注意,这种检测方法并非万无一失。它可能有多种出错方式。不过,我希望这会有所帮助。
关于javascript - Safari 扩展 : Event for a completely new tab?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10148711/
Safari 和 Mobile Safari 在组合边框半径、填充和边框时似乎有问题。在 Chrome 和 Firefox 中运行良好。 CSS: img { width: 200px;
每次我在打开 Safari 开发工具的情况下加载页面(无论是哪个选项卡)时,都会触发一些断点,并且我会被重定向到“源代码”选项卡,并显示消息“调试器已暂停”。问题是我没有设置任何断点,至少是有意的,这
我有一个复合 div(它有 translate3d)和一个 opacity过渡: #bad { background-color: red; -webkit-transition: o
我想为我正在制作的工具添加一个类似的功能。我对它在代码方面的工作方式很感兴趣。我希望能够获得一个 html 页面并排除除文章之外的所有内容。 最佳答案 Readability 项目对 chrome 和
我们有一个重定向到另一台服务器的 API 端点。它是通过 XHR 调用的,似乎在大多数浏览器中都能正常工作,除了 Safari(特别是在 iOS 上)。 我在控制台中遇到的错误是:跨源重定向被跨源资源
如何在 Safari 中为网页添加 IE 等页面转换效果? 最佳答案 你可以看看这个例子:http://sachiniscool.blogspot.com/2006/01/implementing-p
所以我用拇指和周围的白色边框制作了这个圆圈。一切都在每个浏览器中都能找到,除了 safari,它不会按应有的方式呈现白色边框。那我怎样才能让它工作呢? 示例 http://jsfiddle.net/v
我找遍了这个问题的解决方案,但似乎没有任何效果,如果可以避免的话,我真的不想使用 hack。 当我将 line-height 设置为垂直居中时,我的导航栏在任何地方都居中,但在 safari 中,它的
在输入字段中输入时,safari 会创建一个基于下拉列表的联系人。我不知道如何隐藏这个下拉菜单。我可以隐藏联系人按钮。 我正在运行 Safari 版本 11.0.1 重现 fiddle : https
我需要一个苹果脚本来全屏打开 safari 并隐藏小牛上的工具栏。 这听起来很容易,但事实并非如此! 我需要打开 safari,然后以全屏模式打开谷歌,然后隐藏工具栏。 这将是以下示例的等效项,但对于
嗨, friend 们,我开发了一个 safari 扩展并且也能够构建它。 但是当我尝试安装它时,会出现以下错误: “Safari 无法安装此扩展程序。安装此扩展程序时出错” 我有一个有效的 Safa
我想将使用的扩展版本报告给服务。 有没有办法从扩展中读取扩展版本号? 最佳答案 您可以使用 displayVersion 访问该版本SafariExtension 的属性(property)类(cla
我有一个禁用模式的 Safari 浏览器扩展。我想做的是在用户进入禁用模式时以编程方式更改工具栏图标。 是否有一个 API 可以让我实现这一点,如果有,它是什么? 最佳答案 您的扩展程序拥有的任何工具
Safari 有一项“功能”,可以在您输入网址时预加载页面。 现在对于大多数用户来说,这确实是一项功能,可以加快页面加载速度。但是对于 Web 开发人员来说,它可能会带来麻烦 - 特别是当它自动加载您
我们有一个正在开发中的 PHP Web 应用程序,它不应该被公众访问(但),但我们不想实现自定义解决方案来防止这种情况发生,因此我们求助于 HTTP 基本身份验证,它通常工作正常但有是 iPhone
我正在尝试查看 Safari 本地存储中保存的单个值的全部内容(它是一个长 JSON 对象)。当我查看键/值对时,该值对于屏幕来说太长了,复制该行只会复制该值的可见部分。有没有办法看到整条线? 最佳答
出于开发目的,我需要在我的计算机上的 Safari(Windows 上)中禁用同源策略。 在 Chrome 中,这可以通过使用标志 --disable-web-security 启动来完成。 Safa
我正在开发网站并创建应用程序。我想知道如何通过 safari 等网络浏览器检查元素。 在普通的 Chrome、Firefox、Explorer 或任何其他浏览器中,我们将右键单击鼠标按钮或按功能键 F
我有兴趣针对 Safari 浏览器进行一些开发,但我不确定它是否是开源项目?我知道 webkit 是开源的,但这并不意味着浏览器是开源的。 我已经给苹果发了电子邮件,但他们的回复不是很及时,所以我想知
我有一个正确的/etc/hosts 文件,其中包含以下内容: 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 l
我是一名优秀的程序员,十分优秀!