问题 有没有办法在javascript中检测页面上的查找搜索


每个浏览器都有页面功能(ctrl + F)。有没有办法在javascript中检测用户搜索,以便我可以附加其他操作。


10447
2017-07-13 14:06


起源

有趣的问题;我从来没有听说过这种做法,我认为我从未见过它,但我现在很好奇。 - Pointy
你能听一个ctrl + F keydown事件吗? (或命令+ F等)或者由于搜索对话框而没有通过? - jlb
好吧^ F不是启动搜索的唯一方法 - 在Firefox中它是“/”(至少,它适合我)。 - Pointy
Netflix可以使用一些检测功能,当所有电影的标题都嵌入到图像中并且没有任何可搜索的文本时,无法在页面上搜索某些内容 - Endless


答案:


当然你可以尝试  成 ctrl+f 要么 cmd+f 快捷方式,但即使它适用于“某些”浏览器,这样你只会知道用户按下了这个快捷方式,并且最有可能搜索某些内容。

如果浏览器允许覆盖该快捷方式,则可以进一步阻止默认行为并在站点上实现您自己的搜索逻辑。但这被认为是非常糟糕的做法。覆盖本机浏览器行为非常糟糕。

另一方面,当浏览器执行搜索过程时,没有“事件”被触发。简而言之,不,实际上没有办法用javascript检测或挂钩搜索过程(如果有的话,它永远不会与浏览器兼容)。


2
2017-07-13 14:14



由于我对搜索过程感兴趣,而不仅仅是contl + F,所以我将不得不忍受这个。谢谢 - Alexander


这是一个解决方案,可以解决替代页面查找情况(例如Firefox上的Command + F,'/')。它会检查这些按键中的任何一个,并在发生时设置定时器。如果窗口很快变模糊,则假定显示“查找”对话框。

缺点:不考虑通过菜单启动的“查找”对话框。我认为没有任何方法可以确定这一部分,因为(据我所知,至少)浏览器UI对于在DOM内部运行的Javascript是禁止的。

var keydown = null;

$(window).keydown(function(e) {
    if ( ( e.keyCode == 70 && ( e.ctrlKey || e.metaKey ) ) ||
         ( e.keyCode == 191 ) ) {
        keydown = new Date().getTime();
    }

    return true;
}).blur(function() {
    if ( keydown !== null ) {
        var delta = new Date().getTime() - keydown;
        if ( delta >= 0 && delta < 1000 )
            console.log('finding');

        keydown = null;
    }
});

的jsfiddle,在Chrome,Safari和Firefox中测试过


6
2017-07-13 14:20





你可以做(​​检测用户按ctrl + f的时间):

window.onkeydown = function(e){
   if(e.keyCode == 70 && e.ctrlKey){
    //user pressed ctrl+f
}

小提琴: http://jsfiddle.net/d8T72/


5
2017-07-13 14:10





正如@Nicola Peluchetti最初建议的那样,这是一个稍微改进的版本,通过功能嗅探:

window.onkeydown = function(e){
    var ck = e.keyCode ? e.keyCode : e.which;
    if(e.ctrlKey && ck == 70){
        alert('Searching...');
    }
}

浏览器搜索测试案例»


2
2017-07-13 14:22