掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 570|回复: 1

[工具] 词典内短语检索 js脚本 通用

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-22 08:16
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2024-10-24 20:03:00 | 显示全部楼层 |阅读模式
    本帖最后由 baodi 于 2024-10-24 20:03 编辑 / f- r  c) U8 x5 }5 [. D; s! Y* X/ l1 E
    # @6 c- I7 D7 A$ P0 f' f
    输入搜索的短语,回车触发搜索。2 X- ^/ s6 y* t
    搜索前:2 G" I# n$ f) Z0 b' D% i+ {3 B
    $ S. s# g' e! h7 Y0 S0 F
    " P$ M2 P, p1 o" l, ^. T3 a
    搜索后:点击即可跳转对应的短语,非常简单快速
    ; ~; @7 w  D" x
    ; A' w6 _- V; k( v0 Q
    # E, @$ C1 X6 B8 L  t; g& D& V出于查询词典短语的需求,写了一个脚本,用了许久,还挺好用,特此分享。
    9 C& q) b& g& w- n*但是加入即用的,需要一点css 选择器样式的了解,才能修改成自己用的词典。
    3 I" e, C: M# ~6 C, n
    ; k3 [% u* \$ F+ r7 X来由:
    ) }0 t5 Z9 q, t- L5 z" {4 U9 p- ~有些词典并没有给短语一个词条,比如想搜索period of time,就只能先搜索time词条,然后打开软件的页内搜索功能搜索,但在我用的词典内ldoce6有18处出现period of time,那么最糟糕的情况下要切换18次才能找到自己想要的释义。
    / M- ?. t1 X, I" Z* Z: ~而使用了我这个脚本,就可以偷懒,搜索“per”,然后就出来2个结果,其中一个就是period of time的条目,点击即达词典对应位置。8 [8 C0 m4 w: B/ d) X3 d2 M

    # [* k5 \- y2 W7 E8 A使用方法:
    + _3 @8 J5 a0 S) j, Z在词典自带的.js为后缀的文件最后,加入以下代码并修改。# G/ l2 v/ p/ _& B
    根据对应的词典,需要针对性地修改。8 q2 O0 c: r  d* l3 P$ S
    修改代码第42行的const selector = [".phrvbhwd",".lexunit"…
    : ~4 N2 G4 @$ c7 g1 H' ^6 B通过电脑平台的goldendict或安卓平台 无限词典app的词典服务器,甚至解包词典。找到对应的短语在词典的样式中对应的css选择器,比如我用的ldoce6中有些短语对应.phrvbhwd这个选择器,有些对应.lexunit这个选择器,等等,修改完成后。
    6 K8 u) @- e. i4 C保存.js文件,一般来说软件会自动挂载这个新的.js文件替换词典原版加载的.js文件。5 ?- H; h+ W( c. t# X# G

    : a% A3 {1 B0 a1 B; V网友互助?:因为这玩意要从词典的条目中筛选出对应的css选择器,对于一些朋友可能还是太难,所以希望网友在回复帖子里附上自己使用的词典修改后“完整的”js文件的百度云盘(文件本就不大,百度云盘最稳妥)链接,注意是完整的js文件。然后在这层楼的点评中附上 词典名称+对应楼层,方便其他人检索。
      p3 n5 d) L4 D' u6 V# a
    8 h7 o  y9 L  ^附加:css选择器学习教程:runoob教程+ o2 V7 J# S4 t1 T

    , }9 v) g' E* N. y4 l代码:' U5 m( z" e- }% b, j8 N9 m9 o/ J
    1. /*版本 v1.0*/" G% k0 I& O' j) B, C8 R
    2. function myscript(){
      3 E- l" b; a4 U; b4 b( ]
    3. const style = document.createElement("style");
      # Q0 k5 w) u* O& D$ b
    4. style.innerText = `9 E% q+ |4 w9 |1 {) u* B1 T+ Q$ G
    5. /*css样式,可以将这部分样式放到css文件中*/
      0 K# {5 H$ `  N5 }8 M! `
    6. .blink_me {" E( L$ ^" ~" D& m# P2 `
    7.   /*scroll-margin-top: 18px;锚点的配置*/" z. z& E# d( ?& z% o8 T
    8. " q1 x' w9 J! P0 v$ @& t
    9.   padding-top: 18px;2 {: B( w) D# Z& f2 ?  h
    10.   margin-top: -18px;+ x5 L7 d9 m' a4 J" ?/ k; Q/ m( Q
    11.   
      + u4 j. z) Q. r! h4 r, M
    12.   animation: blinker 1s linear infinite;
      ( J( a2 b& ~1 l( n' k5 n
    13. }
      : j6 G+ E6 N9 Y5 k" U7 p

    14. ' O, u% E% x+ O( `% H- i
    15. @keyframes blinker {
      ( k0 z: {4 M5 x3 n) Z! L. F
    16.   50% {. {+ W( i2 q' L/ u$ B4 {
    17.     opacity: 0;1 U$ ^; Z) W5 j' k1 K6 V% H
    18.   }, `$ Y1 \3 w. J0 L& l* o
    19. }% M2 s( S+ c. S. G: Q! ~
    20. input[type="search"] {( V! g9 t' @+ X
    21.     margin: 3px;) X5 Z3 Z9 }8 s; X
    22. }) h; @6 ]/ n3 [% f6 i) ~. N% l
    23. #search_result ul{6 h8 U3 A" X6 a* l7 n
    24.     margin: 3px 3px;
      0 g% i: {! b! d) ?7 g" i
    25.     padding: 0;- w' c- {1 P1 a/ Z6 ~$ `
    26. }3 U3 S- _8 t1 L/ z: ?6 Q2 s
    27. #search_result a{
      , s  w# v; t8 o8 K$ c3 y) l; K
    28.     font-weight: bold;
      5 V# T& |3 e( a% W4 q$ P
    29. }
      8 g7 k) x( E6 R4 [
    30. /*css样式-结束*/
      / t: ~7 A6 j* K* L
    31. `;/ R+ F3 k$ G9 ]4 L: {
    32. document.head.append(style);
      * i$ v$ M& n. C

    33. , }& {0 n% K0 N1 Q
    34. const search_bar = document.createElement('input');
      $ D9 K8 `. u9 Q) F! A$ G. f( u- Y
    35. search_bar.type = 'search';+ P/ \+ W+ l0 |8 D4 ^
    36. search_bar.id = 'search_bar'; ^, z' w5 u4 H+ r% Z) F) ~
    37. search_bar.placeholder = '搜索短语,回车搜索';
      % `" Z+ H! s7 y# Q
    38. const matched = document.createElement('div');+ q9 F  [6 ]$ S  D: H: `* y$ _" J; B
    39. matched.id = 'search_result';' N3 w2 T0 k! K

    40. ( j. F$ o  T8 k
    41. //词典中要搜索的元素对应的class名称,这里是ldoce6词典的短语对应的css选择器,你需要改成你用的词典的短语对应的选择器。( j$ @! R3 H  o; [0 n
    42. const selector = [".phrvbhwd",".lexunit",".lexvar",".propformprep",".propform",".collo",".syn",".relatedwd",".reflex"];
      8 T1 R6 ^. w  D2 x* d

    43. * |: C% f- L% Z  H! }$ h
    44. const march_nodes = [];
      0 u, Y  L) @. O& i8 B7 D- [; k
    45. for (const sel of selector){% f6 M8 \4 a' Y/ o9 |& E* B
    46.   document.querySelectorAll(sel).forEach((e)=>{
      : {/ ], k  U# C
    47.     march_nodes.push(e)" Q! ?- b( y7 U  H
    48.   })' Q4 j7 _3 n, m2 Z5 W# V0 ?
    49. }
      2 S  n8 p1 c) H
    50. myscript.pos = 1;
      9 m1 |6 Q3 s% J9 p  p  r- a
    51. search_bar.addEventListener('keydown',function(e){2 \3 o( N, p0 b9 g3 i0 E8 T4 N" q
    52.   if (e.keyCode == 13) {2 `. `3 T# K, t
    53.     let pos = myscript.pos;
      ; f$ H5 n% e6 k, F/ j) u. V: K
    54.     let matched_html = ''+ F" K8 m+ ]- i5 L. Z
    55.     march_nodes.forEach((ele)=>{5 q' R: ?4 a7 M5 c
    56.       if(ele.innerText.toLocaleLowerCase().indexOf(search_bar.value.toLocaleLowerCase()) === -1){
      1 _- C: h% P  T" P5 X$ K
    57.         return& }9 f0 J/ Q, ^6 ]- I
    58.       };
      " @; {8 r3 R! J7 e) U- Y
    59.       $ p9 q8 p# L" h- z% ^
    60.       const a_html = ele.innerText.replace(new RegExp('(' + search_bar.value.trim() + ')', "gi"),'<mark>$1</mark>')
      / Y/ l9 G0 Z6 Q# p+ l0 }
    61. $ p4 n: D8 x: Q
    62.       if(!ele.id){  Y) m* O9 J# P. X$ Y4 i
    63.         ele.id = 'matched_' + pos++;
      ) R* j* I5 z1 N' f, H  J* ]+ P
    64.       }
      : o0 N' `" Y! W9 Z6 |" u: }9 i

    65. , E' K# Q! s+ h' M3 C  Z1 L
    66.       matched_html += `7 _* I9 G6 l5 D8 ^+ u$ W% y
    67.       <ul><a href="#${ele.id}">${a_html}</a></ul>; ~7 N; ?; U( J& o, h" T
    68.       `
      , n4 d" x% R( ^* j6 R+ P6 p1 e
    69.     })
      6 n5 t" s4 X( V: R- ]
    70.     if (matched_html === ''){$ W. Q2 r! a/ \$ G" i% a
    71.       matched_html += `
      / u/ _  A) r8 h4 l8 n
    72.       <ul><a>无匹配短语</a></ul>1 O$ a4 }. U( p4 W, s) `; i3 t
    73.       `
      * P8 B8 F; G2 j0 S0 n, t8 X! v1 R
    74.     }$ Z* c+ k# i/ N. J1 L& _
    75.     myscript.pos = pos;
      : P" f, q! o$ N9 ~
    76.     matched.innerHTML = matched_html;) }$ M$ J: e( ~! j; u, }, s
    77.   }
      # @1 t- w3 _9 n. C
    78. })
      ( r: W1 t) C5 q% j0 ^: t0 D8 N
    79. * I6 ]" K! [! r' n+ y" Y
    80. matched.addEventListener('click',function(e){
      ( i# R: x2 G' h6 R4 F4 z
    81.   const target = (e.target.tagName == 'MARK') ? e.target.parentElement : e.target;9 [4 `% a2 g; ?/ O2 n4 t0 m! g5 l
    82.   if(target.href.split('#').length <= 1){
      3 o- O( E8 F' M8 r
    83.     return;
      4 Z. x7 H0 I4 }  w
    84.   }
      # D- B: c4 U- f, V& j2 W
    85.   let t = document.getElementById(target.href.split('#')[1]);
      * I: M! ^" o) F4 F/ @
    86.   if(t){
      ; Y6 K( C$ s) n% D+ B/ q* F/ k
    87.     t.classList.add('blink_me');
      * u. X- [1 j' Z8 ^; s: c
    88.     setTimeout(()=>{t.classList.remove('blink_me');},2000)3 R- }( k' i3 D2 s
    89.   }
      # J2 ^% @$ D! ^& k
    90. })
      ; O3 u5 H0 k$ V" ~/ i; R) j0 X. g/ L
    91. $ {' j6 x6 F5 E8 q0 \# V8 T# i
    92. if(!document.getElementById('search_result')){
        K4 }4 S: D2 o  f
    93.   document.body.insertBefore(matched,document.body.firstChild)
      ! I' q' w9 m- N
    94.   document.body.insertBefore(search_bar,document.body.firstChild)
      3 T3 b! R5 \' q9 V' N
    95. }
      7 r$ u& ]( E2 b: s  T1 g4 l7 l, C
    96. }
      % x9 v5 u, r1 l9 ~' J
    97. setTimeout(myscript,0);
    复制代码

    ) u$ h7 ?9 s- s7 H8 Z$ A代码复制不了的话,可以下载附件:) S7 g4 h4 K9 W
    + F& J0 K  y. X% F( a# s

    2 ~. q0 P; Y5 E4 I# V( G  m
    1 H4 P; A3 y4 S5 M* Y( }
    # `, _" C  V- l好久没来论坛了。" o9 z8 M* Q; Z$ e" B

    & \- ~  `3 m, `# m" [

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    无聊
    2025-6-28 09:17
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 2024-10-28 22:34:12 | 显示全部楼层
    谢谢分享。装在试试看。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-7-9 02:47 , Processed in 0.022523 second(s), 22 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表