<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Amy Chen </title>
    <description>The latest articles on Forem by Amy Chen  (@4myc).</description>
    <link>https://forem.com/4myc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F288854%2Fa775d84c-3dea-4918-b946-e29606fa6b16.png</url>
      <title>Forem: Amy Chen </title>
      <link>https://forem.com/4myc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/4myc"/>
    <language>en</language>
    <item>
      <title>JavaScript innerHTML, innerText, and textContent</title>
      <dc:creator>Amy Chen </dc:creator>
      <pubDate>Fri, 17 Jan 2020 20:44:28 +0000</pubDate>
      <link>https://forem.com/4myc/javascript-innerhtml-innertext-and-textcontent-ih</link>
      <guid>https://forem.com/4myc/javascript-innerhtml-innertext-and-textcontent-ih</guid>
      <description>&lt;p&gt;In Javascript, there are three properties that can be used to set or return an HTML element's content in the DOM: innerHTML, innerText, and textContent. If you are unsure about the differences and wondering which one to use, hopefully the following comparison will help.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(1)&lt;/strong&gt; The &lt;strong&gt;innerHTML&lt;/strong&gt; property sets and returns the content of an element with new HTML content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Setting text with innerHTML:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p&amp;gt;This is &amp;lt;strong&amp;gt;my&amp;lt;/strong&amp;gt; paragraph.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although HTML5 prevents a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag inserted with innerHTML from executing, there is still a security risk whenever you use innerHTML to set strings using Javascript. Cybercriminals can embed Javascript code without using &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; to rewrite content in the HTML page or redirect the browser to another page with malicious code. Due to this reason, &lt;strong&gt;it is NOT recommended to use innerHTML when inserting plain text.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To learn more about innerHTML and Cross-Site Scripting (XSS) attacks, refer to the resources links at the end of this post.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// HTML5 prevents malicious &amp;lt;script&amp;gt; from executing:&lt;/span&gt;
&lt;span class="c1"&gt;// alert WILL NOT show&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;script&amp;gt;alert('I am an annoying alert!')&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;example1&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;example2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;script deferred&amp;gt;alert("XSS Attack");&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;


&lt;span class="c1"&gt;// Examples of cybercriminals embedding Javascript without &amp;lt;script&amp;gt;:&lt;/span&gt;
&lt;span class="c1"&gt;// alert WILL show&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;img src='x' onerror='alert(1)'&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;example3&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;example4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;img src=x onerror="alert(&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;XSS Attack&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;)"&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;X41vascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://url.to.file.which/not.exist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;onerror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onmouseover&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wufff!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;(2)&lt;/strong&gt; The &lt;strong&gt;innerText&lt;/strong&gt; property returns the content of all elements, except for &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; elements. The returned content is visible plain text without any formatting, similar to highlighting text and then copying and pasting it. What you see is what you get. &lt;/p&gt;

&lt;p&gt;One drawback to using innerText is that its value triggers a reflow due to its awareness of CSS styling, which leads to decreased performance. Reflow is when the browser recalculates page elements for re-rendering the document. Instances that trigger reflow include resizing the browser window or changing elements in the DOM. Reflow is computationally expensive and should be minimized in order to improve speed, efficiency, and user experience.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;NOTE: The innerText property is not supported in Internet Explorer 9 and earlier.&lt;/small&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Setting text with innerText:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;(3)&lt;/strong&gt; The &lt;strong&gt;textContent&lt;/strong&gt; property returns the raw content with styling inside of all elements, but excludes the HTML element tags. This includes &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; elements, whitespace, line breaks, and carriage returns. Unlike innerHTML, textContent has better performance because its value is not parsed as HTML. For that reason, using textContent can also prevent Cross-Site Scripting (XSS) attacks. Unlike innerText, textContent isn't aware of CSS styling and will not trigger a reflow. All Node objects have textContent, whereas only HTMLElement objects have innerText.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;NOTE: The textContent property is not supported in Internet Explorer 8 and earlier.&lt;/small&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Setting text with textContent:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;word&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The example below shows how each of the three properties return the contents of the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; element:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"demo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; This element has extra spacing   and contains &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;a span element&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;.
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getInnerHtml&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="nx"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; This element has extra spacing   and contains &amp;lt;span&amp;gt;a span element&amp;lt;/span&amp;gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="cm"&gt;/* 
The innerHTML property returns the text, spacing, and inner HTML element tags.
*/&lt;/span&gt;



&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getInnerText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="nx"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This element has extra spacing and contains a span element.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="cm"&gt;/* 
The innerText property returns just the visible text, 
without spacing or inner HTML element tags.
*/&lt;/span&gt;



&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getTextContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="nx"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; This element has extra spacing   and contains a span element.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="cm"&gt;/* 
The textContent property returns the text and spacing, 
but without the inner HTML element tags.
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you know the differences between all the available options for returning and setting text in Javascript, use the one that best fits your content needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;br&gt;
&lt;small&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent#Differences_from_innerText"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent#Differences_from_innerText&lt;/a&gt;&lt;br&gt;
&lt;a href="http://perfectionkills.com/the-poor-misunderstood-innerText/"&gt;http://perfectionkills.com/the-poor-misunderstood-innerText/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kellegous.com/j/2013/02/27/innertext-vs-textcontent/"&gt;https://kellegous.com/j/2013/02/27/innertext-vs-textcontent/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developers.google.com/speed/docs/insights/browser-reflow"&gt;https://developers.google.com/speed/docs/insights/browser-reflow&lt;/a&gt;&lt;br&gt;
&lt;a href="https://frontendmasters.com/courses/web-performance/layouts-and-reflows/"&gt;https://frontendmasters.com/courses/web-performance/layouts-and-reflows/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting"&gt;https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)"&gt;https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)&lt;/a&gt;&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>ux</category>
      <category>security</category>
    </item>
    <item>
      <title>Refactoring Code in Ruby</title>
      <dc:creator>Amy Chen </dc:creator>
      <pubDate>Tue, 07 Jan 2020 19:58:47 +0000</pubDate>
      <link>https://forem.com/4myc/refactoring-code-in-ruby-5cok</link>
      <guid>https://forem.com/4myc/refactoring-code-in-ruby-5cok</guid>
      <description>&lt;p&gt;In object-oriented programming, it's best to keep code DRY (Don't Repeat Yourself), as opposed to code that is WET (Write Every Time, Write Everything Twice, We Enjoy Typing, or Waste Everyone's Time).&lt;/p&gt;

&lt;p&gt;If a line of code is repeatedly written or copied and pasted, it triggers a "code smell." A code smell is any characteristic in the source code of a program that possibly indicates a deeper problem. In the case of repeated code, the problem is repetition. This makes it an ideal time for refactoring. &lt;/p&gt;

&lt;p&gt;Refactoring code is the process of simplifying existing code without modifying its functional behavior. The results in code that is easy to read, debug, and maintain. It also produces syntactic sugar, which is any aspect of the syntax of a programming language that makes programs easier to read, write, or understand.&lt;/p&gt;

&lt;p&gt;In Ruby, one way to refactor code is using attr_accessor in a Class. Using attr_accessor eliminates the need to write the reader and writer methods as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;
    &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:breed&lt;/span&gt;
    &lt;span class="vc"&gt;@@all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
      &lt;span class="vi"&gt;@breed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;
      &lt;span class="vc"&gt;@@all&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
      &lt;span class="vc"&gt;@@all&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c1"&gt;#def name=(name)&lt;/span&gt;
      &lt;span class="c1"&gt;#@name = name&lt;/span&gt;
    &lt;span class="c1"&gt;#end&lt;/span&gt;

    &lt;span class="c1"&gt;#def name&lt;/span&gt;
      &lt;span class="c1"&gt;#@name&lt;/span&gt;
    &lt;span class="c1"&gt;#end&lt;/span&gt;

    &lt;span class="c1"&gt;#def breed=(breed)&lt;/span&gt;
      &lt;span class="c1"&gt;#@breed = breed&lt;/span&gt;
    &lt;span class="c1"&gt;#end&lt;/span&gt;

    &lt;span class="c1"&gt;#def breed&lt;/span&gt;
      &lt;span class="c1"&gt;#@breed&lt;/span&gt;
    &lt;span class="c1"&gt;#end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another way to refactor code and keeping it DRY is using a helper method. Using helper methods can also help to reduce errors and make it easier to debug by having the logic in one place.&lt;/p&gt;

&lt;p&gt;In the example below, the lifters method is refactored by reusing the previous method (memberships) as a helper method. If a helper method wasn't used, there would be repetitive code as seen in the two alternative methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Get a list of all memberships at a specific gym:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;memberships&lt;/span&gt;
    &lt;span class="no"&gt;Membership&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Get a list of all the lifters that have a membership to a specific gym:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lifters&lt;/span&gt;
    &lt;span class="n"&gt;memberships&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lifter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Methods with repetitive code:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;memberships&lt;/span&gt;
    &lt;span class="no"&gt;Membership&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lifter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lifters&lt;/span&gt;
    &lt;span class="n"&gt;lifter_memberships&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Membership&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;lifter_memberships&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lifter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sure, refactored code requires less typing and looks cleaner. However, the first priority should be writing code that is functional. Get the code working then edit and refine for increased efficiency. &lt;/p&gt;

&lt;p&gt;In the example below, two methods are shown to return the average lift total of all lifters. Both methods have the same functions: mapping over an array to retrieve the lift total of each lifter, adding them up, and then divide the total by the number of lifters.&lt;/p&gt;

&lt;p&gt;As you can see, the original method has more lines of code. The second method abstracts the steps and reduces it into two single line blocks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# Get the average lift total of all lifters:&lt;/span&gt;

  &lt;span class="c1"&gt;# ORIGINAL METHOD&lt;/span&gt;
  &lt;span class="c1"&gt;# def self.lifters_average&lt;/span&gt;
  &lt;span class="c1"&gt;#   lifts_total = @@all.map do |lifter| &lt;/span&gt;
  &lt;span class="c1"&gt;#     lifter.lift_total&lt;/span&gt;
  &lt;span class="c1"&gt;#   end &lt;/span&gt;
  &lt;span class="c1"&gt;#     return lifts_total.inject do |sum, element| &lt;/span&gt;
  &lt;span class="c1"&gt;#       sum + element&lt;/span&gt;
  &lt;span class="c1"&gt;#     end / lifts_total.length &lt;/span&gt;
  &lt;span class="c1"&gt;# end &lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lifters_average&lt;/span&gt;
    &lt;span class="n"&gt;lifts_total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vc"&gt;@@all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;lifter&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;lifter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lift_total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
      &lt;span class="n"&gt;lifts_total&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;lifts_total&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Faerg74r95shya4iil6a8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Faerg74r95shya4iil6a8.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, the first priority when writing code is always making sure the code works, no matter how long or messy it is. From there, clean it up by refactoring to make it more efficient. &lt;/p&gt;

</description>
      <category>ruby</category>
      <category>refactorit</category>
    </item>
    <item>
      <title>VS Code Mac Keyboard Shortcuts</title>
      <dc:creator>Amy Chen </dc:creator>
      <pubDate>Mon, 30 Dec 2019 21:57:24 +0000</pubDate>
      <link>https://forem.com/4myc/vs-code-mac-keyboard-shortcuts-1f8</link>
      <guid>https://forem.com/4myc/vs-code-mac-keyboard-shortcuts-1f8</guid>
      <description>&lt;p&gt;Time. Time flies. Time is money. Time is of the essence.&lt;br&gt;
We lose it. We spend it. We kill it. We all have the same 24 hours of it.&lt;br&gt;
We can't make more of it. &lt;/p&gt;

&lt;p&gt;Why spend more time doing something if you don't have to? &lt;br&gt;
These are the Visual Studio Code keyboard shortcuts I use most often that saves a little bit of time. &lt;br&gt;
&lt;em&gt;The shortcuts list can also be viewed inside Visual Studio Code: &lt;br&gt;
Code --&amp;gt; Preferences --&amp;gt; Keyboard Shortcuts&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;- EDITING -&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Comment out a line or block of code&lt;/strong&gt;&lt;br&gt;
⌘ + /                             &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delete a line of code&lt;/strong&gt;&lt;br&gt;
⌘ + X&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delete a word in front of cursor&lt;/strong&gt;&lt;br&gt;
⌥ + DELETE&lt;br&gt;
&lt;em&gt;NOTE: need to apply twice if the word is in front a symbol&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delete all code in front of cursor&lt;/strong&gt;&lt;br&gt;
⌘ + DELETE&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy and paste a line of code&lt;/strong&gt;&lt;br&gt;
⌥ + SHIFT + UP/DOWN&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Insert new line below the current line&lt;/strong&gt;&lt;br&gt;
⌘ + ENTER&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Insert new line above the current line&lt;/strong&gt;&lt;br&gt;
⌘ + SHIFT + ENTER         &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Move a line or block of code up or down&lt;/strong&gt;&lt;br&gt;
⌥ + UP/DOWN           &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;- SELECTION -&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Select a line of code&lt;/strong&gt;&lt;br&gt;
⌘ + L                             &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select a block of code by line&lt;/strong&gt;&lt;br&gt;
cursor at beginning of line + SHIFT + UP/DOWN       &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select all code above or below cursor&lt;/strong&gt;&lt;br&gt;
⌘ + SHIFT + UP/DOWN&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select next instance of a word&lt;/strong&gt;&lt;br&gt;
selected word + ⌘ + D&lt;br&gt;
&lt;em&gt;NOTE: not case-sensitive&lt;/em&gt;          &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select all instances of a word&lt;/strong&gt;&lt;br&gt;
selected word + ⌘ + SHIFT + L&lt;br&gt;
&lt;em&gt;NOTE: not case-sensitive&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select all instances of a word by case&lt;/strong&gt;&lt;br&gt;
Turn on "Match Case" ("Aa" icon on upper right corner will turn white): &lt;br&gt;
⌘ + C + ⌥&lt;br&gt;
Highlight one instance of the word.&lt;br&gt;
Select all instances of the word: ⌘ + SHIFT + L&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;- WORKSPACE -&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open terminal&lt;/strong&gt;&lt;br&gt;
⌘ + J&lt;br&gt;
CTRL + `&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrap text&lt;/strong&gt;&lt;br&gt;
⌥ + Z&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;View sidebar&lt;/strong&gt;&lt;br&gt;
⌘ + B&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Find&lt;/strong&gt;&lt;br&gt;
⌘ + F&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File search&lt;/strong&gt;&lt;br&gt;
⌘ + P&lt;/p&gt;

&lt;p&gt;The amount of time saved with these shortcuts can now be used to stare at your computer while figuring out why your code isn't working. Hope these help you to become a more efficient programmer. If you know of any others or the equivalent Windows shortcuts, please share!&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
