Javascript 在Firefox/Internet Explorer中取消默认的CTRL-F搜索栏

Javascript 在Firefox/Internet Explorer中取消默认的CTRL-F搜索栏,javascript,events,browser,ctrl,Javascript,Events,Browser,Ctrl,我目前正在设计一个网页,提供定制的搜索功能。由于这可能会干扰浏览器在CTRL-F上提供的默认搜索栏,因此我们将禁用该事件,以便不会弹出默认搜索栏,而是显示我们的搜索栏 问题是,在Firefox和Internet Explorer中,与Chrome、Safari或Opera不同,搜索栏可以在所有选项卡之间共享。因此,如果我在其他选项卡中,按CTRL-F键弹出默认的搜索栏,现在跳到这个页面,搜索栏仍然在那里,这完全违背了我们的目的 我知道这听起来是不可能的,但是,有没有任何方法可以杀死默认的搜索栏,

我目前正在设计一个网页,提供定制的搜索功能。由于这可能会干扰浏览器在CTRL-F上提供的默认搜索栏,因此我们将禁用该事件,以便不会弹出默认搜索栏,而是显示我们的搜索栏

问题是,在Firefox和Internet Explorer中,与Chrome、Safari或Opera不同,搜索栏可以在所有选项卡之间共享。因此,如果我在其他选项卡中,按CTRL-F键弹出默认的搜索栏,现在跳到这个页面,搜索栏仍然在那里,这完全违背了我们的目的

我知道这听起来是不可能的,但是,有没有任何方法可以杀死默认的搜索栏,也就是说,通过JavaScript完全隐藏它?然后,当我们检测到用户正在进入我们的页面时,我们可能会这样做

如果不可能,那么是否有任何方法可以禁用对特定元素的默认搜索,例如
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(请检查)