Javascript 在Firefox/Internet Explorer中取消默认的CTRL-F搜索栏
我目前正在设计一个网页,提供定制的搜索功能。由于这可能会干扰浏览器在CTRL-F上提供的默认搜索栏,因此我们将禁用该事件,以便不会弹出默认搜索栏,而是显示我们的搜索栏 问题是,在Firefox和Internet Explorer中,与Chrome、Safari或Opera不同,搜索栏可以在所有选项卡之间共享。因此,如果我在其他选项卡中,按CTRL-F键弹出默认的搜索栏,现在跳到这个页面,搜索栏仍然在那里,这完全违背了我们的目的 我知道这听起来是不可能的,但是,有没有任何方法可以杀死默认的搜索栏,也就是说,通过JavaScript完全隐藏它?然后,当我们检测到用户正在进入我们的页面时,我们可能会这样做 如果不可能,那么是否有任何方法可以禁用对特定元素的默认搜索,例如Javascript 在Firefox/Internet Explorer中取消默认的CTRL-F搜索栏,javascript,events,browser,ctrl,Javascript,Events,Browser,Ctrl,我目前正在设计一个网页,提供定制的搜索功能。由于这可能会干扰浏览器在CTRL-F上提供的默认搜索栏,因此我们将禁用该事件,以便不会弹出默认搜索栏,而是显示我们的搜索栏 问题是,在Firefox和Internet Explorer中,与Chrome、Safari或Opera不同,搜索栏可以在所有选项卡之间共享。因此,如果我在其他选项卡中,按CTRL-F键弹出默认的搜索栏,现在跳到这个页面,搜索栏仍然在那里,这完全违背了我们的目的 我知道这听起来是不可能的,但是,有没有任何方法可以杀死默认的搜索栏,
contenteditable div
?这样,当CTRL-F在页面上迭代单词时,每次按ENTER键都会突出显示每个实例,该元素中的所有单词都会被完全忽略?沙盒脚本
您无法通过JavaScript从页面控制其他选项卡的行为或内容,因此这是不可能的
基本上:实现这一点的唯一方法是分叉源代码并制作自己的浏览器版本,在其中为搜索栏提供自己的功能。对于IE,您可以在.Net中为Web控件制作一个包装器并分发它,但在这里您无法控制IE版本
在我看来,这有点极端,但在普通版本中,您无法回避这一点,这是可以理解的,因为这将引发一系列安全问题
扩展似乎是一种替代方法,但它们也受到安全性的限制,在这方面会受到限制,因此您不会得到比下面更进一步的结果-
有限浏览器行为控制
您可以覆盖ctrl+f,但这只适用于运行脚本的选项卡(我强烈建议在未经用户批准的情况下执行此操作,因为这将更改默认浏览器行为)
一个这样做的示例:
document.onkeydown = function(e) {
/// for IE
e = e || event;
var keyCode = (window.event) ? e.which : e.keyCode;
/// check ctrl + f key
if (e.ctrlKey === true && keyCode === 70) {
e.preventDefault();
console.log('Ctrl + f was hit...');
return false;
}
}
更新:对于Mac命令键,已在此处回答:.看起来您已经在监听Ctrl+F键并抑制默认行为。这是你能走的最远的地方了 换句话说,你的问题的答案很简单,就是“不” 在页面搜索栏中查找是浏览器chrome的一部分;您无法通过DOM或其他方式访问它。浏览器不提供任何类型的API,允许页面以任何方式控制“在页面中查找”功能。无法关闭已打开的查找栏。您不能使其打开。您无法读取或控制搜索输入框中的内容 您可能可以编写一个扩展,以某种方式控制“在页面中查找”功能,但显然,您必须说服用户安装它,并且您需要为每个目标浏览器安装一个扩展 坦率地说,每当我看到有人要求禁用或干扰默认浏览器行为时,这通常是一个误导性的坏主意。您可能认为您的搜索功能非常棒(毕竟是您编写的),但您可能会以某种意想不到的方式限制您的用户。(在没有看到您的确切用例之前,我不能肯定,但这是一条很好的一般规则。)
如果您试图击败标准浏览器功能,可能是做错了。您可以使用JavaScript热键。当然,没有内置的设施,但它可以这样实现-
var isCtrl = false; //In the Global scope
document.onkeyup = function(evn){
if(evn.which == 17){isCtrl = true;} //.which stores an ASCII related code of the key pressed; 17 stands for the Ctrl key
}
document.onkeydown = function(evn){
if(evn.which == 17){isCtrl = true;}
if((evn.which == 70) && (isCtrl = true)){ //70 stands for 'F' or 'f'
//Popup the search bar
//isCtrl = false; if you are using prompt() box
return false;
}
}
我已经在谷歌Chrome上测试过了——它真的很有效
编辑:我现在发现,尽管可以覆盖Ctrl+1、Ctrl+2的默认热键。。。等等,但对于Ctrl+O(打开页面)Ctrl+S(保存页面)等组合键不可能这样做。更改默认浏览器UI是完全错误的,您应该设计网页搜索逻辑,使其与浏览器搜索UI和平共存 如果您确实希望提供自定义浏览器体验,并且相信您的用户将从中受益,那么您应该创建一个自定义浏览器应用程序,根据您的内容进行定制,并为用户提供使用它的选项
反过来,这将使您可以自由创建自定义导航和搜索UI。这就是许多类似kiosk的浏览器解决方案所做的。有很多选项可供选择:IE浏览器控件、WebKit、Chrome嵌入工具包等。Mozilla的PDF.js就是这样做的 在构建集成web应用程序的情况下,截取一些更常见的键盘快捷键非常方便。但是对于一个简单的网页,最好让浏览器做它的本地业务 下面是截取浏览器快捷方式的代码。我从PDF.js的查看器代码中提取了它。这也是本机FF pdf查看器的代码
window.addEventListener("keydown", function keydown(evt){
var handled = false;
var cmd = (evt.ctrlKey ? 1 : 0) |
(evt.altKey ? 2 : 0) |
(evt.shiftKey ? 4 : 0) |
(evt.metaKey ? 8 : 0);
/*
First, handle the key bindings that are independent whether an input
control is selected or not.
*/
if(cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12){
// either CTRL or META key with optional SHIFT.
switch(evt.keyCode){
case 70: //f
//open custom search/find text
handled = true;
break;
case 71: //g
//find next
handled = true;
break;
case 61: // FF/Mac "="
case 107: // FF "+" and "="
case 187: // Chrome "+"
case 171: // FF with German keyboard
//zoom in
handled = true;
break;
case 173: // FF/Mac "-"
case 109: // FF "-"
case 189: // Chrome "-"
//zoom out
handled = true;
break;
case 48: // "0"
case 96: // "0" on Numpad of Swedish keyboard
//set scale
handled = true;
break;
}
}
// CTRL or META without shift
if(cmd === 1 || cmd === 8){
switch(evt.keyCode){
case 83: //s
//download/save file
handled = true;
break;
}
}
// CTRL+ALT or Option+Command
if(cmd === 3 || cmd === 10){
switch(evt.keyCode){
case 80: //p
//presentaion mode
handled = true;
break;
case 71: //g
//focus page number dialoge
handled = true;
break;
}
}
if(handled){
evt.preventDefault();
return;
}
});
我希望不是。我不想让你玩弄我的浏览器,请不要。当我按下CTRL+F键时,我期望的是我的浏览器搜索,而不是你的(可能很棒,或可能糟糕)搜索。请重新考虑,请不要。我很想在UX.StackExchange上征求他们的意见,但覆盖浏览器行为并不是一个非常好的主意。是的,请学会在现有的框架内工作,而不是试图破坏每个人的UX。如果你有一个搜索框,做其他人做的事情:有一个搜索框。你不需要键盘快捷键。默认情况下,只需将键盘输入漏斗式输入到搜索栏,即可完成。如果您想了解为什么这是一个坏主意,请学习著名CanIUse.com网站作者的经验。他确实做到了这一点,但不得不将其删除:@AllenChak似乎使用了keyCode(请检查)