掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 469|回复: 1

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

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

    [LV.5]常住居民I

    发表于 2024-10-24 20:03:00 | 显示全部楼层 |阅读模式
    本帖最后由 baodi 于 2024-10-24 20:03 编辑 ; d. z) a" ?; E' P1 m; b- d' F0 Y
    ! T9 @0 y8 q0 c/ n. {6 y% V6 {" b
    输入搜索的短语,回车触发搜索。  U5 J# R1 \; T
    搜索前:- c9 r; V2 {8 }/ m1 G

    + y3 @* K; Q8 M; ^* e2 _* b4 Q0 p$ m/ ?
    搜索后:点击即可跳转对应的短语,非常简单快速8 h0 K3 z5 I1 n! ]6 `8 |

    . U# R7 Q) S( @; B
    4 x. v& W# k" E6 L0 \; H出于查询词典短语的需求,写了一个脚本,用了许久,还挺好用,特此分享。
    3 x% {( u* I, x+ e/ a; L# s/ i0 k*但是加入即用的,需要一点css 选择器样式的了解,才能修改成自己用的词典。
    & L5 ^1 R- Q7 R1 h8 t
    , [. a* I1 m: o$ y来由:
    0 v: ~( F6 }0 A5 N, {! s有些词典并没有给短语一个词条,比如想搜索period of time,就只能先搜索time词条,然后打开软件的页内搜索功能搜索,但在我用的词典内ldoce6有18处出现period of time,那么最糟糕的情况下要切换18次才能找到自己想要的释义。
    5 E) p( i8 R8 j! W; R" f. m而使用了我这个脚本,就可以偷懒,搜索“per”,然后就出来2个结果,其中一个就是period of time的条目,点击即达词典对应位置。
    , c: Q8 V& a6 M% I( F
    & ]$ \; c* x  ]3 ?, I6 A2 N- J使用方法:
    & V$ c, }$ b5 D" I. E3 O在词典自带的.js为后缀的文件最后,加入以下代码并修改。5 h& R  q$ L4 h  ~9 b( H
    根据对应的词典,需要针对性地修改。
    3 N. s# f5 H4 l5 l- B4 t修改代码第42行的const selector = [".phrvbhwd",".lexunit"…
    ! R- O! D) r& x% @通过电脑平台的goldendict或安卓平台 无限词典app的词典服务器,甚至解包词典。找到对应的短语在词典的样式中对应的css选择器,比如我用的ldoce6中有些短语对应.phrvbhwd这个选择器,有些对应.lexunit这个选择器,等等,修改完成后。
    $ d5 j' v, [3 D* K保存.js文件,一般来说软件会自动挂载这个新的.js文件替换词典原版加载的.js文件。
    ) n5 Z6 R9 [$ S8 P
    - [( G! J( r! |6 R6 k网友互助?:因为这玩意要从词典的条目中筛选出对应的css选择器,对于一些朋友可能还是太难,所以希望网友在回复帖子里附上自己使用的词典修改后“完整的”js文件的百度云盘(文件本就不大,百度云盘最稳妥)链接,注意是完整的js文件。然后在这层楼的点评中附上 词典名称+对应楼层,方便其他人检索。$ i; B8 A+ H" X# {! n& Q. A
    9 l3 Z' l/ f' V5 T# a
    附加:css选择器学习教程:runoob教程3 k, W" E+ P7 N- J6 P7 B

    - ]% T5 t) [' e8 |4 U代码:& }9 l2 Z+ R5 _$ j. n: ]1 T/ |: {: F
    1. /*版本 v1.0*/
      $ g7 I- r# R: T$ A3 @# s2 V8 C
    2. function myscript(){
      1 W* A& S& U2 u$ l9 g8 x) z
    3. const style = document.createElement("style");
      - o7 `% J- @2 l2 H
    4. style.innerText = `4 ?6 j5 Q1 G+ E! g8 y
    5. /*css样式,可以将这部分样式放到css文件中*/
      + d2 N9 _4 R% H3 ~3 A
    6. .blink_me {
      9 i6 B# Z0 }: _' P% r
    7.   /*scroll-margin-top: 18px;锚点的配置*/
      , j  B! w! k1 k$ w" F& O$ c$ y

    8. 5 g& F' \7 y$ h" a* B
    9.   padding-top: 18px;
      9 A, Q: L7 i4 u) Q8 g9 d
    10.   margin-top: -18px;& k& @; ~1 `5 M6 d8 U' ?
    11.   ( T7 e9 J& v" d
    12.   animation: blinker 1s linear infinite;
      ( e7 R" W% S0 ^4 H# @3 \& o& m
    13. }
      ' g, I; z" Y$ G9 {1 Y$ L
    14. $ I( i& ~4 g! _9 {5 m- q6 V: a
    15. @keyframes blinker {
      $ H3 t, e' s  T- G
    16.   50% {& e6 v9 ?( n/ y& d
    17.     opacity: 0;4 P5 F0 z( T. W' u& H8 p
    18.   }
      5 A% k% b8 o( H# N$ T" k
    19. }  W" ~5 `% Y) f1 X6 t2 _) @/ l' z' F
    20. input[type="search"] {/ H3 `5 I2 \7 o
    21.     margin: 3px;
      4 x0 P2 E, U; B' K6 h% q$ L  K# r5 y
    22. }
      5 S" G$ {# ?/ ?
    23. #search_result ul{9 ^1 L0 p+ v6 j9 l$ d4 T( C
    24.     margin: 3px 3px;$ F+ q' @5 v6 z) O4 B% T4 Q  v. c
    25.     padding: 0;
      ) c! B* X8 O) Z
    26. }
      * c# ]& O8 q$ v+ z
    27. #search_result a{) K' b4 o. T9 u% n3 V- B! e
    28.     font-weight: bold;
        @$ g/ r6 h; T$ G2 K% h, R
    29. }5 R! P) R  F' ~
    30. /*css样式-结束*/8 g/ X0 g; O8 S
    31. `;5 u# k" r" c) r; c) U: g
    32. document.head.append(style);
      , b  K% Z( V% N3 k$ b+ \

    33. , Z( d/ _9 `9 X3 V; i
    34. const search_bar = document.createElement('input');
      + d% a/ ]7 \% d0 ^7 d1 o
    35. search_bar.type = 'search';5 u( G; @' z4 H6 ~' f
    36. search_bar.id = 'search_bar'1 L  M2 N9 Y# e  B
    37. search_bar.placeholder = '搜索短语,回车搜索';
      & M# P8 {* x1 r3 s9 M3 p/ E
    38. const matched = document.createElement('div');7 W! U4 x  ?( N* u2 u* A. i/ M! U
    39. matched.id = 'search_result';& N5 n2 b1 S4 R
    40. & ?$ U% N2 e  h2 x
    41. //词典中要搜索的元素对应的class名称,这里是ldoce6词典的短语对应的css选择器,你需要改成你用的词典的短语对应的选择器。0 F: A" k& w* }, f
    42. const selector = [".phrvbhwd",".lexunit",".lexvar",".propformprep",".propform",".collo",".syn",".relatedwd",".reflex"]; ) @. q$ U7 P( |8 `; N- I: {/ N
    43. 4 ?% ^6 d! {8 A3 x- W7 k
    44. const march_nodes = [];
      ; _( Y, F1 e2 Z& C- @
    45. for (const sel of selector){
      - ]6 e3 ^& B7 ?% S; u
    46.   document.querySelectorAll(sel).forEach((e)=>{
      4 v9 z- o& F" G
    47.     march_nodes.push(e)$ }& Q' B" b) C5 P
    48.   })  g/ k6 \- K3 C
    49. }
      5 Y  L5 o& t$ u& y" u9 W
    50. myscript.pos = 1;& j3 H& ]* C9 u4 z5 }+ `
    51. search_bar.addEventListener('keydown',function(e){' f- x0 g$ B" d0 G" @! w
    52.   if (e.keyCode == 13) {
      ) U# }; M# k: Z- i( N' q: w
    53.     let pos = myscript.pos;! U, T7 Z+ }: g. X0 F
    54.     let matched_html = ''; I8 t; |3 m+ u% ^$ `
    55.     march_nodes.forEach((ele)=>{. o; r$ p0 F/ G* w
    56.       if(ele.innerText.toLocaleLowerCase().indexOf(search_bar.value.toLocaleLowerCase()) === -1){
      / A, Y- N* M3 {: l
    57.         return
      ) v0 W' t, l+ N1 N+ A) N2 `
    58.       };
      + P$ h* D: X# S: N' c. F: \
    59.       
      8 ?/ w' |- ^! K4 L; [$ u. z
    60.       const a_html = ele.innerText.replace(new RegExp('(' + search_bar.value.trim() + ')', "gi"),'<mark>$1</mark>')
      5 e; {) `7 }& k7 m
    61. & G3 ?1 U! ~/ |& V
    62.       if(!ele.id){% f+ q( B: a) ?
    63.         ele.id = 'matched_' + pos++;
      ( ]( p: b0 U) ?/ F3 m$ U
    64.       }- z$ ]5 M9 o( I9 ~' X! p; m0 C

    65. 9 K0 Z6 B, W8 a, Y& W
    66.       matched_html += `- Y; o7 ^7 @( \$ }. w; I' o( P
    67.       <ul><a href="#${ele.id}">${a_html}</a></ul>
      % `. x: [+ m$ X1 e5 ?; @
    68.       `
      / p) [1 R+ ^7 ^, [6 l3 i4 X) w
    69.     })# d  ?2 R. R+ V% R: u+ n, L! l
    70.     if (matched_html === ''){: ?9 A- @$ `" w6 U# s
    71.       matched_html += `
      - \0 o' i" ~& f  @# e
    72.       <ul><a>无匹配短语</a></ul>
      8 k" H6 J$ `; e- G: j2 c% p8 Q3 p0 x
    73.       `1 W% K3 \/ P5 g7 C) P
    74.     }9 S; Z. ], _5 }* \# F* b
    75.     myscript.pos = pos;  v9 {) M5 n. ^5 U# y5 Z
    76.     matched.innerHTML = matched_html;$ N; S! x0 t- C" g3 E0 X, r3 a
    77.   }0 f6 E" c2 h# A) _
    78. }); W4 `" A9 H- W  p5 q: j

    79. : v7 K* X$ @) Y( @, P$ t0 J4 B
    80. matched.addEventListener('click',function(e){( o2 _$ r" d  N. f7 L# f
    81.   const target = (e.target.tagName == 'MARK') ? e.target.parentElement : e.target;
      9 L% h( X% Q9 k9 _( P( O
    82.   if(target.href.split('#').length <= 1){& x6 ?- Q! @4 O! s, i0 t: [- |% e
    83.     return;& F' D+ W# w3 V( Y2 X/ U8 I  Y9 D
    84.   }3 }; U$ s3 J8 v2 o+ H8 E' ~: W
    85.   let t = document.getElementById(target.href.split('#')[1]);
      ' G! U3 [& R7 `& u1 K
    86.   if(t){8 E  Y+ h# P+ ~2 q, ~' G
    87.     t.classList.add('blink_me');9 }* b) p& B/ u
    88.     setTimeout(()=>{t.classList.remove('blink_me');},2000)
        @2 C9 y2 T; @, [) _7 V  @" |. f
    89.   }
      8 i+ i% J: g3 D
    90. })% |2 O6 c( b  h, w# F
    91. / Z4 D8 P& Y- f7 u# n# F
    92. if(!document.getElementById('search_result')){; x3 Z9 q, A0 B( W3 [7 ^, }
    93.   document.body.insertBefore(matched,document.body.firstChild)
      * F9 G/ M5 ^, ]4 L5 `" h1 x1 c2 L
    94.   document.body.insertBefore(search_bar,document.body.firstChild)7 f7 N" u$ u: \, R9 q
    95. }
      4 F. `5 u$ j/ B: ]5 z" ]% e
    96. }
      6 h* s, f8 ?- U4 P, B/ A! P$ Q# O
    97. setTimeout(myscript,0);
    复制代码
    ; V, F$ v; g3 |8 y) I
    代码复制不了的话,可以下载附件:  i" o3 n, W* g& i+ B

    ! W9 `+ y% a' Q4 ~: x7 T+ O* _4 ]- F( I3 [; Y

    7 P- e5 |. }) v9 _$ G# K7 d1 E. S+ \+ e; G  C
    好久没来论坛了。! T$ M# m1 L" }% ^& u8 r3 j+ S
    * u- V8 t. }6 q& \; S1 R. ^

    本帖子中包含更多资源

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

    x
  • TA的每日心情
    无聊
    2025-1-20 21:26
  • 签到天数: 70 天

    [LV.6]常住居民II

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

    本版积分规则

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

    GMT+8, 2025-5-3 02:08 , Processed in 0.021847 second(s), 22 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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