Jsdom: рдЖрдВрддрд░рд┐рдХ рдкрд╛рда рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рд╕рд┐рддре░ 2015  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рд╡реЗрдм рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП jsdom рдПрдХ рдмреЗрд╣рддрд░реАрди рдЯреВрд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ textContent html2text рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдкрдардиреАрдп рдкрд╛рда рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред

рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирдЧрдгреНрдп innerText рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рд▓реЗрдЦ рд╣реИ:

http://perfectionkills.com/the-poor-misundersfood-innerText/

рд▓реЗрдЦрдХ getSelection().toString() рдХреЛ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди getSelection рдЕрднреА рддрдХ jsdom рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк jsdom рдореЗрдВ innerText рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдорд╣рд╛рди рдЦреЛрдЬ рдХреА рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдпреБрдХреНрддрд┐ рднреА рдЬреЛрдбрд╝ рджреА рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрджрд┐ рдХреЛрдИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ 1 рдХрджрдо рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдФрд░ sanitize-html рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд░ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рд╕реЗрдЯрдЕрдк рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА рдЗрд╕реЗ рдореЗрд░реА рдЬреЗрд╕реНрдЯ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╕рдордп рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдк global.Element = (new JSDOM()).window.Element рд╕реЗрдЯрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ @bennypowers рдиреЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ):

Object.defineProperty(global.Element.prototype, 'innerText', {
  get() {
    return sanitizeHtml(this.textContent, {
      allowedTags: [], // remove all tags and return text content only
      allowedAttributes: {}, // remove all tags and return text content only
    });
  },
  configurable: true, // make it so that it doesn't blow chunks on re-running tests with things like --watch
});

рд╕рднреА 26 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдФрд░ рдХреНрдпрд╛ рдПрдХ рджрдпрд╛ рд╣реИ рдХрд┐ рдЖрд╡рд╛рд░рд╛ Selection рдФрд░ innerText рдкреБрд╕реНрддрдХрд╛рд▓рдп jsdom рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ: https://github.com/timdown/rangy/issues/348

рддреЛ, рдЖрдВрддрд░рд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреНрд░рдореБрдЦ рдЗрдВрдЬрди (рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕) рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдорд╛рдирдХ рдХреЗ рдмрд┐рдирд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдбреНрд░рд╛рдлрд╝реНрдЯ рд╕реНрдкреЗрдХ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдореЗрдВ рдХреБрдЫ рд╣рд▓рдЪрд▓ рд╕рдВрджрд░реНрдн рднреА рджреЗрдЦреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░реЗрдкреЛ рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рддрдирд╛ рдкреВрд░реНрдг рд╣реИ/рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдкреНрд░рдЧрддрд┐ рд╣реЛрдЧреАред

рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: https://bugzilla.mozilla.org/show_bug.cgi?id=264412

WHATWG рдХреЛ рдордВрдЬреВрд░реА рджреЗрдирд╛ рдЬрд░реВрд░реА рд╣реИ: https://github.com/whatwg/compat/issues/5#issuecomment -168049752

рдХрд▓реНрдкрдирд╛ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓ рд▓реЗрдЖрдЙрдЯ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ innerText рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ jsdom рдореЗрдВ рд╡реИрд╕реЗ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдХрд╛рдо рдХреЗ ... рдХреЛрдИ рднреА рдЙрдирдХреА рдЖрд╢рд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ :(ред

рд▓реЗрдЖрдЙрдЯ рд╕рдорд░реНрдерди рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░: https://github.com/rocallahan/innerText-spec/issues/2

рдХреНрдпрд╛ WHATWG рдЕрдкрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рд╣рд╛рдБ... рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, jsdom рдХреЗ рдкрд╛рд╕ CSS рдмреЙрдХреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ :(ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП jsdom рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ lib рд╣реИ?

@domenic рджреЗрдЦрднрд╛рд▓ рдХреБрдЫ рдЬреНрдЮрд╛рди рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдРрд╕рд╛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдУрд╡рд░рд╣рд╛рд▓ рдХреНрдпреЛрдВ рд╣реИ? рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдХрдорд░реЗ рдореЗрдВ 800lb рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рд▓реЛ-рдХреА рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣реАрдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реЗ рд╕рд┐рд░ рдХреЛ jsdom рдХреА рд╕рд░рд╛рдп рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ jsdom newb рдкрд░ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдкреЛ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХрд╣рд╛рдВ рд╣реЛрдЧреА?

рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж ЁЯЩП /рд╕реАрд╕реА @vsemozhetbyt

рдкреНрд░рд╛рдердорд┐рдХ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ innerText рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдЗрдВрдЬрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рдФрд░ jsdom рдореЗрдВ рдХреЛрдИ рд▓реЗрдЖрдЙрдЯ рдЗрдВрдЬрди рдирд╣реАрдВ рд╣реИред рджреЗрдЦреЗрдВ https://html.spec.whatwg.org/multipage/dom.html#the -innertext-idl-attribute рдФрд░
http://perfectionkills.com/the-poor-misundersood-innerText/ ред рджреВрд╕рд░реЗ рд▓рд┐рдВрдХ рд╕реЗ:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рд▓рдЧрднрдЧ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, textContent рдХреБрдЫ рдЕрдЬреАрдм рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдирдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ
рдФрд░ рд╕реНрдЯрд╛рдЗрд▓-рдП-рдмреНрд▓реЙрдХ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ ( рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ)ред

рдЕрднреА рднреА рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдФрд░ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпреБрдХреНрддрд┐ рдХрд╣рддреА рд╣реИ:

рдпрджрд┐ рдпрд╣ рддрддреНрд╡ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ рдПрдХ рдЧреИрд░-рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ рд╣реИ, [рдЬреЛрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛] рддреЛ рдЗрд╕ рддрддреНрд╡ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдЖрдИрдбреАрдПрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рдПрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ textContent рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реЛрдЧрд╛ред

рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдПрд╕рдПрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл рд▓реЗрдЖрдЙрдЯ рднрд╛рдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ...

рд╣реЗрд▓реЛ рджреЛрд╕реНрддреЛрдВ, рдЗрд╕ рдкрд░ рдХреЛрдИ рдЦрдмрд░?

рдмрд╕ рд╣реЗрдбрд▓реЗрд╕ рдХреНрд░реЛрдо рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ :)

@domenic рдЙрд╕ рдХрд▓реНрдкрдирд╛ рд╕реЗ рдХрд┐ @coreh рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ:
https://html.spec.whatwg.org/multipage/dom.html#the -innertext-idl-attribute

рдпрджрд┐ рдпрд╣ рддрддреНрд╡ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ textContent рдЖрдИрдбреАрдПрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рдПрдВред

https://html.spec.whatwg.org/multipage/rendering.html#being -rendered

рдПрдХ рддрддреНрд╡ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдВрдмрджреНрдз рд╕реАрдПрд╕рдПрд╕ рд▓реЗрдЖрдЙрдЯ рдмреЙрдХреНрд╕, рдПрд╕рд╡реАрдЬреА рд▓реЗрдЖрдЙрдЯ рдмреЙрдХреНрд╕, рдпрд╛ рдЕрдиреНрдп рд╕реНрдЯрд╛рдЗрд▓рд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рд╕рдордХрдХреНрд╖ рд╣реИред

рдпрджрд┐ jsdom рд▓реЗрдЖрдЙрдЯ рднрд╛рдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ "рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ" рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ?

рдпрд╣ рд╕рдВрджреЗрд╢ рдЗрд╕ рдЬреАрдердм рдереНрд░реЗрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рдЖрдкрдХреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП copypasta:

// Expose JSDOM Element constructor
global.Element = (new JSDOM()).window.Element;
// 'Implement' innerText in JSDOM: https://github.com/jsdom/jsdom/issues/1245
Object.defineProperty(global.Element.prototype, 'innerText', {
  get() {
    return this.textContent;
  },
});

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред

рдпрджрд┐ рдХреЛрдИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ 1 рдХрджрдо рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдФрд░ sanitize-html рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд░ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рд╕реЗрдЯрдЕрдк рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА рдЗрд╕реЗ рдореЗрд░реА рдЬреЗрд╕реНрдЯ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╕рдордп рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдк global.Element = (new JSDOM()).window.Element рд╕реЗрдЯрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ @bennypowers рдиреЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ):

Object.defineProperty(global.Element.prototype, 'innerText', {
  get() {
    return sanitizeHtml(this.textContent, {
      allowedTags: [], // remove all tags and return text content only
      allowedAttributes: {}, // remove all tags and return text content only
    });
  },
  configurable: true, // make it so that it doesn't blow chunks on re-running tests with things like --watch
});

рдореБрдЭреЗ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ textContent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╕рдЯреАрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЦрд╛рд╕рдХрд░ рд╕реАрдПрд╕рдПрд╕ рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд:

function innerText(el)
  el = el.cloneNode(true) // can skip if mutability isn't a concern
  el.querySelectorAll('script,style').forEach(s => s.remove())
  return el.textContent
}

рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ!

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпреБрдХреНрддрд┐ рдХрд╣рддреА рд╣реИ:

рдпрджрд┐ рдпрд╣ рддрддреНрд╡ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ рдПрдХ рдЧреИрд░-рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ рд╣реИ , [рдЬреЛрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛] рддреЛ рдЗрд╕ рддрддреНрд╡ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдЖрдИрдбреАрдПрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рдПрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реЛрдЧрд╛ред

рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдПрд╕рдПрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл рд▓реЗрдЖрдЙрдЯ рднрд╛рдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ...

@domenic рдХреГрдкрдпрд╛ рдХрд▓реНрдкрдирд╛ рдХреА рдЕрдзрд┐рдХ рдЙрджрд╛рд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

textContent рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рдЬрдм CSS рдирд┐рдпрдореЛрдВ рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реЛрддрд╛ рд╣реИ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдВрддрд░рд┐рдХ рдкрд╛рда рдХреЛ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдкрд╛рджрдХ рд╣реВрдВ, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ "рдЬрдм рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЖрд╡реЗрджрди рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИ" рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд▓реНрдкрдирд╛ рдХрд╣ рд░рд╣реА рд╣реИред

.. рдпрд╣ рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдереА "рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ рдПрдХ рдЧреИрд░-рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ рд╣реИ"

"рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ" рдФрд░ "рдЧреИрд░-рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ" рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?

рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ:
рдПрдХ рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ "рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ" рдФрд░ рдкрд░рд┐рдгрд╛рдо (рдЧреНрд░рд╛рдлрд┐рдХ рдпрд╛ рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓) рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдПрдХ рдЧреИрд░-рд╕реАрдПрд╕рдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ "рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ" рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореВрд░реНрдЦ рд╣реИ

рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдПрд╕рдПрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? window.getComputedStyle?

рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рди рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЕрднреА рднреА рдмреЗрд╣рддрд░ рд╣реИ

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рд┐рд░реНрдл рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ textContent рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП innerText , рдЬрдмрдХрд┐ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ jsdom ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

describe('mytest', () => {
  beforeAll(() => {
    Object.defineProperty(HTMLElement.prototype, 'innerText', {
      get() {
        return this.textContent;
      }
    });
  });
  it('should ok', () => {
  // test assertions
  });
});
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Progyan1997 picture Progyan1997  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jhegedus42 picture jhegedus42  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mitar picture mitar  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vsemozhetbyt picture vsemozhetbyt  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amfio picture amfio  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ