<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6311614170532925167</id><updated>2024-11-06T10:01:45.798+07:00</updated><category term="blogger"/><category term="thu-thuat-blogger"/><category term="html"/><category term="css"/><category term="javascript"/><category term="seo-blogger"/><category term="google-adsense"/><category term="jquery"/><category term="tien-ich-blogger"/><category term="windows"/><category term="cloudflare"/><category term="facebook"/><category term="facebook-ads"/><category term="windows-11"/><title type='text'>NLD Blog | Trang chia sẻ thủ thuật - HTML CSS và JavaScript</title><subtitle type='html'>NLD Blog là trang chia sẻ thủ thuật HTML, CSS, JavaScript, PHP Blogger, Blogspot, Template. Cùng với những kiến thức lập trình, công nghệ thông tin.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://www.nldblog.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default?start-index=26&amp;max-results=25'/><author><name>Admin</name><uri>http://www.blogger.com/profile/08109767152442622449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1501419158826549807</id><published>2024-02-02T12:55:00.000+07:00</published><updated>2024-02-02T12:55:22.404+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="seo-blogger"/><title type='text'>Cách thêm dữ liệu có cấu trúc Product trong mỗi bài viết</title><content type='html'>&lt;p&gt;Bạn đang có một Blog nhỏ bán các sản phẩm hoặc dự tính sẽ tạo một Blog tương tư như vậy trong thời gian sắp tới có thể tham khảo bài đăng dưới đây của mình về cách thêm dữ liệu có cấu trúc Product trong mỗi bài viết&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hidden&quot;&gt;
&lt;img alt=&quot;Cách thêm dữ liệu có cấu trúc Product trong mỗi bài viết&quot; height=&quot;405&quot; loading=&quot;lazy&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoMzLQBCR0ipYdO-Cohe4kn1HkKAOT7E1lYySjYXE8O76WJTWMl8cs_Ii1mePIaHULn_w9xunaIJYng9V7cWX4RESpdcTZjRpnOXj0aYbYVfqOtf-eWn4WJmOKjPo9JGKI0Uccn-WeT3Gr/s1600/schema-product-poster.jpg&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Trước hết bạn nên tìm hiểu sơ qua về dữ liệu có cấu trúc Product qua bài giới thiệu va hướng dẫn từ &lt;/p&gt;
&lt;p&gt;Google theo địa chỉ &lt;a href=&quot;https://developers.google.com/search/docs/data-types/product&quot; rel=&quot;noopener nofollow&quot; target=&quot;_blank&quot; title=&quot;&quot;&gt;https://developers.google.com/search/docs/data-types/product&lt;/a&gt;, ở đây mình chỉ giới thiệu qua khi bạn thêm dữ liệu có cấu trúc Product vào bài viết thì lọi dữ liệu này sẽ xuất hiện bên dưới bài viết trong kết quả tìm kiếm của Google, bạn sẽ trông nó như hình bên dưới&lt;/p&gt;
&lt;p class=&quot;separator&quot;&gt;
&lt;img alt=&quot;Cách thêm dữ liệu có cấu trúc Product trong mỗi bài viết&quot; class=&quot;lazyload&quot; data-src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqfHr_tTMr_xpb-bhZE2uSh1RkTHEFV5IxkG7CB3VRAtyT7u3Sh6AhrrtQB7ds1u0Dk3RPJZpvdZsQgfYVPXjMfXB3bSyKTWckIcrzRY4NOUA5Fv_NJoGAj11vJDtQ62hyphenhyphenCL23Nz1_Yb_M/s1600/schema-product.png&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqfHr_tTMr_xpb-bhZE2uSh1RkTHEFV5IxkG7CB3VRAtyT7u3Sh6AhrrtQB7ds1u0Dk3RPJZpvdZsQgfYVPXjMfXB3bSyKTWckIcrzRY4NOUA5Fv_NJoGAj11vJDtQ62hyphenhyphenCL23Nz1_Yb_M/s72/schema-product.png&quot; width=&quot;695&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;Lưu ý:&lt;/b&gt;&lt;/u&gt; Để dữ liệu có cấu trúc loại này xuất hiện trong kết quả tìm kiếm, cần xác thực tính chính xác của nó đại khái không phải ảo mỗi bài phải có dữ liệu với kết quả khác nhau chứ không giống nhau do đó cần sử dụng đến thẻ dữ liệu data bài viết của blogspot, cụ thể là những thẻ sau:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;data:post.id: id bài viết&lt;/li&gt;
&lt;li&gt;data:post.title: Tiều đề bài viết&lt;/li&gt;
&lt;li&gt;data:post.featuredImage: Url ảnh bài viết (1 ảnh)&lt;/li&gt;
&lt;li&gt;data:view.description: Mô tả tìm kiếm&lt;/li&gt;
&lt;li&gt;data:post.url.canonical: Url bài viết&lt;/li&gt;
&lt;li&gt;data:label.name: Nhãn bài viết (một nhãn và bằng số)&lt;/li&gt;
&lt;li&gt;data:post.numberOfComments: Số nhận xét&lt;/li&gt;
&lt;li&gt;data:post.author.name: Tên tác giả&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Một điều quan trọng phải sử dụng nhận xét mặc định của Blog, các bạn chèn code xml trong widget Blog, bạn chèn vào thẻ nào mà kiểm tra nó có xuất hiện trong bài viết là được, ví dụ bên trong thẻ sau:&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;
&amp;lt;b:includable id=&#39;post&#39; var=&#39;post&#39;&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;!-- Schema product code --&amp;gt;&lt;br /&gt;
&amp;lt;b:if cond=&#39;data:view.isPost&#39;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#39;display:none&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;div itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Product&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.id&#39; itemprop=&#39;mpn&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.title&#39; itemprop=&#39;name&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;link expr:href=&#39;data:post.featuredImage&#39; itemprop=&#39;image&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:view.description&#39; itemprop=&#39;description&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;offers&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Offer&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;link expr:href=&#39;data:post.url.canonical&#39; itemprop=&#39;url&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;https://schema.org/InStock&#39; itemprop=&#39;availability&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;&lt;span style=&quot;color: red;&quot;&gt;VND&lt;/span&gt;&#39; itemprop=&#39;priceCurrency&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;https://schema.org/UsedCondition&#39; itemprop=&#39;itemCondition&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:loop index=&#39;item&#39; values=&#39;data:post.labels&#39; var=&#39;label&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:if cond=&#39;data:item lte 0&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.labels[0].name&#39; itemprop=&#39;price&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/b:loop&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;&lt;span style=&quot;color: red;&quot;&gt;2020-12-31&lt;/span&gt;&#39; itemprop=&#39;priceValidUntil&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;seller&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Organization&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;&lt;span style=&quot;color: red;&quot;&gt;Tên tổ chức, công ty, trang web bán sản phẩm&lt;/span&gt;&#39; itemprop=&#39;name&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;aggregateRating&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/AggregateRating&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:if cond=&#39;data:post.numberOfComments lte 3&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.numberOfComments + &lt;span style=&quot;color: blue;&quot;&gt;3&lt;/span&gt;&#39; itemprop=&#39;reviewCount&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;3&#39; itemprop=&#39;ratingValue&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:elseif cond=&#39;data:post.numberOfComments in [&lt;span style=&quot;color: blue;&quot;&gt;3,4,5&lt;/span&gt;]&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.numberOfComments + &lt;span style=&quot;color: blue;&quot;&gt;5&lt;/span&gt;&#39; itemprop=&#39;reviewCount&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;3.5&#39; itemprop=&#39;ratingValue&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:elseif cond=&#39;data:post.numberOfComments in [&lt;span style=&quot;color: blue;&quot;&gt;6,7,8&lt;/span&gt;]&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.numberOfComments + &lt;span style=&quot;color: blue;&quot;&gt;8&lt;/span&gt;&#39; itemprop=&#39;reviewCount&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;4&#39; itemprop=&#39;ratingValue&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:elseif cond=&#39;data:post.numberOfComments in [&lt;span style=&quot;color: blue;&quot;&gt;9,10,11&lt;/span&gt;]&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.numberOfComments + &lt;span style=&quot;color: blue;&quot;&gt;11&lt;/span&gt;&#39; itemprop=&#39;reviewCount&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;4.5&#39; itemprop=&#39;ratingValue&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;b:elseif cond=&#39;data:post.numberOfComments gt &lt;span style=&quot;color: blue;&quot;&gt;11&lt;/span&gt;&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.numberOfComments + &lt;span style=&quot;color: blue;&quot;&gt;14&lt;/span&gt;&#39; itemprop=&#39;reviewCount&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;5&#39; itemprop=&#39;ratingValue&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;review&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Review&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;author&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Person&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.author.name&#39; itemprop=&#39;name&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;reviewRating&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Rating&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;4&#39; itemprop=&#39;ratingValue&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;5&#39; itemprop=&#39;bestRating&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;meta expr:content=&#39;data:post.id&#39; itemprop=&#39;sku&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div itemprop=&#39;brand&#39; itemscope=&#39;&#39; itemtype=&#39;http://schema.org/Thing&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;meta content=&#39;&lt;span style=&quot;color: red;&quot;&gt;Nhãn hiệu sản phẩm&lt;/span&gt;&#39; itemprop=&#39;name&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;lt;/b:includable&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Bạn hãy sửa lại trong những mục mình đánh dấu màu đỏ, lưu ý về ngày báo tình trạng còn hàng do đó bạn phải thường xuyện cập nhật lại nếu quá hạn, và tùy biến số nhận xét trong mục mình đánh dấu màu xanh, mình hướng dẫn về điều kiện hiển thị số nhận xét để bạn dễ tùy biến, như đoạn mã ở trên:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nếu số nhận xét dưới 3 =&amp;gt; reviewCount = số nhận xét + 3, ratingCount&amp;nbsp;= 3&lt;/li&gt;
&lt;li&gt;Nếu số nhận xét trong khoảng 3,4,5 =&amp;gt; reviewCount = số nhận xét + 5, ratingCount&amp;nbsp;= 3.5&lt;/li&gt;
&lt;li&gt;Nếu số nhận xét trong khoảng 6,7,8 =&amp;gt; reviewCount = số nhận xét + 8, ratingCount&amp;nbsp;= 4&lt;/li&gt;
&lt;li&gt;Nếu số nhận xét trong khoảng 9,10,11 =&amp;gt; reviewCount = số nhận xét + 11, ratingCount = 4.5&lt;/li&gt;
&lt;li&gt;Nếu số nhận xét trên 11 =&amp;gt; reviewCount = số nhận xét + 14, ratingCount = 5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Khi đã thêm và chỉnh sửa lại, bạn hãy kiểm tra kết quả bằng url bài viết tại một trong hai địa chỉ sau của Google:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://search.google.com/structured-data/testing-tool/u/0/&quot; rel=&quot;noopener nofollow&quot; target=&quot;_blank&quot; title=&quot;&quot;&gt;https://search.google.com/structured-data/testing-tool/u/0/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://search.google.com/test/rich-results?utm_campaign=devsite&amp;amp;utm_medium=microdata&amp;amp;utm_source=how-to&quot; rel=&quot;noopener nofollow&quot; target=&quot;_blank&quot; title=&quot;&quot;&gt;https://search.google.com/test/rich-results?utm_campaign=devsite&amp;amp;utm_medium=microdata&amp;amp;utm_source=how-to&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sau khi bạn kiểm tra thấy chính xác, không báo lỗi, có thể đợi vài ngày để Google cập nhật lại kết quả tìm kiếm bài viết thêm dữ liệu Product mà bạn đã thêm vào bài viết.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1501419158826549807/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2024/02/cach-them-du-lieu-co-cau-truc-product.html#comment-form' title='0 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1501419158826549807'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1501419158826549807'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2024/02/cach-them-du-lieu-co-cau-truc-product.html' title='Cách thêm dữ liệu có cấu trúc Product trong mỗi bài viết'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoMzLQBCR0ipYdO-Cohe4kn1HkKAOT7E1lYySjYXE8O76WJTWMl8cs_Ii1mePIaHULn_w9xunaIJYng9V7cWX4RESpdcTZjRpnOXj0aYbYVfqOtf-eWn4WJmOKjPo9JGKI0Uccn-WeT3Gr/s72-c/schema-product-poster.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-8475477502790664638</id><published>2023-09-26T13:13:00.012+07:00</published><updated>2023-10-31T11:36:36.713+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Blogger mới Update thêm tính năng lazy load và phân phát định dạng WebP cho hình ảnh</title><content type='html'>&lt;p&gt;Có thể các bạn chưa biết thì gần đây Blogger hay Blogspot mới update thêm tính năng lazy load images và WebP image serving, theo như mô tả thì lazy load sẽ tự động tải từng hình ảnh khi người đọc cuộn trang xuống và sẽ tự động phân phát hình ảnh cho bài đăng bằng WebP.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Blogger mới Update thêm tính năng lazy load và phân phát định dạng WebP cho hình ảnh&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1440&quot; data-original-width=&quot;2560&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYEVqWfZhb3AMoDm9xxMSopA8haDpRFD7N_keCx16JxOolfpV70CrV6NLAs6Eo_EvMUHv0AcgCE3PjfAlfR6ZJL3Q3Yg6gKnf_XBh90t_4qxICz_KjYht-wTZlX6SQkWsACyVvnxzoKJKQ9FbbRU327oErMlzNypxtr5IlNO702riCjeiFqC-A4VZKGtM/s600/WebP%20image%20serving%20Blogger.webp&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;Lazy load hình ảnh Blogger&lt;/h2&gt;
&lt;p&gt;Cụ thể hơn là giờ đây các bạn không cần thêm thủ công thược tính &lt;code&gt;loading=&quot;lazy&quot;&lt;/code&gt; vào từng thẻ &lt;code&gt;img&lt;/code&gt; để lazy load hình ảnh nữa mà giờ đây Blogger đã tự động thêm thuộc tính đó vào từng thẻ &lt;code&gt;img&lt;/code&gt; chứa hình ảnh của bạn. Về cơ bản các bạn có thể hiểu tính năng này sẽ cho trình duyệt của bạn biết rằng “Tao có các tấm ảnh này, nhưng mày đừng tải nó nhé. Khi nào người dùng cuộn đến đến vị trí tấm ảnh nào, thì mày hãy tải tấm ảnh ấy ngay”.&lt;/p&gt;
&lt;p&gt;Thuộc tính &lt;code&gt;loading&lt;/code&gt; có 3 giá trị là &lt;code&gt;lazy&lt;/code&gt;, &lt;code&gt;eager&lt;/code&gt; và &lt;code&gt;auto&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lazy&lt;/strong&gt;: browser cần lazy-load tấm ảnh này&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;eager&lt;/strong&gt;: browser cần tải tấm ảnh này ngay lập tức (hoặc càng sớm càng tốt). Nếu tấm ảnh đang được load với cơ chế lazy mà bạn đổi nó sang eager thì nó sẽ lập tức tải ngay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auto&lt;/strong&gt;: browser sẽ quyết định việc có nên lazy-load ảnh hay không.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cách này không áp dụng cho việc lazy load ảnh background.&lt;/p&gt;
&lt;blockquote&gt;Lưu ý rằng trình duyệt không đợi đến lúc ảnh xuất hiện ở viewport mới tải, mà khi ảnh gần xuất hiện ở viewport là nó đã tải rồi. Điều này giúp trình duyệt tải ảnh sớm nhất có thể để nó sẵn sàng xuất hiện trên màn hình kịp lúc, vì tải cũng mất thời gian mà.&lt;/blockquote&gt;
&lt;h2&gt;Phân phát hình ảnh cho bài đăng bằng định dạng WebP&lt;/h2&gt;
&lt;p&gt;Đầu tiên WebP là một định dạng hình ảnh hiện đại cung cấp các tính năng nén vượt trội lossless và lossy cho hình ảnh trên web. Đối với việc sử dụng WebP, chúng ta có thể tạo ra các hình ảnh tinh gọn hơn, phong phú hơn, giúp website, blog tải nhanh hơn.&lt;/p&gt;
&lt;p&gt;Hình ảnh khi nén lossless của WebP có kích thước nhỏ hơn 26% so với PNG. Hình ảnh WebP lossy thì nhỏ hơn 25-34% so với hình ảnh JPEG tương đương với chỉ số chất lượng tương đương.&lt;/p&gt;
&lt;p&gt;Trước đây các bạn phải tự thêm &lt;code&gt;-rw&lt;/code&gt; vào sau thuộc tính kích thước hình ảnh như sau:&lt;/p&gt;
&lt;pre&gt;https://blogger.googleusercontent.com/img/b/.../.../s1600/blogger-update-phan-phat-dinh-dang-webp.jpg&lt;/pre&gt;
&lt;p&gt;Để phân phát hình ảnh ở định dạng webp thì chúng ta thêm &lt;code&gt;-rw&lt;/code&gt; ngay sau thuộc tính kích thước, sẽ là &lt;code&gt;s1600-rw&lt;/code&gt;. Nó sẽ như dưới đây:&lt;/p&gt;
&lt;pre&gt;https://blogger.googleusercontent.com/img/b/.../.../s1600-rw/blogger-update-phan-phat-dinh-dang-webp.jpg&lt;/pre&gt;
&lt;p&gt;Và đó là cách thủ công mà mình đã làm với tất cả các hình ảnh trên Blog mình để tối ưu kích thước hình ảnh và cho Blogger biết rằng hình ảnh đó ở định dạng WebP. Nếu như không có thuộc tính &lt;code&gt;-rw&lt;/code&gt; thì cho dùng các bạn có lưu hình ảnh ở định dạng .WebP nhưng Blogger vẫn phân phối nó ở định dạng .PNG hoặc .JPG, và khi bạn check PageSpeed thì nó vẫn hiện cảnh báo khuyên bạn nên phân phối hình ảnh ở dưới định dạng WebP hoặc AVIF.&lt;/p&gt;
&lt;p&gt;Nhưng giờ đây các bạn không cần làm thủ công với từng hình ảnh nữa mà Blogger đã cho phép tự động phân phối hình ảnh ở định dạng WebP rồi, có nghĩa là giờ đây trong bài viết của các bạn khi đăng tải ảnh nên nó sẽ tự động thêm &lt;code&gt;-rw&lt;/code&gt; và sau thuộc tính kích thước hình ảnh của bạn.&lt;/p&gt;
&lt;h2&gt;Cách bật lazy load và phân phát định dạng WebP cho hình ảnh trên Blogger&lt;/h2&gt;
&lt;p&gt;Để bật được 2 tính năng này thì các bạn chỉ cần truy cập vào trang quản trị blogger sau đó vào &lt;b&gt;Cài đặt &gt; Bài đăng &gt; Tải từng phần hình ảnh.&lt;/b&gt; và &lt;b&gt;Cài đặt &gt; Bài đăng &gt; Phân phát hình ảnh bằng WebP.&lt;/b&gt;, các bạn bật 2 tính năng đó lên là được.&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Blogger mới Update thêm tính năng lazy load và phân phát định dạng WebP cho hình ảnh&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;501&quot; data-original-width=&quot;898&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIJ3RJ43yM-e39H592ic5PiRk74oy-EwopouSHKBDl8gaynfV5EScLTDHbB2yoB25lb-UXc9TDjX92GS19ZLtr0xDrkItV9Eemq4mhMNeFBauTfG5XoUYIexQRu0b-pI5fuye0gGxjt_9BZxp806ZUusaPz3kQLwIsfbJGWEBuZLcdYnhm1ZNx0K9b2Ok/s1600-e30/lazy%20load%20va%20webp%20blogger.png&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Trong trường hợp bạn không thấy 2 mục &lt;b&gt;Tải từng phần hình ảnh&lt;/b&gt; và &lt;b&gt;Phân phát hình ảnh bằng WebP&lt;/b&gt;, thì các bạn có thể truy cập draft.blogger.com và theo các bước ở trên để kích hoạt 2 tính năng hay ho này.&lt;/p&gt;
&lt;p&gt;Bài viết mình có sử dụng thông tin thêm trên mạng, nếu bài viết chưa đúng hay thông tin sai mong các bạn góp ý vào phần bình luận!&lt;/p&gt;

&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/8475477502790664638/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2023/09/blogger-update-tinh-nang-lazy-load-va-dinh-dang-webp-cho-hinh-anh.html#comment-form' title='9 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/8475477502790664638'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/8475477502790664638'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2023/09/blogger-update-tinh-nang-lazy-load-va-dinh-dang-webp-cho-hinh-anh.html' title='Blogger mới Update thêm tính năng lazy load và phân phát định dạng WebP cho hình ảnh'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYEVqWfZhb3AMoDm9xxMSopA8haDpRFD7N_keCx16JxOolfpV70CrV6NLAs6Eo_EvMUHv0AcgCE3PjfAlfR6ZJL3Q3Yg6gKnf_XBh90t_4qxICz_KjYht-wTZlX6SQkWsACyVvnxzoKJKQ9FbbRU327oErMlzNypxtr5IlNO702riCjeiFqC-A4VZKGtM/s72-c/WebP%20image%20serving%20Blogger.webp" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-4350996950605514000</id><published>2023-09-25T17:16:00.012+07:00</published><updated>2023-10-31T11:36:36.712+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách thêm GPT Chatbot sử dụng HTML, CSS và JavaScript cho Blog</title><content type='html'>&lt;p&gt;Thời điểm hiện tại chắc hầu hết các bạn đều biết đến ChatGPT cũng như các AI Chatbot trên mạng rất nhiều rồi, nếu như các bạn chưa biết thì Chatbot là một kiểu phần mềm có vai trò như là một trợ lý ảo và có khả năng hiểu được các thông tin mà người dùng cung cấp và đưa ra phản hồi phù hợp nhất cho người dùng.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;
  &lt;img alt=&quot;Cách thêm GPT Chatbot sử dụng HTML, CSS và JavaScript cho Blog&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1440&quot; data-original-width=&quot;2560&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb1PLehxKhn3vefwrgMkV6qqWOXHaz8ghp1TEAPqFm4MC0qIFCMO3lUGG9Wk_NeUJtLmmWjNs6uGAEZbK5tKHjG_UQAgUEQEDZtJS3K79FC4ncsvKopNzZDnbjkvJzObOlz3Fi98gqKiMYWl5vXy1pfrVpp1eBI7VtSWudOf01cm6koGwPR4ta71mtT_M/s1200-rw-e30/GPT%20Chatbot%20Blogspot.webp&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Thêm Chatbot vào website hay trang blog của mình có thể giúp người dùng thêm phần hứng thú hơn với website của chúng ta, vậy nên trong bài viết này mình sẽ hướng dẫn các bạn cách thêm một Chatbot sử dụng API từ OpenAI cũng với HTML, CSS và JavaScipt và website, blog của mình.&lt;/p&gt;
&lt;p&gt;Với Chatbot này, người dùng có thể hỏi và nhận được phản hồi ngay lập tức. Chatbot này có thể sử dụng trên nhiều thiết bị khác nhau. Hãy nhớ rằng để tạo phản hồi cho truy vấn của người dùng.&lt;/p&gt;
&lt;h2&gt;Các bước thêm GPT Chatbot sử dụng HTML, CSS và JavaScript&lt;/h2&gt;
&lt;p&gt;Để thêm GPT Chatbot sử dụng HTML, CSS và JavaScript, các bạn có thể theo dõi và làm theo các bước sau đây:&lt;/p&gt;
&lt;blockquote&gt;Trong bài viết này mình có sử dụng thêm bộ icon của Font-Awesome, nếu webiste hay blog của bạn chứ có thì có thể tham khảo bài viết sau: &lt;a href=&quot;https://www.nldblog.com/2021/09/font-awesome-6-them-nhieu-icons-moi-va-bo-icons-covid19.html&quot; target=&quot;_blank&quot;&gt;Font Awesome 6, thêm nhiều icons mới và bộ icons chủ đề COVID-19!
&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Các bạn tìm đến thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; và thêm đoạn HTML sau đây ngay phía trên thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;button class=&amp;quot;chatbot-toggler&amp;quot;&amp;gt;
    &amp;lt;span class=&amp;quot;material-symbols-rounded&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-comment-alt&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&amp;quot;material-symbols-outlined&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-times&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/button&amp;gt;
&amp;lt;div class=&amp;quot;chatbot&amp;quot;&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;h2&amp;gt;Chatbot&amp;lt;/h2&amp;gt;
        &amp;lt;span class=&amp;quot;close-btn material-symbols-outlined&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-times&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;ul class=&amp;quot;chatbox&amp;quot;&amp;gt;
        &amp;lt;li class=&amp;quot;chat incoming&amp;quot;&amp;gt;
            &amp;lt;span class=&amp;quot;material-symbols-outlined&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-robot&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;p&amp;gt;Hi there 👋&amp;lt;br /&amp;gt;How can I help you today?&amp;lt;/p&amp;gt;
        &amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;div class=&amp;quot;chat-input&amp;quot;&amp;gt;
        &amp;lt;textarea placeholder=&amp;quot;Enter a message...&amp;quot; required=&amp;quot;required&amp;quot; spellcheck=&amp;quot;false&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;
        &amp;lt;span class=&amp;quot;material-symbols-rounded&amp;quot; id=&amp;quot;send-btn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-share&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Tiếp tục thêm đoạn JavaScript sau đây ngay phía dưới đoạn HTML vừa thêm và phía trên thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;: &lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;/*&amp;lt;![CDATA[*/
const chatbotToggler = document.querySelector(&amp;quot;.chatbot-toggler&amp;quot;);
const closeBtn = document.querySelector(&amp;quot;.close-btn&amp;quot;);
const chatbox = document.querySelector(&amp;quot;.chatbox&amp;quot;);
const chatInput = document.querySelector(&amp;quot;.chat-input textarea&amp;quot;);
const sendChatBtn = document.querySelector(&amp;quot;.chat-input span&amp;quot;);

let userMessage = null; // Variable to store user&amp;#39;s message
const API_KEY = &quot;&quot;; // Paste your API key here
const inputInitHeight = chatInput.scrollHeight;

const createChatLi = (message, className) =&amp;gt; {
    // Create a chat &amp;lt;li&amp;gt; element with passed message and className
    const chatLi = document.createElement(&amp;quot;li&amp;quot;);
    chatLi.classList.add(&amp;quot;chat&amp;quot;, `${className}`);
    let chatContent = className === &amp;quot;outgoing&amp;quot; ? `&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;` : `&amp;lt;span class=&amp;quot;material-symbols-outlined&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-robot&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;`;
    chatLi.innerHTML = chatContent;
    chatLi.querySelector(&amp;quot;p&amp;quot;).textContent = message;
    return chatLi; // return chat &amp;lt;li&amp;gt; element
}

const generateResponse = (chatElement) =&amp;gt; {
    const API_URL = &amp;quot;https://api.openai.com/v1/chat/completions&amp;quot;;
    const messageElement = chatElement.querySelector(&amp;quot;p&amp;quot;);

    // Define the properties and message for the API request
    const requestOptions = {
        method: &amp;quot;POST&amp;quot;,
        headers: {
            &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,
            &amp;quot;Authorization&amp;quot;: `Bearer ${API_KEY}`
        },
        body: JSON.stringify({
            model: &amp;quot;gpt-3.5-turbo&amp;quot;,
            messages: [{role: &amp;quot;user&amp;quot;, content: userMessage}],
        })
    }

    // Send POST request to API, get response and set the reponse as paragraph text
    fetch(API_URL, requestOptions).then(res =&amp;gt; res.json()).then(data =&amp;gt; {
        messageElement.textContent = data.choices[0].message.content.trim();
    }).catch(() =&amp;gt; {
        messageElement.classList.add(&amp;quot;error&amp;quot;);
        messageElement.textContent = &amp;quot;Oops! Something went wrong. Please try again.&amp;quot;;
    }).finally(() =&amp;gt; chatbox.scrollTo(0, chatbox.scrollHeight));
}

const handleChat = () =&amp;gt; {
    userMessage = chatInput.value.trim(); // Get user entered message and remove extra whitespace
    if(!userMessage) return;

    // Clear the input textarea and set its height to default
    chatInput.value = &amp;quot;&amp;quot;;
    chatInput.style.height = `${inputInitHeight}px`;

    // Append the user&amp;#39;s message to the chatbox
    chatbox.appendChild(createChatLi(userMessage, &amp;quot;outgoing&amp;quot;));
    chatbox.scrollTo(0, chatbox.scrollHeight);
    
    setTimeout(() =&amp;gt; {
        // Display &amp;quot;Thinking...&amp;quot; message while waiting for the response
        const incomingChatLi = createChatLi(&amp;quot;Thinking...&amp;quot;, &amp;quot;incoming&amp;quot;);
        chatbox.appendChild(incomingChatLi);
        chatbox.scrollTo(0, chatbox.scrollHeight);
        generateResponse(incomingChatLi);
    }, 600);
}

chatInput.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {
    // Adjust the height of the input textarea based on its content
    chatInput.style.height = `${inputInitHeight}px`;
    chatInput.style.height = `${chatInput.scrollHeight}px`;
});

chatInput.addEventListener(&amp;quot;keydown&amp;quot;, (e) =&amp;gt; {
    // If Enter key is pressed without Shift key and the window 
    // width is greater than 800px, handle the chat
    if(e.key === &amp;quot;Enter&amp;quot; &amp;amp;&amp;amp; !e.shiftKey &amp;amp;&amp;amp; window.innerWidth &amp;gt; 800) {
        e.preventDefault();
        handleChat();
    }
});

sendChatBtn.addEventListener(&amp;quot;click&amp;quot;, handleChat);
closeBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; document.body.classList.remove(&amp;quot;show-chatbot&amp;quot;));
chatbotToggler.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; document.body.classList.toggle(&amp;quot;show-chatbot&amp;quot;));
/*]]&amp;gt;*/&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Tìm đến thẻ &lt;code&gt;head&lt;/code&gt; và thêm đoạn CSS sau phía trên thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;: &lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;&amp;lt;style&amp;gt;/*&amp;lt;![CDATA[*/
.chatbot-toggler{position:fixed;font-size:25px;bottom:30px;left:35px;outline:none;border:none;height:50px;width:50px;display:flex;cursor:pointer;align-items:center;justify-content:center;z-index:2;border-radius:50%;background:#e0ac33;transition:all .2s ease}
body.show-chatbot .chatbot-toggler{transform:rotate(90deg)}
.chatbot-toggler span{color:#fff;position:absolute}
.chatbot-toggler span:last-child,body.show-chatbot .chatbot-toggler span:first-child{opacity:0;display:flex}
body.show-chatbot .chatbot-toggler span:last-child{opacity:1}
.chatbot{position:fixed;left:35px;bottom:90px;width:350px;background:#fff;z-index:999;border-radius:15px;overflow:hidden;opacity:0;pointer-events:none;transform:scale(0.5);transform-origin:bottom right;box-shadow:0 0 128px 0 rgba(0,0,0,0.1),0 32px 64px -48px rgba(0,0,0,0.5);transition:all .1s ease}
body.show-chatbot .chatbot{opacity:1;pointer-events:auto;transform:scale(1)}
.chatbot header{padding:10px 0;position:relative;text-align:center;color:#fff;background:#e0ac33;box-shadow:0 2px 10px rgba(0,0,0,0.1)}
.chatbot header span{position:absolute;right:15px;top:50%;cursor:pointer;transform:translateY(-50%)}
header h2{font-size:1.4rem}
.chatbot .chatbox{overflow-y:auto;height:450px;padding:30px 20px 100px}
.chatbot :where(.chatbox,textarea)::-webkit-scrollbar{width:6px}
.chatbot :where(.chatbox,textarea)::-webkit-scrollbar-track{background:#fff;border-radius:25px}
.chatbot :where(.chatbox,textarea)::-webkit-scrollbar-thumb{background:#ccc;border-radius:25px}
.chatbox .chat{display:flex;list-style:none}
.chatbox .outgoing{margin:20px 0;justify-content:flex-end}
.chatbox .incoming span{width:32px;height:32px;color:#fff;cursor:default;text-align:center;line-height:32px;align-self:flex-end;background:#e0ac33;border-radius:4px;margin:0 10px 7px 0}
.chatbox .chat p{white-space:pre-wrap;padding:12px 16px;border-radius:10px 10px 0 10px;max-width:75%;color:#fff;font-size:.95rem;background:#e0ac33}
.chatbox .incoming p{border-radius:10px 10px 10px 0}
.chatbox .chat p.error{color:#721c24;background:#f8d7da}
.chatbox .incoming p{color:#000;background:#f2f2f2}
.chatbot .chat-input{display:flex;gap:5px;position:absolute;bottom:0;width:100%;background:#fff;padding:3px 20px;border-top:1px solid #ddd}
.chat-input textarea{height:55px;width:100%;border:none;outline:none;resize:none;max-height:180px;padding:15px 15px 15px 0;font-size:.95rem}
.chat-input span{align-self:flex-end;color:#e0ac33;cursor:pointer;height:55px;display:flex;align-items:center;visibility:hidden;font-size:1.35rem}
.chat-input textarea:valid ~ span{visibility:visible}
@media (max-width: 490px) {
.chatbot-toggler{right:20px;bottom:20px}
.chatbot{left:0;bottom:0;height:100%;border-radius:0;width:100%}
.chatbot .chatbox{height:90%;padding:25px 15px 100px}
.chatbot .chat-input{padding:5px 15px}
.chatbot header span{display:block}
}
/*]]&amp;gt;*/&amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 4:&lt;/b&gt; Lưu lại.&lt;/p&gt;
&lt;p&gt;Lưu ý: Chatbot của bạn hiện vẫn chưa hoạt động vì bạn chưa thêm API key trong biến API_KEY. Để lấy API key từ OpenAI, hãy đăng ký tài khoản tại &lt;a href=&quot;https://platform.openai.com/account/api-keys&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://platform.openai.com/account/api-keys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nếu các bạn không đăng ký được thì có thể liên hệ mình qua email(ngylduy@gmail.com), &lt;a href=&quot;https://www.facebook.com/dung.co.sua.ten.tao&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;facebook&lt;/a&gt; hoặc qua trang &lt;a href=&quot;https://www.nldblog.com/p/contact-us.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;liên hệ&lt;/a&gt; mình có thể giúp các bạn tạo 1 tài khoản với giá 30.000 VND&lt;/p&gt;
&lt;blockquote&gt;”Khi đăng ký tài khoản OpenAI, bạn sẽ nhận được $5 miễn phí để sử dụng API. Nếu tài khoản của bạn đã sử dụng hơn 3 tháng hoặc 5$ miễn phí, bạn cần tạo 1 tài khoản mới để lấy 5$ miễn phí hoặc nạp thêm tiền vào để tiếp tục sử dụng API của nó. Bạn có thể kiểm tra được tài khoản của mình ở link trên.”&lt;/blockquote&gt;
&lt;h2&gt;Kết luận&lt;/h2&gt;
&lt;p&gt;Tóm lại trong bài viết này mình đã hướng dẫn các bạn cách thêm GPT Chatbot sử dụng HTML, CSS và JavaScript cho Blog. Hy vọng làm theo các bước trong bài này, bạn đã tạo thành công GPT Chatbot bằng HTML, CSS và JavaScript.&lt;/p&gt;
&lt;p&gt;Nếu có bất kỳ thắc mắc nào đừng ngại comment xuống phía bên dưới mình sẽ giúp các bạn giải đáp thắc mắc sớm nhất có thể. Hãy nhớ rằng bạn cần phải thêm “API key của OpenAI” vào biến API_KEY trong &lt;b&gt;bước 2.&lt;/b&gt;&lt;/p&gt;
&lt;button class=&quot;chatbot-toggler&quot;&gt;
&lt;span class=&quot;material-symbols-rounded&quot;&gt;&lt;i class=&quot;rbi rbi-chat-bubble&quot;&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span class=&quot;material-symbols-outlined&quot;&gt;&lt;i class=&quot;rbi rbi-move&quot;&gt;&lt;/i&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;div class=&quot;chatbot&quot;&gt;
&lt;header&gt;
&lt;h2&gt;Chatbot&lt;/h2&gt;
&lt;span class=&quot;close-btn material-symbols-outlined&quot;&gt;&lt;i class=&quot;rbi rbi-move&quot;&gt;&lt;/i&gt;&lt;/span&gt;
&lt;/header&gt;
&lt;ul class=&quot;chatbox&quot;&gt;
&lt;li class=&quot;chat incoming&quot;&gt;
&lt;span class=&quot;material-symbols-outlined&quot;&gt;&lt;i class=&quot;rbi rbi-person&quot;&gt;&lt;/i&gt;&lt;/span&gt;
&lt;p&gt;Hi there 👋&lt;br/&gt;How can I help you today?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;chat-input&quot;&gt;
&lt;textarea placeholder=&quot;Enter a message...&quot; required spellcheck=&quot;false&quot;&gt;&lt;/textarea&gt;
&lt;span class=&quot;material-symbols-rounded&quot; id=&quot;send-btn&quot;&gt;&lt;i class=&quot;rbi-arrow-right&quot;&gt;&lt;/i&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;/*&lt;![CDATA[*/
.chatbot-toggler{position:fixed;font-size:25px;bottom:30px;left:35px;outline:none;border:none;height:50px;width:50px;display:flex;cursor:pointer;align-items:center;justify-content:center;z-index:2;border-radius:50%;background:#e0ac33;transition:all .2s ease}
body.show-chatbot .chatbot-toggler{transform:rotate(90deg)}
.chatbot-toggler span{color:#fff;position:absolute}
.chatbot-toggler span:last-child,body.show-chatbot .chatbot-toggler span:first-child{opacity:0;display:flex}
body.show-chatbot .chatbot-toggler span:last-child{opacity:1}
.chatbot{position:fixed;left:35px;bottom:90px;width:350px;background:#fff;z-index:999;border-radius:15px;overflow:hidden;opacity:0;pointer-events:none;transform:scale(0.5);transform-origin:bottom right;box-shadow:0 0 128px 0 rgba(0,0,0,0.1),0 32px 64px -48px rgba(0,0,0,0.5);transition:all .1s ease}
body.show-chatbot .chatbot{opacity:1;pointer-events:auto;transform:scale(1)}
.chatbot header{padding:10px 0;position:relative;text-align:center;color:#fff;background:#e0ac33;box-shadow:0 2px 10px rgba(0,0,0,0.1)}
  .chatbot header h2{margin:0;padding:0;color:#fff}
.chatbot header span{position:absolute;right:15px;top:50%;cursor:pointer;transform:translateY(-50%)}
header h2{font-size:1.4rem}
.chatbot .chatbox{overflow-y:auto;height:450px;padding:30px 20px 100px;margin:0}
.chatbot :where(.chatbox,textarea)::-webkit-scrollbar{width:6px}
.chatbot :where(.chatbox,textarea)::-webkit-scrollbar-track{background:#fff;border-radius:25px}
.chatbot :where(.chatbox,textarea)::-webkit-scrollbar-thumb{background:#ccc;border-radius:25px}
.chatbox .chat{display:flex;list-style:none;padding:0;margin:0}
.chatbox .chat:before{display:none}
.chatbox .outgoing{margin:20px 0;justify-content:flex-end}
.chatbox .incoming span{width:32px;height:32px;color:#fff;cursor:default;text-align:center;line-height:32px;align-self:flex-end;background:#e0ac33;border-radius:4px;margin:0 10px 7px 0}
.chatbox .chat p{white-space:pre-wrap;padding:12px 16px;border-radius:10px 10px 0 10px;max-width:75%;color:#fff;font-size:.95rem;background:#e0ac33}
.chatbox .incoming p{border-radius:10px 10px 10px 0;margin:0}
.chatbox .chat p.error{color:#721c24;background:#f8d7da}
.chatbox .incoming p{color:#000;background:#f2f2f2}
.chatbot .chat-input{display:flex;gap:5px;position:absolute;bottom:0;width:100%;background:#fff;padding:3px 20px;border-top:1px solid #ddd}
.chat-input textarea{height:55px;width:100%;border:none;outline:none;resize:none;max-height:180px;padding:15px 15px 15px 0;font-size:.95rem}
.chat-input span{align-self:flex-end;color:#e0ac33;cursor:pointer;height:55px;display:flex;align-items:center;visibility:hidden;font-size:1.35rem}
.chat-input textarea:valid ~ span{visibility:visible}
@media (max-width: 490px) {
.chatbot-toggler{right:20px;bottom:20px}
.chatbot{left:0;bottom:0;height:100%;border-radius:0;width:100%}
.chatbot .chatbox{height:90%;padding:25px 15px 100px}
.chatbot .chat-input{padding:5px 15px}
.chatbot header span{display:block}
}
/*]]&gt;*/&lt;/style&gt;
&lt;script&gt;/*&lt;![CDATA[*/
const chatbotToggler = document.querySelector(&quot;.chatbot-toggler&quot;);
const closeBtn = document.querySelector(&quot;.close-btn&quot;);
const chatbox = document.querySelector(&quot;.chatbox&quot;);
const chatInput = document.querySelector(&quot;.chat-input textarea&quot;);
const sendChatBtn = document.querySelector(&quot;.chat-input span&quot;);

let userMessage = null; // Variable to store user&#39;s message
const API_KEY = nBc.de(&#39;G4VnewYVr9W8Rbx3zZrrrdf6S2Hle8ruR8pVSZnQcgz0G6p2t6dWeu6lYZp0FungGQpJ&#39;); // Paste your API key here
const inputInitHeight = chatInput.scrollHeight;

const createChatLi = (message, className) =&gt; {
    // Create a chat &lt;li&gt; element with passed message and className
    const chatLi = document.createElement(&quot;li&quot;);
    chatLi.classList.add(&quot;chat&quot;, `${className}`);
    let chatContent = className === &quot;outgoing&quot; ? `&lt;p&gt;&lt;/p&gt;` : `&lt;span class=&quot;material-symbols-outlined&quot;&gt;&lt;i class=&quot;rbi rbi-person&quot;/&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;`;
    chatLi.innerHTML = chatContent;
    chatLi.querySelector(&quot;p&quot;).textContent = message;
    return chatLi; // return chat &lt;li&gt; element
}

const generateResponse = (chatElement) =&gt; {
    const API_URL = &quot;https://api.openai.com/v1/chat/completions&quot;;
    const messageElement = chatElement.querySelector(&quot;p&quot;);

    // Define the properties and message for the API request
    const requestOptions = {
        method: &quot;POST&quot;,
        headers: {
            &quot;Content-Type&quot;: &quot;application/json&quot;,
            &quot;Authorization&quot;: `Bearer ${API_KEY}`
        },
        body: JSON.stringify({
            model: &quot;gpt-3.5-turbo&quot;,
            messages: [{role: &quot;user&quot;, content: userMessage}],
        })
    }

    // Send POST request to API, get response and set the reponse as paragraph text
    fetch(API_URL, requestOptions).then(res =&gt; res.json()).then(data =&gt; {
        messageElement.textContent = data.choices[0].message.content.trim();
    }).catch(() =&gt; {
        messageElement.classList.add(&quot;error&quot;);
        messageElement.textContent = &quot;Oops! Something went wrong. Please try again.&quot;;
    }).finally(() =&gt; chatbox.scrollTo(0, chatbox.scrollHeight));
}

const handleChat = () =&gt; {
    userMessage = chatInput.value.trim(); // Get user entered message and remove extra whitespace
    if(!userMessage) return;

    // Clear the input textarea and set its height to default
    chatInput.value = &quot;&quot;;
    chatInput.style.height = `${inputInitHeight}px`;

    // Append the user&#39;s message to the chatbox
    chatbox.appendChild(createChatLi(userMessage, &quot;outgoing&quot;));
    chatbox.scrollTo(0, chatbox.scrollHeight);
    
    setTimeout(() =&gt; {
        // Display &quot;Thinking...&quot; message while waiting for the response
        const incomingChatLi = createChatLi(&quot;Thinking...&quot;, &quot;incoming&quot;);
        chatbox.appendChild(incomingChatLi);
        chatbox.scrollTo(0, chatbox.scrollHeight);
        generateResponse(incomingChatLi);
    }, 600);
}

chatInput.addEventListener(&quot;input&quot;, () =&gt; {
    // Adjust the height of the input textarea based on its content
    chatInput.style.height = `${inputInitHeight}px`;
    chatInput.style.height = `${chatInput.scrollHeight}px`;
});

chatInput.addEventListener(&quot;keydown&quot;, (e) =&gt; {
    // If Enter key is pressed without Shift key and the window 
    // width is greater than 800px, handle the chat
    if(e.key === &quot;Enter&quot; &amp;&amp; !e.shiftKey &amp;&amp; window.innerWidth &gt; 800) {
        e.preventDefault();
        handleChat();
    }
});

sendChatBtn.addEventListener(&quot;click&quot;, handleChat);
closeBtn.addEventListener(&quot;click&quot;, () =&gt; document.body.classList.remove(&quot;show-chatbot&quot;));
chatbotToggler.addEventListener(&quot;click&quot;, () =&gt; document.body.classList.toggle(&quot;show-chatbot&quot;));
/*]]&gt;*/&lt;/script&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/4350996950605514000/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2023/09/cach-them-gpt-chatbot-su-dung-html-css-va-javascript-cho-blog.html#comment-form' title='4 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4350996950605514000'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4350996950605514000'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2023/09/cach-them-gpt-chatbot-su-dung-html-css-va-javascript-cho-blog.html' title='Cách thêm GPT Chatbot sử dụng HTML, CSS và JavaScript cho Blog'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb1PLehxKhn3vefwrgMkV6qqWOXHaz8ghp1TEAPqFm4MC0qIFCMO3lUGG9Wk_NeUJtLmmWjNs6uGAEZbK5tKHjG_UQAgUEQEDZtJS3K79FC4ncsvKopNzZDnbjkvJzObOlz3Fi98gqKiMYWl5vXy1pfrVpp1eBI7VtSWudOf01cm6koGwPR4ta71mtT_M/s72-c-e30-rw/GPT%20Chatbot%20Blogspot.webp" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-3353010511530087876</id><published>2023-04-05T22:34:00.006+07:00</published><updated>2023-10-31T11:36:36.711+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách chặn chuột phải, Copy, Cut và F12 sử dụng JavaScript</title><content type='html'>&lt;p&gt;Nếu như bạn muốn hạn chế người dùng truy cập vào trang web hay blog của bạn có thể xem mã nguồn hay gọi là xem code và copy nội dung của bạn hoặc là một mục đích nào đó thì trong bài viết này mình sẽ chia sẻ cho các bạn &lt;b&gt;cách chặn chuột phải, Copy, Cut và F12 sử dụng JavaScript&lt;/b&gt; rất đơn giản.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách chặn chuột phải, Copy, Cut và F12 sử dụng JavaScript&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1440&quot; data-original-width=&quot;2560&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5HhSibBvZstKphQvBpgBjvasJdJdCoVISQ9TSzTIRx5wXWpl8tCXmjIN-Jhkbe10huV60u5duW23gw6_XsbsADxKFXSsmycHldcBS0FfC1VFceStllaRMoQl677OvgaXCAtXwjrFs8XzunJWKO3QTb2cJIf1-yLWZCr8JioYoAlpLFW18pP-6V7ZE/s600-rw-e30/disable-copy-and-paste.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Bài viết này sẽ chia sẻ cho các bạn cách chặn người dùng thực hiện những hành động trên bằng cách vô hiệu hoá chuột phải và các phím tắt như ctrl + c, ctrl + x, ctrl + u, ctrl + shift + i, và f12 sử dụng JavaScript.&lt;/p&gt;
&lt;p&gt;Nếu bạn chưa biết thì phím tắt ctrl + u được sử dụng để xem mã nguồn của blog, ctrl + shift + i và f12 được sử dụng để mở chế độ developer trên trình duyệt. Vì vậy, bạn phải vô hiệu hoá tất cả các phím tắt này và nút chuột phải.&lt;/p&gt;
&lt;p&gt;Để chặn chuột phải và các phím tắt bằng JavaScript, các bạn chỉ cần copy đoạn code bên dưới và dán vào ngay phía dưới thẻ &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
      const disabledKeys = [&quot;c&quot;, &quot;C&quot;, &quot;x&quot;, &quot;J&quot;, &quot;u&quot;, &quot;I&quot;];
      const showAlert = e =&amp;gt; {
        e.preventDefault();
        return alert(&quot;Sorry, you can&#39;t view or copy source codes this way!&quot;);
      }
      document.addEventListener(&quot;contextmenu&quot;, e =&amp;gt; {
        showAlert(e);
      });
      document.addEventListener(&quot;keydown&quot;, e =&amp;gt; {
        // calling showAlert() function, if the pressed key matched to disabled keys
        if((e.ctrlKey &amp;amp;&amp;amp; disabledKeys.includes(e.key)) || e.key === &quot;F12&quot;) {
          showAlert(e);
        }
      });
      window.addEventListener(&quot;load&quot;,function(){
        try {
          !function t(n) {
            1 === (&quot;&quot; + n / n).length &amp;amp;&amp;amp; 0 !== n || function() {}.constructor(&quot;debugger&quot;)(), t(++n)
          }(0)
        } catch (n) {
          setTimeout(t, 100)
        }
      });
//]]&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Trong đoạn code trên sẽ có một thông báo hiện ra khi người dùng bấm chuột phải hoặc cố gắng sao chép nội, bạn cũng có thể thay thế thông báo này bằng nội dung hoặc code thêm của bạn. Bạn cũng có thể thử ngay trên bài viết này!&lt;/p&gt;
&lt;h3&gt;Kết luận&lt;/h3&gt;
&lt;p&gt;Việc chặn chuột phải, Copy, Cut và F12 có thể gây bất tiện khi bạn chỉnh sửa giao diện blog và cũng sẽ chặn người dùng truy cập các tính năng khác do trình duyệt hoặc tiện ích mở rộng cung cấp. Nhưng nếu bạn chỉ là người làm nội dung thì nó mạng lại khá nhiều lợi ích cho bạn.&lt;/p&gt;
&lt;p&gt;Nếu thấy bài viết hay thì đừng quên chia sẻ bài viết giúp mình nhé! ❤️&lt;/p&gt;
&lt;script&gt;
      const disabledKeys = [&quot;c&quot;, &quot;C&quot;, &quot;x&quot;, &quot;J&quot;, &quot;u&quot;, &quot;I&quot;];
      const showAlert = e =&gt; {
        e.preventDefault();
        return alert(&quot;Sorry, you can&#39;t view or copy source codes this way!&quot;);
      }
      document.addEventListener(&quot;contextmenu&quot;, e =&gt; {
        showAlert(e);
      });
      document.addEventListener(&quot;keydown&quot;, e =&gt; {
        // calling showAlert() function, if the pressed key matched to disabled keys
        if((e.ctrlKey &amp;&amp; disabledKeys.includes(e.key)) || e.key === &quot;F12&quot;) {
          showAlert(e);
        }
      });
      window.addEventListener(&quot;load&quot;,function(){
        try {
          !function t(n) {
            1 === (&quot;&quot; + n / n).length &amp;&amp; 0 !== n || function() {}.constructor(&quot;debugger&quot;)(), t(++n)
          }(0)
        } catch (n) {
          setTimeout(t, 100)
        }
      });
&lt;/script&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/3353010511530087876/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2023/04/cach-chan-chuot-phai-copy-cut-va-f12-su-dung-javascript.html#comment-form' title='0 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3353010511530087876'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3353010511530087876'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2023/04/cach-chan-chuot-phai-copy-cut-va-f12-su-dung-javascript.html' title='Cách chặn chuột phải, Copy, Cut và F12 sử dụng JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5HhSibBvZstKphQvBpgBjvasJdJdCoVISQ9TSzTIRx5wXWpl8tCXmjIN-Jhkbe10huV60u5duW23gw6_XsbsADxKFXSsmycHldcBS0FfC1VFceStllaRMoQl677OvgaXCAtXwjrFs8XzunJWKO3QTb2cJIf1-yLWZCr8JioYoAlpLFW18pP-6V7ZE/s72-c-e30-rw/disable-copy-and-paste.webp" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1610558118251812860</id><published>2023-03-30T20:00:00.012+07:00</published><updated>2023-10-31T11:36:36.710+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách tạo CDN hình ảnh với tên miền riêng cho Blogger</title><content type='html'>&lt;p&gt;Chào các bạn, lâu lắm rồi mình mới lại viết bài về thủ thuật Blogger bài thủ thuật gần nhất cũng đã hơn 7 tháng rồi đó là bài &lt;a href=&quot;https://www.nldblog.com/2022/09/tao-khung-chua-code-co-nut-copy-va-download-code-dep-cho-blogger.html&quot; target=&quot;_blank&quot;&gt;Tạo khung chứa code có nút Copy và Download Code đẹp cho Blogger&lt;/a&gt;. Còn trong bài viết ngày hôm nay mình sẽ hướng dẫn các bạn cách tạo CDN hình ảnh với tên miền riêng cho Blogger, nó có thể hiểu đơn giản là mình sẽ thay thế tên miền ảnh mặc định của Blogger thành tên miền của mình. Đầu tiên mình sẽ cùng tìm hiểu CDN là gì!&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhj_yZ_HJ7KDkVxprZcVN8AYhCEwwRZiIuROBB7IPpwsIPOrT3gDvUGkLa65LIAVK40oo3CXf_eLCR4FzSv0boQZmeL4HMbDuGdwCuGMir8eK-MP_VmtBSl7mH9zjeUlpSr6o5emo8vum7NPLJSgqIxEB9eAitewNHmHKcX1hgglZkU1ARxGXS3x_W/s2560/cdn-image-blogger.webp&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger&quot; title=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1440&quot; data-original-width=&quot;2560&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhj_yZ_HJ7KDkVxprZcVN8AYhCEwwRZiIuROBB7IPpwsIPOrT3gDvUGkLa65LIAVK40oo3CXf_eLCR4FzSv0boQZmeL4HMbDuGdwCuGMir8eK-MP_VmtBSl7mH9zjeUlpSr6o5emo8vum7NPLJSgqIxEB9eAitewNHmHKcX1hgglZkU1ARxGXS3x_W/s600/cdn-image-blogger.webp&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;CDN là gì?&lt;/h3&gt;
&lt;p&gt;CDN viết tắt của Content Delivery Network là mạng lưới máy chủ lưu giữ bản sao của các nội dung tĩnh bên trong website và phân phối đến nhiều máy chủ PoP. Mạng lưới máy chủ CDN được đặt ở khắp mọi nơi trên toàn cầu. Từ PoP (Points of Presence), dữ liệu sẽ tiếp tục được gửi đến người dùng cuối. Thông qua CDN, bản sao nội dung trên máy chủ gần nhất sẽ được trả về cho người dùng khi họ truy cập website.&lt;/p&gt;
&lt;p class=&#39;postRef&#39;&gt;Nguồn:&lt;br&gt; wiki.matbao.net&lt;/p&gt;
&lt;h3&gt;Yêu cầu để thực hiện&lt;/h3&gt;
&lt;p&gt;Để thực hiện thủ thuật này có 1 yêu cầu cần thiết và duy nhất đó là bạn phải sử dụng Cloudflare để quản lý DNS của domain và trỏ về Blogger.&lt;/p&gt;
&lt;h3&gt;Cách thay thế tên miền của Blogger thành tên miền riêng&lt;/h3&gt;
&lt;p&gt;Về cơ bản Cách tạo CDN hình ảnh với tên miền riêng cho Blogger cũng tương tự như &lt;a href=&quot;https://www.nldblog.com/2022/07/cach-tao-progressive-web-app-pwa-cho-blogger-website.html&quot; target=&quot;_blank&quot;&gt;Cách tạo Progressive Web App (PWA) cho Blogger/Website&lt;/a&gt; các bạn có thể đọc tham khảo thêm. Các bước thực hiện như sau: &lt;/p&gt;
&lt;ol class=&#39;step noList&#39;&gt;
  &lt;li&gt;Truy cập vào trang quản lý tên miền của Cloudflare.&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Tại menu bên trái bạn truy cập vào &lt;b&gt;Worker&lt;/b&gt;&lt;/p&gt;
    &lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger - Step 1&quot; title=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger - Step 1&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;959&quot; data-original-width=&quot;1841&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO7cJJeK26lIOP9oXebPJ-jE76QCKhvakp2kEvmoxshfgO5T5AAfmoOpuI-hsumnvSa0ZK7Kpsin_AX2omxeOLcRs_8oP7vMDe-yGiiela72saIbPYN6TXv2AwUGB9XnQxnU1ygpGU1pntk9YGwZIdvNc72n-0Ua6o0k74QTZ_dD1GVEwOS4KyqXIt/s1600-rw-e30/step-1.png&quot;/&gt;&lt;/p&gt;
    &lt;p&gt;Nếu là lần đầu tiên truy cập bạn hãy chọn &lt;b&gt;Create Worker&lt;/b&gt;.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Nếu không bạn hãy chọn &lt;b&gt;Create a Service&lt;/b&gt; sau đó đặt tên ví dụ như &lt;code&gt;new-images&lt;/code&gt; và chọn tiếp &lt;b&gt;Create service&lt;/b&gt;.&lt;/p&gt;
  	&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger - Step 2&quot; title=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger - Step 2&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;862&quot; data-original-width=&quot;903&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVjp3X0FlysStXgHqqMDBTXcZaLV5LIXG15UOANZe0YxfCLwR6w4WDTqYsCBPVKnCSfbXzpPulUW9oDmpGfanCLRMMGjRjkvQcUIiVBqpUNyVm1mnjn68xO8T7AVpAeFrfiAG56BgMAVlpy89xKdrkSSDrcJQmtAqhoI1_x2IdM5i2gR-mhgxt2uxm/s1600-rw-e30/step-2.png&quot;/&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Tiếp theo chọn &lt;b&gt;Quick Edit&lt;/b&gt;, xoá bỏ đoạn Script có sẵn và thay thế bằng đoạn Script dưới đây:&lt;/p&gt;
    &lt;pre class=&#39;javascript&#39;&gt;const ORIGINS = {
  &quot;&lt;mark&gt;new-images.ngylduy.workers.dev&lt;/mark&gt;&quot;: &quot;blogger.googleusercontent.com&quot;,
  &quot;&lt;mark&gt;www.nldblog.com&lt;/mark&gt;&quot;: &quot;blogger.googleusercontent.com&quot;,
}

async function handleRequest(request) {
  let url = new URL(request.url)
  // Check if incoming hostname is a key in the ORIGINS object
 if (url.hostname in ORIGINS) {
    const target = ORIGINS[url.hostname]
    url.hostname = target
    // If it is, proxy request to that third party origin
    return await fetch(url.toString().replace(&#39;/new-images&#39;, &#39;&#39;), request)
  }

}

addEventListener(&quot;fetch&quot;, event =&gt; {
  event.respondWith(handleRequest(event.request))
})&lt;/pre&gt;
    &lt;p&gt;Thay thế &lt;b&gt;new-images.ngylduy.workers.dev&lt;/b&gt; bằng URL Worker của bạn và &lt;b&gt;www.nldblog.com&lt;/b&gt; thay bằng tên miền Blog của bạn.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Nhấp Save and deploy.&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;Truy cập vào trang Cloudflare của tên miền của bạn như ở trên và tại menu bên trái chọn &lt;b&gt;Workers Routes&lt;/b&gt; và chọn &lt;b&gt;Add route&lt;/b&gt;. Sau đó nhập thông tin như sau:&lt;/p&gt;
&lt;div class=&quot;table-reponsive&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Environment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
  &lt;td&gt;https://*.&lt;b&gt;nldblog.com&lt;/b&gt;/images/*&lt;/td&gt;
  &lt;td&gt;&lt;b&gt;new-images&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
    &lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger - Step 3&quot; title=&quot;Cách tạo CDN hình ảnh với tên miền riêng cho Blogger - Step 3&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;791&quot; data-original-width=&quot;1046&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwcX9QW5oHcPqvOGhls7CF5V1mHHkVsxsZs8kfzNklRyWCiQmV0yhAbV8Ca7vMk7E5AY7KJhWzW7t46VawM5bEYbBYPfhGvMTUvtIukxYMq5dS4ZhRK35pKBgk14hF_jeh-NR0uoxazl_P-urZ1K2BJOmyGNgxrYHlrmYjCGPOFh_jf9g8dYWz0WHe/s1600-rw-e30/step-3.png&quot;/&gt;&lt;/p&gt;
    &lt;p&gt;Nhớ thay &lt;b&gt;nldblog.com&lt;/b&gt; thành tên miền của bạn và &lt;b&gt;new-images&lt;/b&gt; chọn đúng giống tên Worker tạo bên trên.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Như các bạn đã biết thì bây giờ khi up ảnh lên bài viết thì sẽ có dạng như sau:&lt;/p&gt;
&lt;pre&gt;https://&lt;mark&gt;blogger.googleusercontent.com&lt;/mark&gt;/img/b/R29vZ2xl/AVvXsEgrUmFU2Zd-HcidCBMAxpwbojvWvzFax72Uu9xJsO_q3f2P2nlOYZ0Z2pruqnC2q1FHwtpE7q0vYuFdMDDmVrauNJ9DspjDY9m_4pj7dWr19VsGZUb3Z1bWWdYjovN5PTRVFtrXir0lSv59ablZT6b6ONIrIvicgxm_eZVPtJSsi07Ot14idhxEp98t/s1600-rw-e30/pixblog-template.webp&lt;/pre&gt;
&lt;p&gt;Chúng ta hãy thay &lt;b&gt;blogger.googleusercontent.com&lt;/b&gt; thành tên miền route đã để ở trên ví dụ như của mình sẽ là:&lt;/p&gt;
&lt;pre&gt;https://&lt;mark&gt;www.nldblog.com/new-images&lt;/mark&gt;/img/b/R29vZ2xl/AVvXsEgrUmFU2Zd-HcidCBMAxpwbojvWvzFax72Uu9xJsO_q3f2P2nlOYZ0Z2pruqnC2q1FHwtpE7q0vYuFdMDDmVrauNJ9DspjDY9m_4pj7dWr19VsGZUb3Z1bWWdYjovN5PTRVFtrXir0lSv59ablZT6b6ONIrIvicgxm_eZVPtJSsi07Ot14idhxEp98t/s1600-rw-e30/pixblog-template.webp&lt;/pre&gt;
&lt;p&gt;Vậy là xong rồi đấy, các bạn có thể truy cập thử liên kết hình ảnh bên trên nhé!&lt;/p&gt;
&lt;h3&gt;Lời kết&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Vì mình sử dụng dịch vụ miễn phí của Cloudflare nên nó sẽ giới hạn tối đa là 100.000 request mỗi ngày.&lt;/li&gt;
  &lt;li&gt;Nếu bạn để URL tuỳ chỉnh như ở trên là thumbnail thì khi đạt đến giới hạn truy cập thì hình ảnh của bạn sẽ không thể hiển thị.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nếu blog của bạn là 1 blog nhỏ thì sử dụng gói miễn phí của Cloudflare là đủ còn không hãy nâng cấp lên gói cáo cấp của Cloudflare. Chúc các bạn thành công.&lt;/p&gt;








  
  
  
  
  
  
  
  
  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1610558118251812860/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2023/03/cach-tao-cdn-hinh-anh-voi-ten-mien-rieng-cho-blogger.html#comment-form' title='2 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1610558118251812860'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1610558118251812860'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2023/03/cach-tao-cdn-hinh-anh-voi-ten-mien-rieng-cho-blogger.html' title='Cách tạo CDN hình ảnh với tên miền riêng cho Blogger'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhj_yZ_HJ7KDkVxprZcVN8AYhCEwwRZiIuROBB7IPpwsIPOrT3gDvUGkLa65LIAVK40oo3CXf_eLCR4FzSv0boQZmeL4HMbDuGdwCuGMir8eK-MP_VmtBSl7mH9zjeUlpSr6o5emo8vum7NPLJSgqIxEB9eAitewNHmHKcX1hgglZkU1ARxGXS3x_W/s72-c/cdn-image-blogger.webp" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-598283218639719588</id><published>2022-10-20T10:56:00.009+07:00</published><updated>2023-03-24T21:23:29.742+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="facebook-ads"/><title type='text'>Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục</title><content type='html'>&lt;p&gt;Có một vài lý do có thể kể đến khi &lt;strong&gt;fanpage bị hạn chế quảng cáo, &lt;/strong&gt;nhưng khi fanpage bị hạn chế quảng cáo bạn chỉ nhận được thông báo đến từ Facebook: &quot;Trang của bạn đã vi phạm chính sách Facebook đã đề ra&quot;.&lt;/p&gt;
&lt;p&gt;Bài viết này mình sẽ chỉ cho các bạn lý do tại sao &lt;strong&gt;fanpage bị hạn chế quảng cáo&lt;/strong&gt; và cách khắc phục nhé. &lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục&quot; title=&quot;Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục&quot; border=&quot;0&quot; width=&quot;320&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjULUaqu-Is0l8aQ_5ILgPtm3i5_BUvGvRkag514-UXAXrETWVCggs4ZK1Zk4U8CImwxUhnBOrwQnB49ZfoGebmRb-s_gBUDm7vZz_KsPHUn3DuDtKV9sbrA6macR6LTWIJ0RmpyH_bsaoacTpNwYXkp-xiisviZe4eMoTO-hcE6tgP4huKtoGsyjKb/s600-rw-e30/Fanpage_Thumbnail.webp&quot;/&gt;&lt;/div&gt;
&lt;h2&gt;Tại sao fanpage bị hạn chế quảng cáo?&lt;/h2&gt;
&lt;p&gt;Fanpage giúp quảng bá thương hiệu và hình ảnh Doanh nghiệp đến đúng đối tượng khách hàng mục tiêu. Fanpage có sức lan tỏa rộng.&lt;/p&gt;
&lt;p&gt;Nếu một thành viên chia sẻ một bài viết trong Fanpage thì bạn bè của họ có thể nhìn thấy nó.&lt;/p&gt;
&lt;p&gt;Nhưng fanpage cũng dễ bị gặp tình trạng bị hạn chế quảng cáo, gây khó khăn cho doanh nghiệp.&lt;/p&gt;
&lt;h3&gt;Nguyên nhân khiến Fanpage bị hạn chế quảng cáo&lt;/h3&gt;
&lt;p&gt;Khi dính lỗi hạn chế quảng cáo, người dùng sẽ nhận được một tin nhắn từ Facebook dạng như: Trang &lt;strong&gt;fanpage của bạn đã vi phạm chính sách&lt;/strong&gt; mà Facebook đề ra.&lt;/p&gt;
&lt;p&gt;Tuy nhiên, nó lại không nói rõ hay đề cập đến lý do chính xác dẫn đến lỗi này là gì. Do đó, đôi khi nó sẽ khiến nhà quảng cáo cảm thấy hoang mang, không biết mình đã sai ở đâu để khắc phục.&lt;/p&gt;
&lt;p&gt;Dưới đây là một số lỗi mà người dùng hay vi phạm khiến cho tài khoản quảng cáo bị hạn chế hoặc khoá:&lt;/p&gt;
&lt;p&gt;- Câu tương tác trong nội dung&lt;/p&gt;
&lt;p&gt;- Seeding spam!&lt;/p&gt;
&lt;p&gt;- Các nội dung vi phạm tiêu chuẩn cộng đồng bị quét&lt;/p&gt;
&lt;p&gt;- Các nick quản trị từng vi phạm liên đới&lt;/p&gt;
&lt;p&gt;- Cách trả lời bình luận/tin nhắn spam&lt;/p&gt;
&lt;p&gt;- Ko biết cách dẫn link về web bị đánh dấu spam&lt;/p&gt;
&lt;p&gt;- Trong bài quảng cáo có chứa hình ảnh, sản phẩm, ngôn từ mà Facebook cấm quảng cáo.&lt;/p&gt;
&lt;p&gt;- Tài khoản quảng cáo đã có lịch sử vi phạm chính sách khi chạy quảng cáo Facebook.&lt;/p&gt;

&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục&quot; title=&quot;Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirjDv3dBzyX5JMWQXEqoVO7-2dAeiYbKjVp-ueK3YE8XHXelXzGAHpnCQq9KnMT1rnTq4XqjcfAHhXcz95nLqfO_wX2JHCGUKf914CKp5EzCBYsADWIdCOUzacxfIiF7NCdMSIyajZWOD6tZ0IJ45VGc-wxntz2viYbn7p5_8VDhKS256feEG7zcgi/s600-rw-e30/Thie%CC%82%CC%81t-ke%CC%82%CC%81-chu%CC%9Ba-co%CC%81-te%CC%82n-6.jpg&quot;/&gt;&lt;/p&gt;

&lt;p&gt;- Bài viết quảng cáo có chứa hình ảnh, video, từ ngữ vi phạm tiêu chuẩn của Facebook.&lt;/p&gt;
&lt;p&gt;- Facebook thực hiện chiến dịch quét những tài khoản vi phạm.&lt;/p&gt;
&lt;p&gt;- Bạn mắc lỗi trong quá trình tạo quảng cáo như: Chèn quá nhiều chữ trong ảnh, nhắm vào mục tiêu cá nhân, sử dụng sai thương hiệu Facebook, quảng cáo bạo lực, quảng cáo kém chất lượng,…&lt;/p&gt;
&lt;p&gt;- Trang đích của quảng cáo vi phạm chính sách của Facebook.&lt;/p&gt;
&lt;p&gt;- Sử dụng tài khoản quảng cáo mới.&lt;/p&gt;
&lt;p&gt;- Sử dụng các phần mềm autotool như: Phần mềm seeding, quét ID, hack like, tăng like ảo,…&lt;/p&gt;
&lt;h3&gt;Cách xử lý khi fanpage bị hạn chế quảng cáo&lt;/h3&gt;
&lt;p&gt;Cách xử lý fanpage bị hạn chế quảng cáo sau đây chắc chắn có thể giúp bạn khắc phục được sự cố này – Gửi kháng cáo cho Facebook&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bước 1:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chuẩn bị 1 tài khoản Facebook sạch, chưa từng liên quan đến quảng cáo càng tốt. &lt;/p&gt;
&lt;p&gt;Sau đó share quyền quản trị fanpage cho nó, đồng thời gỡ hết toàn bộ vai trò quản trị, biên tập viên và người phụ trách quảng cáo ra khỏi page. Chỉ giữ lại duy nick sạch này.&lt;/p&gt;
&lt;p&gt;Lưu ý: Để tăng khả năng thành công, bạn nên để nó đăng bài như thường trong khoảng 5-7 ngày.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bước 2:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bạn truy cập vào chất lượng tài khoản đến phần trang để gửi yêu cầu xem xét lại. Hoặc có thể kháng page qua &lt;a href=&quot;#&quot;&gt;link ở đây&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bước 3:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chờ &lt;strong&gt;Facebook xem xét kháng nghị&lt;/strong&gt; và xét duyệt. Quá trình này thường mất khoảng 5-7 ngày. Bạn có thể nhận được Email trả lời từ Facebook hoặc Email thông báo về việc quảng cáo đã được hoạt động trở lại.&lt;/p&gt;
&lt;p&gt;Đây chưa phải phương pháp mới nhất - đầy đủ &amp;amp; hiệu quả nhất. Tuy nhiên cũng là góc nhìn của 3 Độ.&lt;/p&gt;

&lt;h4&gt;Đối Với Page Cũ &lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Tạo thêm các page vệ tinh theo vị trí cửa hàng, thời điểm bây giờ quét khá ghê nên ai muốn Ăn Chắc thì &lt;strong&gt;chạy ads page vệ tinh.&lt;/strong&gt;&lt;br /&gt;
Ưu điểm là đa số page chính chưa die thì tin nhắn của page vệ tinh sẽ về page chính, về độ trâu thì mình đánh giá là trâu hơn tất cả các loại page kháng mà chưa chạy ads bao giờ.&lt;br /&gt;
Ngoài ra, tất cả các bài viết trên page sẽ hiển thị trên page vệ tinh. Và còn vài tính năng hay ho khác.&lt;/li&gt;
&lt;li&gt;Nhét page vào Bm XMDN chỉ chuyên để cầm page, mục đích để hạn chế liên đới, dễ kháng về hơn, page có độ trâu tương đối do đã trải qua xác minh. (Tài khoản thì vẫn yếu nhé nếu chưa chi tiêu)&lt;/li&gt;
&lt;li&gt;Các vai trò quản trị viên, biên tập viên, kiểm duyệt, quảng cáo cần được phân chia rõ ràng. Vai trò gì nhiệm vụ đấy tránh liên đới về sau.&lt;br /&gt;
Page nhiều khi không dính lỗi gì vẫn bị hạn chế phần nhiều cũng do quản trị viên và biên tập viên từng nắm giữ tài sản bị hạn chế.&lt;/li&gt;
&lt;li&gt;Khi lên camp bị từ chối mà các tài sản khác không làm sao thì vào camp chỉnh sửa lại bài khác không vi phạm rồi lên lại, bài cũ thì chỉnh sửa rồi xóa đi.&lt;br /&gt;
Camp kia lên được rồi cũng xóa đi luôn lên lại camp khác. Mục đích để page và tài khoản dính lỗi ít nhất có thể. Đừng chày cối set cho bằng được 1 bài đó lần thứ 2 nó vẫn từ chối là biết rồi đó.&lt;/li&gt;
&lt;li&gt;Tạo 1 group liên kết với page, ngoài mục đích giúp page khỏe hơn thì sau xây được group to rất có lợi.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Đối với page mới (không phải page vệ tinh):&lt;/h4&gt;
&lt;p&gt;B1: Vào Bm tạo page trong Bm, điền đầy đủ các thông tin trên page (nếu có Bm XMDN hay kháng thì càng ổn áp)&lt;/p&gt;

&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục&quot; title=&quot;Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaRTiVRq7w2pMcNbM9FI-DhzXxnffcZ9H9g69ACBJBukqQXbwmUeGmR9j7v3h-bNSkxCICC6BRrypLz9vTpnZdq2J7igQ-LGYEzajTIqMeCcEmA6pjj90qY1cpGLW_opzUSAlWd5TWeA8voHcb_iZwTM14elwFtv7M9AKh8I44-iktJgrsqVOUXRIG/s600-rw-e30/Thie%CC%82%CC%81t-ke%CC%82%CC%81-chu%CC%9Ba-co%CC%81-te%CC%82n-7.jpg&quot;/&gt;&lt;/p&gt;

&lt;p&gt;B2: Tạo 1 group liên kết với page, đăng 5-7 bài lên page&lt;/p&gt;
&lt;p&gt;B3: Share page cho via set cầm quyền biên tập viên. (nếu via set mới mua thì cần ngâm 24 - 48h trước rồi mới share page)&lt;/p&gt;
&lt;p&gt;B4: Sau 1 ngày cầm page thì lên camp like page hoặc nhận biết bằng Boost Post cho page học máy học từ 1-2 ngày khi nào trên page hiện cách đăng bài bằng Studio sáng tạo là được, sau tạo 1 bài viết bất kỳ bằng Studio sáng tạo.&lt;/p&gt;
&lt;p&gt;B5: Thực hiện xong bước 4 thì lên tiếp camp 2 trong Trình quản lý quảng cáo khi nào hoạt động cắn tiền mới tắt camp 1.&lt;/p&gt;
&lt;p&gt;Ngoài ra vấn đề Chết page nó còn đến từ nhiều yếu tố khác: nick set, tài khoản, bm, thẻ, môi trường máy, nội dung, mạng. Chúng đều liên quan đến môi trường sử dụng của nick.&lt;/p&gt;
  
&lt;h2&gt;PHẢI LÀM GÌ KHI FANPAGE BỊ KHÓA QUẢNG CÁO VĨNH VIỄN?&lt;/h2&gt;
&lt;p&gt;Trong một số trường hợp, mặc dù bạn đã yêu cầu kháng cáo theo đúng quy trình nhưng vẫn không được mở chức năng quảng cáo. Và sau đó, Facebook vẫn đưa ra quyết định rằng fanpage của bạn sẽ bị khóa quảng cáo vĩnh viễn.&lt;/p&gt;
&lt;p&gt;Trường hợp này, bạn phải tạo fanpage mới và thực hiện kéo khách hàng sang page mới bằng các các sau:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cách 1:&lt;/em&gt; Liên tục đăng bài ở &lt;strong&gt;fanpage bị khóa quảng cáo&lt;/strong&gt; để nhờ khách hàng like fanpage mới của bạn.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cách 2:&lt;/em&gt; Dùng fanpage mới để chạy quảng cáo Retargeting trên Facebook hướng đến đối tượng những khách hàng từng biết đến hoặc tương tác với fanpage cũ của bạn.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/598283218639719588/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/10/ly-do-fanpage-bi-han-che-quang-cao-va.html#comment-form' title='2 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/598283218639719588'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/598283218639719588'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/10/ly-do-fanpage-bi-han-che-quang-cao-va.html' title='Lý do Fanpage bị hạn chế quảng cáo và cách khắc phục'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjULUaqu-Is0l8aQ_5ILgPtm3i5_BUvGvRkag514-UXAXrETWVCggs4ZK1Zk4U8CImwxUhnBOrwQnB49ZfoGebmRb-s_gBUDm7vZz_KsPHUn3DuDtKV9sbrA6macR6LTWIJ0RmpyH_bsaoacTpNwYXkp-xiisviZe4eMoTO-hcE6tgP4huKtoGsyjKb/s72-c-e30-rw/Fanpage_Thumbnail.webp" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-6736816614315410154</id><published>2022-09-22T15:05:00.018+07:00</published><updated>2023-03-24T21:23:47.753+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><category scheme="http://www.blogger.com/atom/ns#" term="windows-11"/><title type='text'>Download Windows 11 22H2 mới nhất từ Microsoft cập nhật 2022</title><content type='html'>&lt;p&gt;Mới đây Microsoft đã ra mắt bản cập nhật mới cho Windows 11 đó là phiên bản 20H2 với tên gọi chính thức là: Windows 11 version 22H2 build 22621.382 bản ISO&lt;/p&gt;
&lt;p&gt;Windows 11 22H2 là phiên bản cập nhật lớn đầu tiên của Windows 11, sau gần 1 năm kể từ khi Windows 11 chính thức ra mắt công khai. Windows 11 22H2 đã chính thức ra mắt vào ngày 20/09/2022 với nhiều tính năng và cải tiến mới như Start Menu với folder, Tabs trong File Explorer, giao diện Task Manager mới, các cử chỉ mới,...&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Download Windows 11 22H2 mới nhất từ Microsoft cập nhật 2022&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjJUQXxURdS4jAH3pRr68hU-UlFo-EW2ri7J6EAyAvqGSNJOwfdPZixJG2KolkgLEuyoXTXW58kBzpZi7YoRZVjz1pYp1MLLnXv77a_22_Q5ayB-IpzyGL9KmG83ut9D8MUCY3T4O-Yt14JcLflEvuuDR32hkda9F7cz5eoIytI-i4nDu_Z-vp4zs/s600-rw-e30/windows-11-22h2.webp&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;Một số tính năng cải thiện mới của Windows 11 22H2&lt;/h2&gt;
&lt;p&gt;Windows 11 22H2 đáng mong đợi bởi vì Windows 11 phiên bản tiền nhiệm để lại không ít rắc rối bởi sự mới mẻ và chưa thích nghi được với phần lớn người dùng Windows 10 nâng cấp. Và được cộng đồng trải nghiệm mới gọi đây là phiên bản &quot;Cải lùi&quot; của nhà Microsoft Windows 11, chính vì thế phiên bản 22H2 chính thức ra mắt vào ngày 20/09/2022 là đợt cập nhật lớn nhất đầu tiên được phần lớn người dùng đón nhận. Có một số tính năng như sau:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Thay đổi Start menu và thanh Taskbar&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Thay đổi Start menu và thanh Taskbar&lt;/li&gt;
  &lt;li&gt;Chức năng kéo thả đã quay trở lại&lt;/li&gt;
  &lt;li&gt;Thêm chức năng Pins nâng cao&lt;/li&gt;
  &lt;li&gt;Thêm thư mục trên Start Menu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Cải tiến trình duyệt tập tin (File Explorer) và quản lý cửa sổ tốt hơn&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Đính tập tin vào mục Favorites&lt;/li&gt;
  &lt;li&gt;Xem trước nội dung trong thư mục&lt;/li&gt;
  &lt;li&gt;Tính năng Snap cải tiến&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Một số thay đổi giao diện khác&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Hình nền Spotlight trên desktop&lt;/li&gt;
  &lt;li&gt;Màn hình khoá cải tiến&lt;/li&gt;
  &lt;li&gt;Biểu tượng icon mới và hiệu ứng Mica trong suốt&lt;/li&gt;
  &lt;li&gt;Control Panel di chuyển đến mục Cài đặt&lt;/li&gt;
  &lt;li&gt;Task Manager hoàn toàn mới&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Download Windows 11 22H2&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Link tải Windows 11 22H2 chính gốc Microsoft&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Phiên bản Windows 11 22H2 build 22621.382 ngày 20/09/2022&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nldblog.com/links/wr2g&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;{getButton} $text={Download} $icon={download}&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Windows 11 22H2 15in1&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Đây là bản Windows 11 22H2 22621.521 mới nhất 15in1&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Build 22H2 update mới nhất đến 22/09/2022.&lt;/li&gt;
  &lt;li&gt;Untouched nguyên bản (anh em có thể dùng key kích hoạt riêng của anh em nếu muốn)&lt;/li&gt;
  &lt;li&gt;Đã kích hoạt bản quyền vĩnh viễn.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nldblog.com/links/ARDR&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;{getButton} $text={Download} $icon={download}&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Packed by Andy Pham - &lt;a href=&quot;https://www.facebook.com/groups/nghientechvn&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Nghiện Tech&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nếu có vấn đề gì về link tải vui lòng bình luận xuống dưới bài viết mình sẽ cập nhật lại sớm nhất có thể.&lt;/p&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/6736816614315410154/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/09/download-windows-11-cap-nhat-moi-nhat-tu-microsoft.html#comment-form' title='3 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/6736816614315410154'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/6736816614315410154'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/09/download-windows-11-cap-nhat-moi-nhat-tu-microsoft.html' title='Download Windows 11 22H2 mới nhất từ Microsoft cập nhật 2022'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjJUQXxURdS4jAH3pRr68hU-UlFo-EW2ri7J6EAyAvqGSNJOwfdPZixJG2KolkgLEuyoXTXW58kBzpZi7YoRZVjz1pYp1MLLnXv77a_22_Q5ayB-IpzyGL9KmG83ut9D8MUCY3T4O-Yt14JcLflEvuuDR32hkda9F7cz5eoIytI-i4nDu_Z-vp4zs/s72-c-e30-rw/windows-11-22h2.webp" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1158748748659182621</id><published>2022-09-13T10:50:00.030+07:00</published><updated>2023-10-31T11:36:36.709+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Tạo khung chứa code có nút Copy và Download Code đẹp cho Blogger</title><content type='html'>&lt;p&gt;Xin chào các bạn, lâu rồi mới lại viết thêm bài thủ thuật cho Blogger. Bài này mình sẽ chia sẻ cho các bạn thủ thuật thêm khung chứ code hay còn gọi là codebox có nút Copy và Download Code đẹp cho Blogger. Thủ thuật này sử dụng HTML, CSS và JavaScript.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Tạo khung chứa code có nút Copy và Download Code đẹp cho Blogger&quot; title=&quot;Tạo khung chứa code có nút Copy và Download Code đẹp cho Blogger&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLX5Z16ZIwqJjdos6lQwUBX84gPY6qqE9yfQiEs3f7TsbydPPYB3-ldpCHSnju-nLBP34DfV0NSbQ3cS1habp3Nfe7X4UI7FXDMxLX6c1Ng4-pZMRcnkuyJhHJFn0muMhN3PM5gTvZSulKs-TCigrkFOA-ZO-19LocI0LR5MiBSYqnZWkUrfqAHdAC/s600-rw-e30/codebox-for-blogger.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Các bạn có thể xem demo ở đây: &lt;/p&gt;
&lt;p style=&#39;text-align:center&#39;&gt;&lt;a href=&quot;https://nldunplug.blogspot.com/2022/09/codebox-with-copy-and-download-button.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;{getButton} $text={Preview} $icon={preview}&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Cách thực hiện&lt;/h2&gt;
&lt;p&gt;Cách thực hiện các bạn không cần biết nhiều về những kiến thức HTML, CSS hoặc JS vì mình đã code sẵn cho các bạn. Các bạn cần làm theo chính xác các bước hướng dẫn của mình là được.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Truy cập trang quản trị của Blogger và vào phần chỉnh sử HTML, sau đó tìm đến thẻ &lt;code&gt;]]&amp;gt;&amp;lt;/b:skin&amp;gt;&lt;/code&gt; và thêm đoạn code &lt;b&gt;CSS&lt;/b&gt; dưới đây vào phía trên nó:&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;/* Code Box */
.pre{background:#f6f6f6;color:#2f3337;direction: ltr;position:relative;border-radius:3px;overflow:hidden;margin:1.7em auto} 
.pre pre{margin:0;color:inherit;background:inherit;display:block;position:relative;font-size:13px;line-height:1.6em;border-radius:3px;padding:30px 20px 20px;-moz-tab-size:2;tab-size:2;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none; overflow:auto;direction:ltr;white-space:pre} 
.pre.adv{border-radius:10px}
.pre.adv::before{display:none}
.pre:not(.str) .prCd{display:none}
.pre.str .prTl{display:none;}
.pre.adv pre{padding-top:60px}
.preM{position:absolute;top:0;right:0;left:0;width:100%;background: rgba(0,0,0,.04);padding:10px 10px 10px 20px;display:flex;justify-content:space-between;align-items:center;flex-wrap:nowrap;z-index:2}
.preT{font-size:12px;font-family: var(--fontC);line-height:1rem;position:relative;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-right:10px;}
.preA{display:flex;gap:8px;white-space:nowrap;}
.preA button{outline:none;border:none;width:30px;height:30px;background:#d9d9d9;padding:0;margin:0;border-radius:50%;transition:border-radius .2s ease;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;}
.preA button:hover{border-radius:40%;}
.preA button &gt;svg{width:18px;height:18px;stroke:none;fill:#2e2e2e;transition: all .5s ease;}
.pre.cpd .prCp svg, .pre.pnd .prDl svg, .pre.dwn .prDl svg{animation: jiggle 1s}
.pre.cpd .prCp svg .a,.pre:not(.cpd) .prCp svg .b{opacity:0}
.pre.dwn .prDl svg .a, .pre.pnd .prDl svg .a,.pre:not(.pnd) .prDl svg .b,.pre:not(.dwn) .prDl svg .c{opacity:0}
@keyframes jiggle{0%{transform:rotate(0)}20%{transform:rotate(26deg)}40%{transform:rotate(-26deg)}60%{transform:rotate(26deg)}80%{transform:rotate(-26deg)}100%{transform:rotate(0)}}
@-webkit-keyframes jiggle{0%{transform:rotate(0)}20%{transform:rotate(26deg)}40%{transform:rotate(-26deg)}60%{transform:rotate(26deg)}80%{transform:rotate(-26deg)}100%{transform:rotate(0)}}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Tìm đến thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; hoặc một số template sẽ là &lt;code&gt;&amp;amp;lt;/body&amp;amp;gt;&lt;/code&gt; và thêm đoạn JavaScript dưới đây và phía trên nó:&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;/*&amp;lt;![CDATA[*/
0&amp;lt;document.querySelectorAll(&amp;#39;div.pre.nb&amp;#39;).length&amp;amp;&amp;amp;(() =&amp;gt; {
let preD = document.querySelectorAll(&amp;#39;div.pre.nb&amp;#39;);
function saveDoc(x, d, n) {
    if (n = typeof n == &amp;#39;string&amp;#39; ? n : &amp;#39;text/plain&amp;#39;, d = typeof d == &amp;#39;string&amp;#39; ? d : &amp;#39;File_&amp;#39; + (new Date).getTime() + &amp;#39;.txt&amp;#39;, x) {
        n = new Blob([x], {
            type: n
        });
        if (navigator.msSaveBlob) return navigator.msSaveBlob(n, d); {
            let x = window.URL.createObjectURL(n),
                c = document.createElement(&amp;quot;a&amp;quot;);
            c.classList.add(&amp;#39;hidden&amp;#39;), c.href = x, c.download = d, document.body.appendChild(c), c.click(), c.remove(), window.URL.revokeObjectURL(x)
        }
    }
}
for (let r = 0; r &amp;lt; preD.length; r++) {
    let b = preD[r];
    b.classList.add(&amp;#39;adv&amp;#39;);
    let x = b.dataset.text || &amp;#39;File_&amp;#39; + (new Date).getTime(),
        e = b.dataset.file || x,
        _ = b.dataset.lang || &amp;#39;.txt&amp;#39;,
        m = &amp;#39;undefined&amp;#39; !== typeof b.dataset.time ? isNaN(Number(b.dataset.time)) ? &amp;#39;false&amp;#39; === b.dataset.time ? 0 : 10 : Number(b.dataset.time) : 10,
        c = &amp;#39;undefined&amp;#39; === typeof b.dataset.download || b.dataset.download == &amp;#39;true&amp;#39;,
        d = &amp;#39;undefined&amp;#39; === typeof b.dataset.copy || b.dataset.copy == &amp;#39;true&amp;#39;,
        n = &amp;#39;undefined&amp;#39; === typeof b.dataset.view || b.dataset.view == &amp;#39;true&amp;#39;,
        a = b.querySelector(&amp;#39;pre&amp;#39;),
        t = a.innerText;
    b.insertAdjacentHTML(&amp;#39;afterbegin&amp;#39;, &amp;quot;&amp;lt;div class=&amp;#39;preM&amp;#39;&amp;gt;&amp;lt;div class=&amp;#39;preT&amp;#39;&amp;gt;&amp;lt;span class=&amp;#39;prTl&amp;#39;&amp;gt;&amp;quot; + (null == x ? &amp;#39;&amp;amp;lt;/&amp;amp;gt;&amp;#39; : x) + &amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;#39;prCd&amp;#39;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;#39;preA&amp;#39;&amp;gt;&amp;quot; + (n ? &amp;#39;\x3C!--[ Prev&amp;#39; + &amp;quot;iew ]--&amp;gt;&amp;lt;button class=&amp;#39;prVw&amp;#39;&amp;gt;&amp;lt;svg viewBox=&amp;#39;0 0 24 24&amp;#39;&amp;gt;&amp;lt;path d=&amp;#39;M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/button&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + (c ? &amp;quot;\x3C!--[ Download ]--&amp;gt;&amp;lt;button class=&amp;#39;prDl&amp;#39;&amp;gt;&amp;lt;svg viewBox=&amp;#39;0 0 24 24&amp;#39;&amp;gt;&amp;lt;path class=&amp;#39;a&amp;#39; d=&amp;#39;M8 17V15H16V17H8M16 10L12 14L8 10H10.5V6H13.5V10H16M12 2C17.5 2 22 6.5 22 12C22 17.5 17.5 22 12 22C6.5 22 2 17.5 2 12C2 6.5 6.5 2 12 2M12 4C7.58 4 4 7.58 4 12C4 16.42 7.58 20 12 20C16.42 20 20 16.42 20 12C20 7.58 16.42 4 12 4Z&amp;#39;/&amp;gt;&amp;lt;path class=&amp;#39;b&amp;#39; d=&amp;#39;M13,2.03C17.73,2.5 21.5,6.25 21.95,11C22.5,16.5 18.5,21.38 13,21.93V19.93C16.64,19.5 19.5,16.61 19.96,12.97C20.5,8.58 17.39,4.59 13,4.05V2.05L13,2.03M11,2.06V4.06C9.57,4.26 8.22,4.84 7.1,5.74L5.67,4.26C7.19,3 9.05,2.25 11,2.06M4.26,5.67L5.69,7.1C4.8,8.23 4.24,9.58 4.05,11H2.05C2.25,9.04 3,7.19 4.26,5.67M2.06,13H4.06C4.24,14.42 4.81,15.77 5.69,16.9L4.27,18.33C3.03,16.81 2.26,14.96 2.06,13M7.1,18.37C8.23,19.25 9.58,19.82 11,20V22C9.04,21.79 7.18,21 5.67,19.74L7.1,18.37M12,16.5L7.5,12H11V8H13V12H16.5L12,16.5Z&amp;#39;/&amp;gt;&amp;lt;path class=&amp;#39;c&amp;#39; d=&amp;#39;M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M7,15H17V17H7V15M10.3,11.2L8.4,9.3L7,10.7L10.3,14L17,7.3L15.6,5.9L10.3,11.2Z&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/button&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + (d ? &amp;quot;\x3C!--[ Copy ]--&amp;gt;&amp;lt;button class=&amp;#39;prCp&amp;#39;&amp;gt;&amp;lt;svg viewBox=&amp;#39;0 0 24 24&amp;#39;&amp;gt;&amp;lt;path class=&amp;#39;a&amp;#39; d=&amp;#39;M20,16V4H8V16H20M22,16A2,2 0 0,1 20,18H8C6.89,18 6,17.1 6,16V4C6,2.89 6.89,2 8,2H20A2,2 0 0,1 22,4V16M16,20V22H4A2,2 0 0,1 2,20V7H4V20H16Z&amp;#39;/&amp;gt;&amp;lt;path class=&amp;#39;b&amp;#39; d=&amp;#39;M20,16V10H22V16A2,2 0 0,1 20,18H8C6.89,18 6,17.1 6,16V4C6,2.89 6.89,2 8,2H16V4H8V16H20M10.91,7.08L14,10.17L20.59,3.58L22,5L14,13L9.5,8.5L10.91,7.08M16,20V22H4A2,2 0 0,1 2,20V7H4V20H16Z&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/button&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + &amp;#39;&amp;lt;/div&amp;gt;&amp;lt;/di&amp;#39; + &amp;quot;v&amp;gt;&amp;quot;);
    let i = b.querySelector(&amp;#39;.prVw&amp;#39;),
        l = b.querySelector(&amp;#39;.prDl&amp;#39;),
        f = b.querySelector(&amp;#39;.prCp&amp;#39;),
        W = b.querySelector(&amp;#39;.prCd&amp;#39;);
    null !== i &amp;amp;&amp;amp; i.addEventListener(&amp;#39;click&amp;#39;, () =&amp;gt; {
        var x = &amp;#39;#252526&amp;#39;;
        x = &amp;#39;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&amp;#39; + e.replace(/\./g, &amp;quot;&amp;quot;).replace(/ /g, &amp;quot;_&amp;quot;) + _ + &amp;quot;&amp;lt;/title&amp;gt;&amp;lt;meta content=&amp;#39;width=device-width,initial-scale=1,user-scalable=1,minimum-scale=1,maximum-scale=5&amp;#39; name=&amp;#39;viewport&amp;#39;/&amp;gt;&amp;lt;meta content=&amp;#39;&amp;quot; + x + &amp;quot;&amp;#39; name=&amp;#39;theme-color&amp;#39;/&amp;gt;&amp;lt;meta content=&amp;#39;&amp;quot; + x + &amp;quot;&amp;#39; name=&amp;#39;msapplication-navbutton-color&amp;#39;/&amp;gt;&amp;lt;meta content=&amp;#39;&amp;quot; + x + &amp;quot;&amp;#39; name=&amp;#39;apple-mobile-web-app-status-bar-style&amp;#39;/&amp;gt;&amp;lt;link rel=&amp;#39;shortcut icon&amp;#39; type=&amp;#39;image/png&amp;#39; href=&amp;#39;https://www.nldblog.com/main/android-icon-192x192.png&amp;#39;&amp;gt;&amp;lt;style&amp;gt;body{min-height:100vh;background:#252526;color:#fff}*{margin:0;padding:0}html{line-height:1em;background:#1d1f21;color:#c5c8c6}pre{white-space:pre-wrap;word-wrap:break-word;word-break:break-all;padding:20px}pre i{font-style:normal}&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;div class=&amp;#39;pre&amp;#39;&amp;gt;&amp;quot; + a.outerHTML + &amp;#39;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#39;;
        x = new Blob([x], {
            type: &amp;#39;text/html&amp;#39;
        });
        window.navigator.msSaveOrOpenBlob ? window.navigator.msSaveOrOpenBlob(blobObject, fileName) : (x = window.URL.createObjectURL(x), window.open(x, &amp;#39;_blank&amp;#39;), window.URL.revokeObjectURL(x))
    }), 
    null !== l &amp;amp;&amp;amp; l.addEventListener(&amp;#39;click&amp;#39;, () =&amp;gt; {
        l.disabled = !0;
        let c = m;
        b.classList.add(&amp;#39;pnd&amp;#39;, &amp;#39;str&amp;#39;), W.innerHTML = 0 !== m ? &amp;#39;Please wai&amp;#39; + &amp;quot;t &amp;quot; + c + &amp;#39;s...&amp;#39; : &amp;#39;Please wai&amp;#39; + &amp;#39;t...&amp;#39;;
        let a = setInterval(() =&amp;gt; {
            0 !== m &amp;amp;&amp;amp; --c, 0 !== m &amp;amp;&amp;amp; (W.innerHTML = &amp;#39;Please wait &amp;#39; + c + &amp;#39;s...&amp;#39;), c &amp;lt;= 0 &amp;amp;&amp;amp; (clearInterval(a), setTimeout(() =&amp;gt; {
                W.innerHTML = &amp;#39;Downloading...&amp;#39;, setTimeout(() =&amp;gt; {
                    b.classList.remove(&amp;#39;pnd&amp;#39;), b.classList.add(&amp;#39;dwn&amp;#39;), saveDoc(t, e.replace(/\./g, &amp;quot;&amp;quot;).replace(/ /g, &amp;quot;_&amp;quot;) + &amp;#39;_by_NLD_Blog&amp;#39; + _, &amp;#39;text/plain&amp;#39;), W.innerHTML = &amp;#39;Download started...&amp;#39;, setTimeout(() =&amp;gt; {
                        b.classList.remove(&amp;#39;dwn&amp;#39;, &amp;#39;str&amp;#39;), l.disabled = !1
                    }, 3e3)
                }, 2e3)
            }, 1e3))
        }, 1e3)
    }), 
    null !== f &amp;amp;&amp;amp; f.addEventListener(&amp;#39;click&amp;#39;, () =&amp;gt; {
        var x = getSelection(),
            c = document.createRange();
        c.selectNodeContents(a), x.removeAllRanges(), x.addRange(c), document.execCommand(&amp;#39;copy&amp;#39;), x.removeAllRanges(), f.disabled = !0, b.classList.add(&amp;#39;cpd&amp;#39;), setTimeout(function() {
            b.classList.remove(&amp;#39;cpd&amp;#39;), f.disabled = !1
        }, 3e3)
    })
}})();
/*]]&amp;gt;*/&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;Vậy là xong, để chèn code vào bài viết thì bạn sử dụng cú pháp sau để hiển thị code:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;
&amp;lt;div class=&amp;#39;pre nb&amp;#39; data-text=&amp;#39;&lt;b&gt;typecode&lt;/b&gt;&amp;#39; data-file=&amp;#39;&lt;b&gt;filename&lt;/b&gt;&amp;#39; data-lang=&amp;#39;&lt;b&gt;fileformat&lt;/b&gt;&amp;#39; data-time=&amp;#39;&lt;b&gt;true&lt;/b&gt;&amp;#39; data-download=&amp;#39;&lt;b&gt;true&lt;/b&gt;&amp;#39; data-copy=&amp;#39;&lt;b&gt;true&lt;/b&gt;&amp;#39; data-view=&amp;#39;&lt;b&gt;true&lt;/b&gt;&amp;#39;&amp;gt;
  &amp;lt;pre&amp;gt;
      &amp;lt;!-- Code --&amp;gt;
  &amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Trong đó:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;data-text&lt;/code&gt; là loại code, ví dụ: CSS, HTML hoặc JavaScript&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;data-file&lt;/code&gt; là tên tải xuống của File&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;data-lang&lt;/code&gt; là format của file, ví dụ: .css, .js, .html, .txt&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;data-time&lt;/code&gt; là đếm ngược tải xuống &lt;code&gt;true or false&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;data-download&lt;/code&gt; là hiển thị nút tải xuống &lt;code&gt;true or false&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;data-copy&lt;/code&gt; là hiển thị nút copy &lt;code&gt;true or false&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;data-view&lt;/code&gt; là hiển thị nút preview &lt;code&gt;true or false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bạn có thể tham khảo công cụ &lt;a href=&quot;https://www.nldblog.com/p/html-converter.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;convert code HTML&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chúc các bạn thành công!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1158748748659182621/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/09/tao-khung-chua-code-co-nut-copy-va-download-code-dep-cho-blogger.html#comment-form' title='3 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1158748748659182621'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1158748748659182621'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/09/tao-khung-chua-code-co-nut-copy-va-download-code-dep-cho-blogger.html' title='Tạo khung chứa code có nút Copy và Download Code đẹp cho Blogger'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLX5Z16ZIwqJjdos6lQwUBX84gPY6qqE9yfQiEs3f7TsbydPPYB3-ldpCHSnju-nLBP34DfV0NSbQ3cS1habp3Nfe7X4UI7FXDMxLX6c1Ng4-pZMRcnkuyJhHJFn0muMhN3PM5gTvZSulKs-TCigrkFOA-ZO-19LocI0LR5MiBSYqnZWkUrfqAHdAC/s72-c-e30-rw/codebox-for-blogger.webp" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-4019110713744441884</id><published>2022-08-23T13:21:00.017+07:00</published><updated>2023-10-31T11:36:36.712+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger</title><content type='html'>&lt;p&gt;Bài viết này mình sẽ chia sẻ cho các bạn cách thêm hiệu ứng chờ tải trang hay còn gọi là preload cho blog hoặc trang web của các bạn. Bài viết này đặc biệt là hiệu ứng chờ tải trang có dạng cờ đỏ sao vàng và búa liềm nhằm mục đich hưởng ứng ngày lễ Quốc khánh Việt Nam ngày 2 tháng 9 và cũng có thể sử dụng cho ngày 30 tháng 4.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger&quot; title=&quot;Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger&quot; loading=&quot;lazy&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMaVUYi9bF6f_6D7tkwYuK2pLvbih46TOxf8RXaiLS6xz_LpwLYzBovBjMfCIoEIG41zzcKffGi3LpLokvNXvzKlEifXJl45csvZJVEjhTx3zOz6Oe1jT1pk2LWAypa-c3SjoISkKv9p3DW7zmdTxQZACckmVMjqVWCFiG-R9ROm-PxMDBmoLBNkxf/s600-rw-e30/Vietnam-flag-preloader-for-Blogger.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Hiệu ứng chờ tải trang thì cũng không có gì là mới mẻ cả và hiện nay rất nhiều trang web sử dụng. Mỗi trang đều sử dụng cho mục đích khác nhau mà một trong những nguyên do cần đưa hiệu ứng này vào là che đi phần khuyết điểm trong thời gian tải trang, bất kể thời gian tải bao lâu nếu thấy trang có hiện tượng bị giựt, bố cục hiển thị không đồng bộ ví dụ phần sau tải trước phần trước...&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger&quot; title=&quot;Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1910&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpjO0HuTdb_3BXrQu_o0cmhzFuAjQ6DBvgIfjnjd0EjmZsTKTANzTN_pGJhjCZJ0e0wCAJenZGD70FgEBuR25CEEcUJmyWmR875CD6OiafXjTsVCVTl-MzolOelXdd_kVYvWAXqHuBnKx5sq0Ru-tTwLZgO9b8QiWiKVT9KaTlyxUhm32Jfw1UcgLc/s600-rw-e30/Vietnam-flag.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cũng vậy mục đích đầu tiên là để tôn vinh ngày Quốc khánh Việt Nam cũng như những ngày lễ của dân tộc Việt Nam, mục đích còn lại là để che đi những khuyết điểm trong thời gian tải trang hiểu một cách đơn gian là nó sẽ che đi toàn bộ phần hiển thị của trang web và hiệu ứng sẽ ẩn đi khi toàn bộ trang web được tải xong. Thủ thuật này mình sẽ chỉ sử dụng HTML, CSS và JavaScript nên nó không ảnh hưởng gì nhiều đến tốc độ tải trang của blog hay trang web hiện tại nên các không phải băn khoăn.&lt;/p&gt;
&lt;h2&gt;Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Chèn đoạn CSS dưới đây vào vị trí lưu trữ CSS của bạn, đối với Blogger thì có thể là ở trong cặp thẻ &lt;code&gt;&amp;lt;b:skin&amp;gt;...&amp;lt;/b:skin&amp;gt;&lt;/code&gt; hoặc &lt;code&gt;&amp;lt;style&amp;gt;...&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;.pageLoading{z-index:999;position:fixed;top:-30%;right:-30%;bottom:-30%;left:-30%;display:flex;align-items:center;justify-content:center;background:#fff;transition:all .7s ease}
.pageLoading.done{visibility:hidden;opacity:0}
.pageLoadingC{position:absolute;display:block;background:#db2017;height:100%;width:100%;transition:all .7s ease}
.pageLoading svg{width:0;height:0;visibility:hidden;opacity:0;fill:#ffff00;transition:all .7s ease;z-index:1}
.pageLoading svg.beatAnimation{animation:beat 2.3s linear infinite}
.pageLoading svg.active{visibility:visible;opacity:1;width:60px;height:60px}
.pageLoading.loaded svg.active.starSvg{width:auto;height:15%}
.pageLoading.loaded svg.active.socialistSvg{width:auto;height:12%}
@keyframes beat{0%,50%,100%{transform:scale(1, 1)}30%,80%{transform:scale(0.72, 0.75)}}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Tiếp tục tìm đến thẻ &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; và chèn code HTML dưới đây ngay phía dưới thẻ &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; đó.&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div class=&amp;#39;pageLoading&amp;#39;&amp;gt;
  &amp;lt;div class=&amp;#39;pageLoadingC&amp;#39;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;svg class=&amp;#39;starSvg active beatAnimation&amp;#39; viewBox=&amp;#39;0 0 24 24&amp;#39; xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39;&amp;gt;&amp;lt;path d=&amp;#39;M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;
  &amp;lt;svg class=&amp;#39;socialistSvg&amp;#39; viewBox=&amp;#39;0 0 399.99 364.75&amp;#39; xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39;&amp;gt;&amp;lt;path class=&amp;#39;cls-1&amp;#39; d=&amp;#39;M395,323.33l-48.7-47c36.83-40,44.46-98.87,26-153-.05-.16-.11-.33-.17-.49q-.81-2.34-1.68-4.67c-.06-.18-.13-.36-.2-.54-1.26-3.35-2.64-6.68-4.11-10-.11-.25-.22-.51-.34-.76-.69-1.53-1.39-3-2.12-4.56l-.15-.32c-.8-1.64-1.62-3.29-2.47-4.92l-.27-.5c-.74-1.42-1.5-2.82-2.28-4.22l-.51-.92q-2.64-4.66-5.54-9.22l-.63-1q-1.2-1.84-2.45-3.68c-.21-.31-.41-.62-.63-.93-1-1.48-2.05-2.94-3.11-4.4l-.37-.49q-1.41-1.91-2.86-3.79l-.89-1.14q-1.39-1.77-2.83-3.52c-.2-.24-.39-.48-.59-.71-1.14-1.38-2.3-2.73-3.49-4.08l-.87-1q-1.41-1.58-2.85-3.12c-.35-.38-.69-.75-1-1.12-1.24-1.32-2.49-2.62-3.78-3.9-2.69-2.7-5.44-5.29-8.22-7.76C292.71,19.37,264.14,6,235.24,1,233.1.62,231,.29,228.81,0a2.09,2.09,0,0,0-.71,0,2,2,0,0,0-.6.25,2.07,2.07,0,0,0-.91,1.58,1.94,1.94,0,0,0,.83,1.72l.2.14.89.63,0,0c1.13.8,2.37,1.69,3.69,2.66h0C243.06,14.94,260,28,274.9,43c26.18,26.17,43.9,55.74,52.76,85l-.32-1c9.18,29.64,9.26,59-.21,84.09l0,.08a102.06,102.06,0,0,1-4.59,10.37c-.06.12-.12.24-.19.36-.48.94-1,1.86-1.49,2.78l-.4.71c-.47.83-1,1.65-1.45,2.47l-.44.72c-.57.91-1.15,1.82-1.75,2.72l-.2.31c-.68,1-1.38,2-2.1,3l-.4.54c-.58.78-1.16,1.55-1.75,2.31-.25.31-.49.62-.74.92-.51.64-1,1.27-1.56,1.9l-.51.6L186.61,122.3c19.91-20.67,36.2-38.68,42-45.17a2.87,2.87,0,0,0,.54-3,2.81,2.81,0,0,0-.7-1,2.73,2.73,0,0,0-.53-.4c-3.52-2.1-8-4.52-12.82-7-16.32-8.51-37.44-18.32-45-21.79a4.56,4.56,0,0,0-1.19-.37,5.69,5.69,0,0,0-.83-.07,4.72,4.72,0,0,0-1.34.19,5,5,0,0,0-.64.25,4.6,4.6,0,0,0-1.17.76C158.13,50.7,151.28,57,144.57,63.37c-1.8,1.72-3.61,3.43-5.39,5.15q-6.31,6.06-12.35,12c-5.16,5.1-10.15,10.11-14.85,14.91l-3.1,3.17c-14.8,15.18-26.59,27.91-32.6,34.49L74.61,135a4.8,4.8,0,0,0-.24,6.16c15.57,19.75,33.73,36.83,40.85,43.29a4.78,4.78,0,0,0,6.29.11c11.29-9.42,23.63-20.85,35.83-32.73L271.4,269.68c-22.8,10.44-47.88,12.08-72.69,6.23l-1.32-.32c-19.15-4.72-38.11-13.89-55.69-26.91l-2.8-2.11c-1.85-1.43-3.69-2.91-5.51-4.42-.91-.76-1.81-1.52-2.71-2.3q-5.42-4.68-10.58-9.84l-1.69-1.7-1-1-.69-.69c-.31-.31-.63-.6-1-.87s-.67-.52-1-.76a12.32,12.32,0,0,0-3.33-1.56A12.08,12.08,0,0,0,109,223q-.6-.06-1.2-.06a12.83,12.83,0,0,0-2.4.22,12.67,12.67,0,0,0-5.55,2.59c-.32.27-.64.55-1,.86L80.35,247.22a47.78,47.78,0,0,0-5.87-3.71c-.74-.39-1.47-.74-2.19-1a20.66,20.66,0,0,0-3.14-1.05c-.38-.1-.76-.17-1.13-.23a12.57,12.57,0,0,0-1.8-.17c-.31,0-.62,0-.92,0a8.62,8.62,0,0,0-5.66,2.61,8.8,8.8,0,0,0-.65.72c-.09.11-.18.24-.26.35l-.29.39c-.11.17-.21.35-.31.52s-.1.17-.14.25-.21.44-.31.67a.61.61,0,0,0,0,.12,5.92,5.92,0,0,0-.27.81h0c-.9,3.22,0,7.05,2.3,11.27a7.44,7.44,0,0,1,.87,3.75v0a7.55,7.55,0,0,1-.47,2.44h0a7.54,7.54,0,0,1-.73,1.48.35.35,0,0,1-.05.08c-.12.19-.25.37-.39.55l-.13.17-.39.44-.16.17c-.18.18-.38.36-.58.53l-49.72,38h0c-.53.47-1,1-1.52,1.47-.16.16-.3.34-.46.51-.31.35-.62.69-.9,1s-.33.43-.49.64-.49.67-.72,1-.3.47-.45.7-.4.67-.59,1-.27.5-.4.75-.33.68-.48,1-.23.51-.33.77-.27.7-.39,1.06-.18.5-.26.76-.21.78-.3,1.17c-.06.22-.13.44-.17.67-.12.58-.22,1.17-.29,1.75,0,.3,0,.59-.07.88s0,.63-.06.94,0,.63,0,.94,0,.57,0,.85.06.64.1,1,.07.53.11.8.12.64.19,1,.13.5.19.75.18.63.29.95.17.46.26.7.25.62.39.93.22.42.33.62a15.48,15.48,0,0,0,2.76,3.82l13.91,13.91c7.35,7.34,20.43,5.86,28.45-3.23l38.21-49.77a7.74,7.74,0,0,1,9.54-2.08c6.16,3.23,11.45,3.79,15,.2,4.6-4.6,2.43-12-3.46-20.37l5.57-4.59a4.15,4.15,0,0,1,5.57.26l.82.83c55.09,55.08,129.06,69.6,189,36.84l51.23,52.95c6.59,6.82,17.77,6.63,24.83-.42l11.17-11.18C401.62,341.11,401.81,329.93,395,323.33Z&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Tìm đến thẻ đóng &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; và chèn đoạn JavaScript dưới đây ngay phía trên nó.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;/*&amp;lt;![CDATA[*/ 
  document.querySelector(&amp;quot;html&amp;quot;).style.overflow = &amp;quot;hidden&amp;quot;
  document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, () =&amp;gt; {
    setTimeout(() =&amp;gt; {
    var pageLoading = document.querySelector(&amp;quot;.pageLoading&amp;quot;),
    svg1 = document.querySelector(&amp;quot;svg.starSvg&amp;quot;),
    svg2 = document.querySelector(&amp;quot;svg.socialistSvg&amp;quot;);
    svg1.classList.remove(&amp;quot;beatAnimation&amp;quot;), pageLoading.classList.add(&amp;quot;loaded&amp;quot;), setTimeout(() =&amp;gt; { 
      svg1.classList.remove(&amp;quot;active&amp;quot;), svg2.classList.add(&amp;quot;active&amp;quot;), setTimeout(() =&amp;gt; {
          pageLoading.classList.add(&amp;quot;done&amp;quot;), pageLoading.addEventListener(&amp;quot;transitionend&amp;quot;, () =&amp;gt; {
          	document.querySelector(&amp;quot;html&amp;quot;).style.overflow = &amp;quot;auto&amp;quot;
          	pageLoading.remove()
          })
        }, 2e3)
      }, 2e3)
    }, 2e3)
  });
/*]]&amp;gt;*/&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;Vậy là xong, mình đã hướng dẫn các bạn &lt;a href=&quot;https://www.nldblog.com/2022/08/them-hieu-ung-cho-tai-trang-co-do-sao-vang-viet-nam-cho-blogger.html&quot;&gt;cách thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger&lt;/a&gt;, demo các bạn có thể tại lại trang bài viết này để xem. Nếu bạn thấy bài viết hay và hữu ích hãy chia sẻ bài viết về trang Facebook cá nhân để lưu lại nhé. Chúc các bạn vui vẻ!&lt;/p&gt;
&lt;style&gt;/*&lt;![CDATA*/
  .pageLoading{display:none}
  .preLoader{z-index:1000;position:fixed;top:-30%;right:-30%;bottom:-30%;left:-30%;display:flex;align-items:center;justify-content:center;background:#fff;transition:all .7s ease}
  .preLoader.done{visibility:hidden;opacity:0}
  .preLoaderC{position:absolute;display:block;background:#db2017;height:100%;width:100%;transition:all .7s ease}
  .preLoader svg{width:0;height:0;visibility:hidden;opacity:0;fill:#ffff00;transition:all .7s ease;z-index:1}
  .preLoader svg.beatAnimation{animation:beat 2.3s linear infinite}
  .preLoader svg.active{visibility:visible;opacity:1;width:60px;height:60px}
  .preLoader.loaded svg.active.starSvg{width:auto;height:10%}
  .preLoader.loaded svg.active.socialistSvg{width:auto;height:8%}
  @keyframes beat{0%,50%,100%{transform:scale(1, 1)}30%,80%{transform:scale(0.72, 0.75)}}
/*]]&gt;*/&lt;/style&gt;
&lt;div class=&#39;preLoader&#39;&gt;
  &lt;div class=&#39;preLoaderC&#39;&gt;&lt;/div&gt;
  &lt;svg class=&#39;starSvg active beatAnimation&#39; viewBox=&#39;0 0 24 24&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt;&lt;path d=&#39;M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z&#39;/&gt;&lt;/svg&gt;
  &lt;svg class=&#39;socialistSvg&#39; viewBox=&#39;0 0 399.99 364.75&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt;&lt;path class=&#39;cls-1&#39; d=&#39;M395,323.33l-48.7-47c36.83-40,44.46-98.87,26-153-.05-.16-.11-.33-.17-.49q-.81-2.34-1.68-4.67c-.06-.18-.13-.36-.2-.54-1.26-3.35-2.64-6.68-4.11-10-.11-.25-.22-.51-.34-.76-.69-1.53-1.39-3-2.12-4.56l-.15-.32c-.8-1.64-1.62-3.29-2.47-4.92l-.27-.5c-.74-1.42-1.5-2.82-2.28-4.22l-.51-.92q-2.64-4.66-5.54-9.22l-.63-1q-1.2-1.84-2.45-3.68c-.21-.31-.41-.62-.63-.93-1-1.48-2.05-2.94-3.11-4.4l-.37-.49q-1.41-1.91-2.86-3.79l-.89-1.14q-1.39-1.77-2.83-3.52c-.2-.24-.39-.48-.59-.71-1.14-1.38-2.3-2.73-3.49-4.08l-.87-1q-1.41-1.58-2.85-3.12c-.35-.38-.69-.75-1-1.12-1.24-1.32-2.49-2.62-3.78-3.9-2.69-2.7-5.44-5.29-8.22-7.76C292.71,19.37,264.14,6,235.24,1,233.1.62,231,.29,228.81,0a2.09,2.09,0,0,0-.71,0,2,2,0,0,0-.6.25,2.07,2.07,0,0,0-.91,1.58,1.94,1.94,0,0,0,.83,1.72l.2.14.89.63,0,0c1.13.8,2.37,1.69,3.69,2.66h0C243.06,14.94,260,28,274.9,43c26.18,26.17,43.9,55.74,52.76,85l-.32-1c9.18,29.64,9.26,59-.21,84.09l0,.08a102.06,102.06,0,0,1-4.59,10.37c-.06.12-.12.24-.19.36-.48.94-1,1.86-1.49,2.78l-.4.71c-.47.83-1,1.65-1.45,2.47l-.44.72c-.57.91-1.15,1.82-1.75,2.72l-.2.31c-.68,1-1.38,2-2.1,3l-.4.54c-.58.78-1.16,1.55-1.75,2.31-.25.31-.49.62-.74.92-.51.64-1,1.27-1.56,1.9l-.51.6L186.61,122.3c19.91-20.67,36.2-38.68,42-45.17a2.87,2.87,0,0,0,.54-3,2.81,2.81,0,0,0-.7-1,2.73,2.73,0,0,0-.53-.4c-3.52-2.1-8-4.52-12.82-7-16.32-8.51-37.44-18.32-45-21.79a4.56,4.56,0,0,0-1.19-.37,5.69,5.69,0,0,0-.83-.07,4.72,4.72,0,0,0-1.34.19,5,5,0,0,0-.64.25,4.6,4.6,0,0,0-1.17.76C158.13,50.7,151.28,57,144.57,63.37c-1.8,1.72-3.61,3.43-5.39,5.15q-6.31,6.06-12.35,12c-5.16,5.1-10.15,10.11-14.85,14.91l-3.1,3.17c-14.8,15.18-26.59,27.91-32.6,34.49L74.61,135a4.8,4.8,0,0,0-.24,6.16c15.57,19.75,33.73,36.83,40.85,43.29a4.78,4.78,0,0,0,6.29.11c11.29-9.42,23.63-20.85,35.83-32.73L271.4,269.68c-22.8,10.44-47.88,12.08-72.69,6.23l-1.32-.32c-19.15-4.72-38.11-13.89-55.69-26.91l-2.8-2.11c-1.85-1.43-3.69-2.91-5.51-4.42-.91-.76-1.81-1.52-2.71-2.3q-5.42-4.68-10.58-9.84l-1.69-1.7-1-1-.69-.69c-.31-.31-.63-.6-1-.87s-.67-.52-1-.76a12.32,12.32,0,0,0-3.33-1.56A12.08,12.08,0,0,0,109,223q-.6-.06-1.2-.06a12.83,12.83,0,0,0-2.4.22,12.67,12.67,0,0,0-5.55,2.59c-.32.27-.64.55-1,.86L80.35,247.22a47.78,47.78,0,0,0-5.87-3.71c-.74-.39-1.47-.74-2.19-1a20.66,20.66,0,0,0-3.14-1.05c-.38-.1-.76-.17-1.13-.23a12.57,12.57,0,0,0-1.8-.17c-.31,0-.62,0-.92,0a8.62,8.62,0,0,0-5.66,2.61,8.8,8.8,0,0,0-.65.72c-.09.11-.18.24-.26.35l-.29.39c-.11.17-.21.35-.31.52s-.1.17-.14.25-.21.44-.31.67a.61.61,0,0,0,0,.12,5.92,5.92,0,0,0-.27.81h0c-.9,3.22,0,7.05,2.3,11.27a7.44,7.44,0,0,1,.87,3.75v0a7.55,7.55,0,0,1-.47,2.44h0a7.54,7.54,0,0,1-.73,1.48.35.35,0,0,1-.05.08c-.12.19-.25.37-.39.55l-.13.17-.39.44-.16.17c-.18.18-.38.36-.58.53l-49.72,38h0c-.53.47-1,1-1.52,1.47-.16.16-.3.34-.46.51-.31.35-.62.69-.9,1s-.33.43-.49.64-.49.67-.72,1-.3.47-.45.7-.4.67-.59,1-.27.5-.4.75-.33.68-.48,1-.23.51-.33.77-.27.7-.39,1.06-.18.5-.26.76-.21.78-.3,1.17c-.06.22-.13.44-.17.67-.12.58-.22,1.17-.29,1.75,0,.3,0,.59-.07.88s0,.63-.06.94,0,.63,0,.94,0,.57,0,.85.06.64.1,1,.07.53.11.8.12.64.19,1,.13.5.19.75.18.63.29.95.17.46.26.7.25.62.39.93.22.42.33.62a15.48,15.48,0,0,0,2.76,3.82l13.91,13.91c7.35,7.34,20.43,5.86,28.45-3.23l38.21-49.77a7.74,7.74,0,0,1,9.54-2.08c6.16,3.23,11.45,3.79,15,.2,4.6-4.6,2.43-12-3.46-20.37l5.57-4.59a4.15,4.15,0,0,1,5.57.26l.82.83c55.09,55.08,129.06,69.6,189,36.84l51.23,52.95c6.59,6.82,17.77,6.63,24.83-.42l11.17-11.18C401.62,341.11,401.81,329.93,395,323.33Z&#39;/&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;script&gt;/*&lt;![CDATA[*/
  document.querySelector(&quot;html&quot;).style.overflow = &quot;hidden&quot;
  document.addEventListener(&quot;DOMContentLoaded&quot;, () =&gt; {
    setTimeout(() =&gt; {
      var pageLoading = document.querySelector(&quot;.preLoader&quot;),
          svg1 = document.querySelector(&quot;svg.starSvg&quot;),
          svg2 = document.querySelector(&quot;svg.socialistSvg&quot;);
      svg1.classList.remove(&quot;beatAnimation&quot;), pageLoading.classList.add(&quot;loaded&quot;), setTimeout(() =&gt; { 
        svg1.classList.remove(&quot;active&quot;), svg2.classList.add(&quot;active&quot;), setTimeout(() =&gt; {
          pageLoading.classList.add(&quot;done&quot;), pageLoading.addEventListener(&quot;transitionend&quot;, () =&gt; {
            document.querySelector(&quot;html&quot;).style.overflow = &quot;auto&quot;
            pageLoading.remove()
          })
        }, 3e3)
      }, 3e3)
    }, 2e3)
  });
/*]]&gt;*/&lt;/script&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/4019110713744441884/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/08/them-hieu-ung-cho-tai-trang-co-do-sao-vang-viet-nam-cho-blogger.html#comment-form' title='1 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4019110713744441884'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4019110713744441884'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/08/them-hieu-ung-cho-tai-trang-co-do-sao-vang-viet-nam-cho-blogger.html' title='Thêm hiệu ứng chờ tải trang cờ đỏ sao vàng Việt Nam cho Blogger'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMaVUYi9bF6f_6D7tkwYuK2pLvbih46TOxf8RXaiLS6xz_LpwLYzBovBjMfCIoEIG41zzcKffGi3LpLokvNXvzKlEifXJl45csvZJVEjhTx3zOz6Oe1jT1pk2LWAypa-c3SjoISkKv9p3DW7zmdTxQZACckmVMjqVWCFiG-R9ROm-PxMDBmoLBNkxf/s72-c-e30-rw/Vietnam-flag-preloader-for-Blogger.webp" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-8585036052447673509</id><published>2022-08-17T14:02:00.034+07:00</published><updated>2023-10-31T11:36:36.713+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách tạo License Key cho template Blogger sử dụng JavaScript</title><content type='html'>&lt;p&gt;Gần đây các bạn có thể thấy trên Blog mình đã chia sẻ một vài template mà họ đã sử dụng license key để kích hoạt đúng không? Ví dụ như &lt;a href=&quot;https://www.nldblog.com/2022/07/plus-ui-responsive-blogger-template-premium-license-free-download.html&quot; target=&quot;_blank&quot;&gt;Plus UI v2.6.1&lt;/a&gt; hay &lt;a href=&quot;https://www.nldblog.com/2022/08/apmody-premium-blogger-template-free-download-premium-license-key.html&quot; target=&quot;_blank&quot;&gt;Apmody v1.4&lt;/a&gt; chẳng hạn tuy 2 template đã mã hoá JavaScript mình vẫn chưa biết cách giải nhưng mình biết đoạn mã JavaScript để kích hoạt license key ở đâu nên mình đã thay nó bằng đoạn mã khác cũng tương tự.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img class=&quot;lazyload&quot; loading=&quot;lazy&quot; alt=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; title=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjikguycwPK9dH2C2xbCmQbWWjtFOrAnPFvBuHJbU2YYZ6vU_FtcUokk1MVfbrNmn7Ir2zEE6XY-bzl5ERA0UH1YQGLS_6lLO_i3LjWMzp_vxiqyfAJOMjs53DjesCKAwTDFUYnU8QPoH_XeJ0F-Hp6DL2MtAphceUSbXyDF63TgBfanzIkaLcBpNcH/s1600-rw-e30/blogger-license-key.webp&quot; data-src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjikguycwPK9dH2C2xbCmQbWWjtFOrAnPFvBuHJbU2YYZ6vU_FtcUokk1MVfbrNmn7Ir2zEE6XY-bzl5ERA0UH1YQGLS_6lLO_i3LjWMzp_vxiqyfAJOMjs53DjesCKAwTDFUYnU8QPoH_XeJ0F-Hp6DL2MtAphceUSbXyDF63TgBfanzIkaLcBpNcH/s1600-rw-e30/blogger-license-key.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Và trong bài viết này mình sẽ chia sẻ cho các bạn đoạn mã JavaScript để kích hoạt license key cho template Blogger và cách lưu trữ license key.&lt;/p&gt;
&lt;h2&gt;Cách hoạt động của License Key&lt;/h2&gt;
&lt;p&gt;Cách hoạt động của nó thì rất đơn giản rằng các bạn sẽ lưu thông tin để tạo License Key trên Google Script để tăng tính bảo mật và từ thông tin đó mình sẽ chuyển nó sang dạng mã hoá Base64 kiểu như này &lt;code&gt;dFu5d8WerUWerZN3OHf=&lt;/code&gt;. Nó cũng có thể sử dụng tương tự viết Github nhưng nó sẽ rất dễ bị người khác biết và thay đổi. License Key sẽ do các bạn tuỳ ý quản lý và mỗi License Key chỉ sử dụng được trên 1 Blog cố định.&lt;/p&gt;
&lt;h2&gt;Cách tạo Google Script chứa thông tin License Key&lt;/h2&gt;
&lt;p&gt;Có 2 cách để tạo Google Script chứa thông tin License Key nhưng mình sẽ hướng dẫn các bạn cách nhanh nhất mà mình đã dùng.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Truy cập &lt;a href=&quot;https://script.google.com/home&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://script.google.com/home&lt;/a&gt; và chọn &lt;b&gt;New project&lt;/b&gt;.&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img class=&quot;lazyload&quot; loading=&quot;lazy&quot; alt=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; title=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;729&quot; data-original-width=&quot;1366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_I2Wbqf0qYu9TZqrhXAbYzw1M1w7iSn43NN3dKLoYT-fMOzbUCC1HduN4u1nwq76hZPHvzfz4_XyeFlWIE3saWiTt-x2HV5hngC80imE4RHPhM9Z-Hr13qbaUksuBmObmqz09WHNa55NPeSdLkXoZXCQEDNiDyDeUAhd02BbXAQyFjpnt-PA7xT_Z/s100-rw-e30/Google-Script-b1.webp&quot; data-src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_I2Wbqf0qYu9TZqrhXAbYzw1M1w7iSn43NN3dKLoYT-fMOzbUCC1HduN4u1nwq76hZPHvzfz4_XyeFlWIE3saWiTt-x2HV5hngC80imE4RHPhM9Z-Hr13qbaUksuBmObmqz09WHNa55NPeSdLkXoZXCQEDNiDyDeUAhd02BbXAQyFjpnt-PA7xT_Z/s1600-rw-e30/Google-Script-b1.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Đặt tên cho project của bạn và thay thế toàn bộ đoạn mã có sẵn bằng đoạn mã sau:&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;function doGet() {
  var nldblog = ContentService.createTextOutput();
  nldblog.append(&#39;{&quot;user&quot;:[{&quot;no&quot;:0,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:1,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:2,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:3,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:4,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:5,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:6,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:7,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:8,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:9,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;},{&quot;no&quot;:10,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;}]}&#39;);
  return nldblog;
}&lt;/pre&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img class=&quot;lazyload&quot; loading=&quot;lazy&quot; alt=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; title=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglVQwzt5Lot21YzFXLPcOInaCn_RDvkCcRJuSd1sHZvaQ-O2vYj9b0sn-VmMtEwHMzuX0X_7YrA1T0DbScC-nhm4C3CfrARmGAL5gznaY6gBbg36VpIzMDH4GMQ3T57vxoYSd1THHzhuoGAdQw_s1RSjrcKYl4N5Ll0RsQlzw2MHOBzEu2uyNIiSkI/s100-rw-e30/Google-Script-b2.webp&quot; data-src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglVQwzt5Lot21YzFXLPcOInaCn_RDvkCcRJuSd1sHZvaQ-O2vYj9b0sn-VmMtEwHMzuX0X_7YrA1T0DbScC-nhm4C3CfrARmGAL5gznaY6gBbg36VpIzMDH4GMQ3T57vxoYSd1THHzhuoGAdQw_s1RSjrcKYl4N5Ll0RsQlzw2MHOBzEu2uyNIiSkI/s1600-rw-e30/Google-Script-b2.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Với mỗi License Key sẽ là 1 object bao gồm như sau:&lt;/p&gt;
&lt;blockquote&gt;{&quot;no&quot;:0,&quot;name&quot;:&quot;&quot;,&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;code&quot;:&quot;&quot;}&lt;/blockquote&gt;
&lt;p&gt;Trong đó &lt;code&gt;no&lt;/code&gt; là số thứ tự, &lt;code&gt;url&lt;/code&gt; là url của blog kích hoạt key, &lt;code&gt;id&lt;/code&gt; là id của blog kích hoạt key, &lt;code&gt;code&lt;/code&gt; đây sẽ là thông tin để tạo license key. Ví dụ 1 object như sau:&lt;/p&gt;
&lt;blockquote&gt;{&quot;no&quot;:0,&quot;name&quot;:&quot;NLD Blog&quot;,&quot;url&quot;:&quot;www.nldblog.com&quot;,&quot;id&quot;:&quot;6311614170532925167&quot;,&quot;code&quot;:&quot;nldblogcode&quot;}&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Sau đó các bạn chọn Deploy và chọn tiếp New deployment. Một popup sẽ hiện lên và tại cột &lt;b&gt;Select type&lt;/b&gt; các bạn chọn vào hình bánh răng cưa và chọn &lt;b&gt;Web app&lt;/b&gt;. Tại cột &lt;b&gt;Configuration&lt;/b&gt; các bạn để như sau:&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img class=&quot;lazyload&quot; loading=&quot;lazy&quot; alt=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; title=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmfY5syvbst9WSMeVLUfU_2gdZnB4q86zhdjz5VYWDbSSajC5vqEPoRyeORwLCUdGFEusJs4duAUXgo-5f5qg0j300v297uSFiOr6rt6bVMNPZAGnAy2DqSknnUYjOzrY9j5uKE8ViY4-rrUwh8ZpHlyVG5BD1ybSzmMhdKpRqNAIG8Vm21kEME-q/s100-rw-e30/Google-Script-b4.webp&quot; data-src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmfY5syvbst9WSMeVLUfU_2gdZnB4q86zhdjz5VYWDbSSajC5vqEPoRyeORwLCUdGFEusJs4duAUXgo-5f5qg0j300v297uSFiOr6rt6bVMNPZAGnAy2DqSknnUYjOzrY9j5uKE8ViY4-rrUwh8ZpHlyVG5BD1ybSzmMhdKpRqNAIG8Vm21kEME-q/s1600-rw-e30/Google-Script-b4.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Xong các bạn chọn &lt;b&gt;Deloy&lt;/b&gt;. Tiếp theo sẽ hiện URL của Web app các bạn hãy lưu lại vào notepad hay đâu đó.&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img class=&quot;lazyload&quot; loading=&quot;lazy&quot; alt=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; title=&quot;Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1080&quot; data-original-width=&quot;1920&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEztLR8Rbfhiy9pyv-A9cdSsIOXyz-0GgUnS6X8AnuC2dZ_dKmI5ROWVlo6cjjk3oNiq_zbXgPieeCCySEf8MNHNTBknItbcVciLnx_BLEo0xMLV303jfCtWoEkQC25vZZD6-p8BJq802nKgDj7wZLD1XYzZWXUZcZQgEZUcj657fP-b9KKAED5lmK/s100-rw-e30/Google-Script-b5.webp&quot; data-src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEztLR8Rbfhiy9pyv-A9cdSsIOXyz-0GgUnS6X8AnuC2dZ_dKmI5ROWVlo6cjjk3oNiq_zbXgPieeCCySEf8MNHNTBknItbcVciLnx_BLEo0xMLV303jfCtWoEkQC25vZZD6-p8BJq802nKgDj7wZLD1XYzZWXUZcZQgEZUcj657fP-b9KKAED5lmK/s1600-rw-e30/Google-Script-b5.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Để thêm 1 object thông tin license key mới các bạn thêm hoặc sửa 1 object tương tự như trên và tại bước 3 các bạn chọn &lt;b&gt;Deply&lt;/b&gt; và sau đó chọn &lt;b&gt;Manage deployments&lt;/b&gt;. Tiếp đó 1 popup hiện nên tại cột &lt;b&gt;Configuration&lt;/b&gt; các bạn chọn &lt;b&gt;hình cây bút (Edit)&lt;/b&gt; sau đó tại mục &lt;b&gt;Version&lt;/b&gt; các bạn chọn &lt;b&gt;New version&lt;/b&gt; và bấm &lt;b&gt;Deploy&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Vậy là xong phần Google Script.&lt;/p&gt;
&lt;h2&gt;Thêm code JavaScipt kiểm tra giấy phép vào template&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Các bạn thêm đoạn code dưới đây vào sau thẻ &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;script&amp;gt;&amp;lt;b:eval expr=&amp;#39;&amp;amp;quot;const blogID=&amp;amp;apos;&amp;amp;quot; + data:blog.blogId + &amp;amp;quot;&amp;amp;apos;;&amp;amp;quot;&amp;#39;/&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;Bước 2: Tiếp tục thêm đoạn code dưới đây vào phía trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;pre&quot; data-text=&quot;.html&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;language-xml&quot;&gt;//&amp;lt;![CDATA[
    var licensekey = &amp;quot;&lt;mark&gt;licensekey&lt;/mark&gt;&amp;quot;;
//]]&amp;gt;&lt;/span&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Đoạn code này sẽ public để nhận license key và &lt;b&gt;licensekey&lt;/b&gt; ở đây sẽ thay thế bằng &lt;b&gt;License Key&lt;/b&gt; các bạn tạo.&lt;/p&gt;
&lt;p&gt;Bước 3: Thêm tiếp đoạn code dưới đây ngay phía dưới đoạn code vừa thêm ở bước 2.&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
    var e, s = &amp;quot;&lt;mark&gt;https://www.nldblog.com&lt;/mark&gt;&amp;quot;;
    function o() {
        window.alert(&amp;quot;Invalid License Key&amp;quot;), document.body.innerHTML = &amp;quot;&amp;quot;, window.location.href = s
    }
    try {
        e = atob(licensekey)
    } catch (e) {
        try {
            o()
        } catch (e) {
            window.location.href = s
        }
    }
    var n = e.split(&amp;quot;-&amp;quot;),
        l = n[0];
    if (void 0 === (n = n[1])) try {
        o()
    } catch (e) {
        window.location.href = s
    }
    str = [n], getAJ({
        url: &amp;quot;&lt;mark&gt;Web app URL&lt;/mark&gt;&amp;quot;,
        async: !0,
        success: function (e) {
            var n = JSON.parse(e).user[str];
            if (void 0 === n) try {
                o()
            } catch (e) {
                window.location.href = s
            }
            var u = n.id,
                d = n.code,
                a = n.url;
            try {
                if (blogID + l === u + d &amp;amp;&amp;amp; 0 != function (e) {
                        if (-1 == window.location.pathname.indexOf(&amp;quot;/b/preview&amp;quot;) &amp;amp;&amp;amp; -1 == window.location.pathname.indexOf(&amp;quot;/b/blog-preview&amp;quot;)) return e == window.location.hostname
                    }(a)) return void console.log(&amp;#39;Licensed to: &amp;#39; + n.name + &amp;#39;, Licensed for: &amp;#39; + n.url);
                try {
                    o()
                } catch (e) {
                    window.location.href = s
                }
            } catch (e) {
                try {
                    o()
                } catch (e) {
                    window.location.href = s
                }
            }
        }
    })
    function getAJ(e) {
        var r = new XMLHttpRequest;
        try {
            r = new XMLHttpRequest
        } catch (t) {
            try {
                r = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;)
            } catch (t) {
                try {
                    r = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;)
                } catch (t) {
                    return console.warn(&amp;quot;Something went wrong!&amp;quot;), !1
                }
            }
        }
        r.onreadystatechange = function () {
            var n;
            4 == r.readyState &amp;amp;&amp;amp; (200 == r.status ? (n = r.responseText, e.success(n)) : &amp;quot;function&amp;quot; == typeof e.error &amp;amp;&amp;amp; e.error(r))
        }, r.open(&amp;quot;GET&amp;quot;, e.url, e.async), r.send()
    }
//]]&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;Thay &lt;code&gt;https://www.nldblog.com&lt;/code&gt; bằng URL sẽ chuyển hướng khi sai License Key và &lt;code&gt;Web app URL&lt;/code&gt; bằng Web app URL mà mình đã bảo các bạn lưu lại vào notepad ở phần trước.&lt;/p&gt;
&lt;p&gt;Và để tăng thêm bảo mật thì các bạn nên mã hoá đoạn JavaScript ở bên trong thẻ &lt;code&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[ ... //]]&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; bằng một số công cụ sau hoặc tuỳ cách hoá của các bạn.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cleancss.com/javascript-obfuscate/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://www.cleancss.com/javascript-obfuscate&lt;/a&gt; hoặc &lt;a href=&quot;https://javascriptobfuscator.com/Javascript-Obfuscator.aspx&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://javascriptobfuscator.com/Javascript-Obfuscator.aspx&lt;/a&gt; các bạn có thể mã hoá nhiều lần để bảo mật cao hơn.&lt;/p&gt;
&lt;p&gt;Vậy là xong, tiếp theo là cách để các bạn lấy License Key dạng mã base64.&lt;/p&gt;
&lt;h2&gt;Các tạo License Key&lt;/h2&gt;
&lt;p&gt;Ở phần &lt;b&gt;Cách tạo Google Script chứa thông tin License Key&lt;/b&gt; thì mình đã nói một object gồm những thông tin như sau:&lt;/p&gt;
&lt;blockquote&gt;{&quot;no&quot;:0,&quot;name&quot;:&quot;NLD Blog&quot;,&quot;url&quot;:&quot;www.nldblog.com&quot;,&quot;id&quot;:&quot;6311614170532925167&quot;,&quot;code&quot;:&quot;nldblogcode&quot;}&lt;/blockquote&gt;
&lt;p&gt;Thì ở đây License Key sẽ có cấu trúc bao gồm &lt;b&gt;code-no&lt;/b&gt; ví dụ object ở trên License Key của mình sẽ là &lt;b&gt;nldblogcode-0&lt;/b&gt; chuyển sang dạng base64 nó sẽ thành &lt;b&gt;bmxkYmxvZ2NvZGUtMA==&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Để chuyển License Key sang dạng base64 thì các bạn sử dụng công cụ sau &lt;a href=&quot;https://www.nldblog.com/p/base64-converter.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Base64 Converter&lt;/a&gt; dán License Key dạng &lt;b&gt;code-no&lt;/b&gt; vào và bấm &lt;b&gt;Encode&lt;/b&gt; lúc này bạn sẽ nhận được 1 đoạn mã dạng base64. Để dịch ngược thì các bạn là tương tự rồi bấm &lt;b&gt;Decode&lt;/b&gt;.&lt;/p&gt;
&lt;h2&gt;Kết luận&lt;/h2&gt;
&lt;p&gt;Vậy là xong, mình vừa hướng dẫn các bạn Cách tạo License Key cho template Blogger sử dụng JavaScript đơn giản để giúp bảo vệ template của các bạn khi bị người khác rip hoặc bán để tránh bị chia sẻ template. Nếu có vấn đề hay thắc mắc gì thì các bạn hãy comment xuống phía dưới mình sẽ giải đáp nếu có thể.&lt;/p&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/8585036052447673509/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/08/cach-tao-license-key-cho-template-blogger-su-dung-javascript.html#comment-form' title='9 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/8585036052447673509'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/8585036052447673509'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/08/cach-tao-license-key-cho-template-blogger-su-dung-javascript.html' title='Cách tạo License Key cho template Blogger sử dụng JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjikguycwPK9dH2C2xbCmQbWWjtFOrAnPFvBuHJbU2YYZ6vU_FtcUokk1MVfbrNmn7Ir2zEE6XY-bzl5ERA0UH1YQGLS_6lLO_i3LjWMzp_vxiqyfAJOMjs53DjesCKAwTDFUYnU8QPoH_XeJ0F-Hp6DL2MtAphceUSbXyDF63TgBfanzIkaLcBpNcH/s72-c-e30-rw/blogger-license-key.webp" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1952039364801274903</id><published>2022-08-11T15:46:00.010+07:00</published><updated>2023-10-31T11:36:36.710+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="google-adsense"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách chặn Click Tặc, Spam Click Google Adsense cho Blogger</title><content type='html'>&lt;p&gt;Chắc hẳn các bạn làm Blog cũng như Website ít nhiều đã và đang sử dụng Google Adsense để kiếm tiền, có một thuật ngữ chắc hẳn các bạn cũng không còn xa lạ đó là nhấp chuột không hợp lệ, nhấp chuột liên tiếp hay còn gọi là click tặc. Đây là có thể là một hoạt động có thể nói là phá hoại không đúng và gây bất lợi cho các nhà xuất bản.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách chặn Click Tặc, Spam Click Google Adsense cho Blogger&quot; title=&quot;Cách chặn Click Tặc, Spam Click Google Adsense cho Blogger&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUU4tl-0l4z4SiGaHaWR3gyukfIoiO3NBeShNu4s7bUOgyGFYOZNuKmUWoKfEqg_6PSXzxQOLDxR2H2GGh-iiXvuDM1X-NTLfQb9ypgnIj-dtroK10yW_x5AZtNXwCUwDWuF7Pp6MLdsJqhlqRncyWsZUVR7Q0v76UZgVSkBqaWMwColC3zHXo54eb/s600-rw-e30/anti-bom-click-google-adsense-for-blogger-nldblog.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Việc nhấp chuột liên tiếp vào một quảng cáo Adsense có tác động và là mối quan tâm của các nhà xuất bản về tính bảo mật của tài khoản Google Adsense. Khi nhấp chuật liên tiếp như vậy Google Adsense hiểu rằng bạn đang Spam nhằm mục đích chuộc lợi từ quảng cáo, trong một số trường hợp Google cũng hiểu rằng bạn đang bị phá, bị click tặc spam, bom click và Google Adsense sẽ xoá những lượt nhấp đó nhưng nó cũng ít nhiều ảnh hưởng đến Blog cũng như tài khoản của các bạn, để hạn chế tối đa việc đó thì việc thêm một đoạn Code để chặn Click Tặc, Spam Click là được khuyến khích để giảm thiểu ảnh hưởng.&lt;/p&gt;
&lt;h2&gt;Click tặc là gì?&lt;/h2&gt;
&lt;p&gt;Có thể các bạn không hiểu Click Tặc là gì đúng không?&lt;/p&gt;
&lt;p&gt;Theo Google định nghĩa: Click tặc là những click không tạo ra giá trị cho nhà quảng cáo, hay còn gọi là click không hợp lệ. Click không hợp lệ bao gồm click tặc (click có chủ ý) và click vô tình (click không có chủ ý).&lt;/p&gt;
&lt;p&gt;Click tặc là những click không đến từ những người thực sự tìm kiếm từ khóa mà có thể đến từ bot hoặc đối thủ. Đây được xem là hành động “chơi bẩn” của các đối thủ cùng với sự cạnh tranh không lành mạnh, nhằm thiêu đốt tiền quảng cáo của đối thủ để chiếm vị trí trong Adwords.&lt;/p&gt;
&lt;h2&gt;Cài đặt chặn Click Tặc, Spam Click Google Adsense&lt;/h2&gt;
&lt;p&gt;Các bạn vào Trang tổng quan Blogger &amp;gt; Nhấp vào menu &lt;b&gt;Chủ đề&lt;/b&gt; &amp;gt; &lt;b&gt;Chỉnh sửa HTML&lt;/b&gt; &amp;gt; Thêm đoạn CSS dưới đây vào trước thẻ &lt;code&gt;]]&amp;gt;&amp;lt;/b:skin&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;.disabled{pointer-events:none}.hidden{display:none}&lt;/pre&gt;
&lt;p&gt;Tiếp theo, các bạn tìm đến thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; và chèn đoạn Code dưới đây vào phía trên nó.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
	var disableAds = &amp;quot;&lt;mark&gt;disabled&lt;/mark&gt;&amp;quot;; //Thay bằng hidden để ẩn toàn bộ quảng cáo, disabled để vô hiệu hoá click
	var maxClick = &lt;mark&gt;3&lt;/mark&gt;; //Số lượt click tối đa khi vượt quá sẽ ẩn hoặc chặn click quảng cáo
	var adsCookieEx = &lt;mark&gt;1&lt;/mark&gt;; //Cài đặt từ 1-24, thời gian người dùng được click trở lại
	function setCookie(a, b, c) {
	    if (c) {
	        var d = new Date();
	        d.setTime(d.getTime() + adsCookieEx * 3600 * 1000);
	        var e = &amp;quot;;expires=&amp;quot; + d.toGMTString()
	    } else {
	        var e = &amp;quot;&amp;quot;
	    }
	    document.cookie = a + &amp;quot;=&amp;quot; + b + e + &amp;quot;;path=/&amp;quot;
	}
	function getCookie(a) {
	    var b, c, d, e = document.cookie.split(&amp;quot;;&amp;quot;);
	    for (b = 0; b &amp;lt; e.length; b++)
	        if (c = e[b].substr(0, e[b].indexOf(&amp;quot;=&amp;quot;)), d = e[b].substr(e[b].indexOf(&amp;quot;=&amp;quot;) + 1), c = c.replace(/^\s+|\s+$/g, &amp;quot;&amp;quot;), c == a) return unescape(d)
	}
	function setCookieAds(a, b) {
	    var c = getCookie(a);
	    void 0 != c &amp;amp;&amp;amp; &amp;quot;&amp;quot; != c ? (ASTheCookieInt = parseInt(c) + 1, setCookie(a, ASTheCookieInt.toString(), 0)) : setCookie(a, &amp;quot;1&amp;quot;, b)
	}
	function maxClick(a, b) {
	    var c = getCookie(a);
	    return void 0 != c &amp;amp;&amp;amp; parseInt(c) &amp;gt;= b ? !0 : !1
	}
	jQuery(document).ready(function (a) {
	    var b = &amp;quot;adsbygoogle&amp;quot;,
	        c = 7,
	        d = maxClick,
	        e = &amp;quot;&lt;mark&gt;.adsbygoogle&lt;/mark&gt;&amp;quot;,
	        f = !1;
	    maxClick(b, d) &amp;amp;&amp;amp; a(e).addClass(disableAds).click(false), a(e).bind(&amp;quot;mouseover&amp;quot;, function () {
	        f = !0
	    }).bind(&amp;quot;mouseout&amp;quot;, function () {
	        f = !1
	    }), a(window).on(&amp;quot;beforeunload&amp;quot;, function () {
	        f &amp;amp;&amp;amp; (ASmaxClick(b, d) ? a(e).addClass(disableAds).click(false) : setCookieAds(b, c))
	    })
	});
//]]&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Các bạn để ý trên đoạn code trên có 1 class là &lt;code&gt;.adsbygoogle&lt;/code&gt; đây là class trong thẻ &lt;code&gt;&amp;lt;ins...&lt;/code&gt; quảng cáo của Google Adsense, các bạn cũng có thể thay bằng class trong code của những mạng quảng cáo khác.&lt;/p&gt;
&lt;p&gt;Nếu Blog bạn chưa có thư viện JQuery thì thêm đoạn Code sau vào phía trên thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script src=&amp;#39;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;Phía trên là Code và &lt;a href=&quot;https://www.nldblog.com/2022/08/cach-chan-click-tac-spam-click-google-adsense-cho-blogger.html&quot;&gt;Cách chặn Click Tặc, Spam Click Google Adsense cho Blogger&lt;/a&gt; mình tham khảo trên mạng, Blog mình chưa có quảng cáo nên mình cũng chưa áp dụng vào Blog mình nhưng mình đã thử và nó hoạt động rất ổn mình khuyên các bạn nên áp dụng cho Blog của mình.&lt;/p&gt;



&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1952039364801274903/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/08/cach-chan-click-tac-spam-click-google-adsense-cho-blogger.html#comment-form' title='2 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1952039364801274903'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1952039364801274903'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/08/cach-chan-click-tac-spam-click-google-adsense-cho-blogger.html' title='Cách chặn Click Tặc, Spam Click Google Adsense cho Blogger'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUU4tl-0l4z4SiGaHaWR3gyukfIoiO3NBeShNu4s7bUOgyGFYOZNuKmUWoKfEqg_6PSXzxQOLDxR2H2GGh-iiXvuDM1X-NTLfQb9ypgnIj-dtroK10yW_x5AZtNXwCUwDWuF7Pp6MLdsJqhlqRncyWsZUVR7Q0v76UZgVSkBqaWMwColC3zHXo54eb/s72-c-e30-rw/anti-bom-click-google-adsense-for-blogger-nldblog.webp" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-3018965849344751161</id><published>2022-08-06T10:15:00.040+07:00</published><updated>2023-10-31T11:36:36.711+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase</title><content type='html'>&lt;p&gt;Xin chào các bạn, sau nhiều bài chia sẻ template blogger thì bài này mình quay lại chia sẻ thủ thuật blogger vì hết template để chia sẻ rồi. Bài viết này mình sẽ chia sẻ cho các bạn cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;p class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase&quot; title=&quot;Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSeJTbaA5ZErReR0EqPOQx8uTYvxfWTSdoUW77h_n9hNL34EZy_P_sgOU4fmdeMqhsynQJFX6GiCjhSyaf3busNe0iMfg7UHq-oFYeYeTqpmZsHpiCym3x5vyCrXAR4AE0CRiyjusJ-w9krtuKQixFV9XhQcSQL4yZyIHwuMIyxCuDGzVFK8yR9f-k/s600-rw/realtime-post-view-for-blogger.webp&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Bài hướng dẫn này sẽ không yêu cầu các bạn có nhiều kiến thức về HTML, CSS hoặc JS vì code mình chia sẻ đã có sẵn. Các bạn chỉ cần triển khai đúng theo hướng dẫn và chèn đúng cách trong template của các bạn là được. Các bạn có thể xem demo ngay tại Blog mình nhé!&lt;/p&gt;
&lt;h2&gt;Tạo Realtime Database và thêm Rules&lt;/h2&gt;
&lt;p&gt;Đầu tiên, chúng ta cần tạo một Firebase Project để thiết lập real-time database trong Firebase. Chúng ta có thể đồng bộ và chỉnh sửa nó theo giống số lượng view trên Blogger.&lt;/p&gt;
&lt;p&gt;Để tạo Firebase Project và real-time database các bạn hãy tham khảo các bước sau:&lt;/p&gt;
&lt;h3&gt;Tạo Project trong Firebase&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Các bạn vào &lt;a href=&quot;https://console.firebase.google.com&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot;&gt;Firebase Console&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Chọn vào &lt;b&gt;Create a Project&lt;/b&gt; và nhập tên Project, các bạn cứ nhấn Continue để tiếp tục.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Các bạn hãy tắt Google Analytics và bấm vào Create Project.&lt;/p&gt;
&lt;p&gt;Vậy là xong việc tạo Project trong Firebase, tiếp theo là cài đặt Realtime Database.&lt;/p&gt;
&lt;h3&gt;Cài đặt Realtime Database&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Truy cập vào &lt;a href=&quot;https://console.firebase.google.com&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot;&gt;Firebase Console&lt;/a&gt; và chọn Project vừa tạo.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Tại menu bên trái truy cập vào &lt;b&gt;Realtime Database&lt;/b&gt;.&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase&quot; title=&quot;Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;728&quot; data-original-width=&quot;1382&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWiVHCuQrnr7PPgAKMH2sx5QdN_-EzDLf-3Q7Q11ekc8_PPogKnUSKk5at8JCC3e28Xhh5rjwCDfHQ0xBZ6FJhI66S9i_v4KiohWJdIF5_MA_ZnLcnDHCZLmSQVWRT8KHNeYdq-UNmasCd-HZk-iy_bZAQJCysCsrkpXGewQsbx2q1aZU8tiyE8y44/s600-rw/94f0aa0d-4f79-44a9-a57d-3ebad0d3ff3b.png&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Chọn vào &lt;strong&gt;Create Database, &lt;/strong&gt; và chọn &lt;b&gt;Next.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 4:&lt;/b&gt; Tiếp tục chọn Locked Mode và nhấn vào Enable.&lt;/p&gt;
&lt;p class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase&quot; title=&quot;Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;911&quot; data-original-width=&quot;1853&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJYJsdfKHzVjVV5V4zBHx3ViNQzw6xjVrwxRAjXed7-GzMZGSNpuxA-H6QRqv37OXCi-Ge5d2TFJEd27om8905k5RG_PIBq8aw7iWQga4gQlkDHmo9kaPMmTf9NeNxCDT-bQtD0lTfSyU64KvSZfH5Ioaeef9nQ7RFYrETmCO8MWWkOe_FXvWmjmUx/s600-rw/17b09a2f-99c7-44c9-817f-da7d41e888ea.png&quot;/&gt;&lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;Vậy là chúng ta đã tạo xong Realtime Database, hãy copy lại đường dẫn như hình mình đánh dấu.&lt;/p&gt;
&lt;h3&gt;Thêm Rules vào Database&lt;/h3&gt;
&lt;p&gt;Tiếp theo chuyển qua tab &lt;b&gt;RULES&lt;/b&gt; và các bạn thay thế toàn bộ code cũ bằng đoạn code như sau:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{
  &amp;quot;rules&amp;quot;: {
    &amp;quot;.read&amp;quot;: true,
    &amp;quot;BlogID_&lt;span style=&#39;background:#e8f0fe&#39;&gt;0000000000000000000&lt;/span&gt;&amp;quot;: {
      &amp;quot;.read&amp;quot;: true,
      &amp;quot;$post_id&amp;quot;: {
        &amp;quot;.write&amp;quot;: &amp;quot;newData.exists() &amp;amp;&amp;amp; (data.exists() ? newData.val() == data.val() + 1 : newData.val() == 1)&amp;quot;,
        &amp;quot;.validate&amp;quot;: &amp;quot;newData.isNumber() &amp;amp;&amp;amp; newData.val() % 1 === 0.0 &amp;amp;&amp;amp; newData.val() &amp;lt;= 99999999&amp;quot;
      }
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Sửa &lt;code&gt;0000000000000000000&lt;/code&gt; thành Blog ID của các bạn nhé.&lt;/p&gt;
&lt;p&gt;Sau đó nhấn chọn Publish để lưu lại đoạn code vừa thay.&lt;/p&gt;
&lt;h2&gt;Chỉnh sửa trong template&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Các bạn chèn đoạn &lt;b&gt;CSS&lt;/b&gt; sau vào trước thẻ &lt;code&gt;]]&amp;gt;&amp;lt;/b:skin&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;&amp;lt;!--[ Realtime Post View Counter by NLD Blog]--&amp;gt;
.entry-views{color:#000;font-size:14px;visibility:hidden;opacity:0;transition:all .2s ease}
.entry-views[data-view]{visibility:visible;opacity:1}
.entry-views::after{content:attr(data-view) &amp;#39; views&amp;#39;}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Thêm đoạn HTML sau để hiển thị lượt xem:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;span class=&amp;#39;nld_view entry-views hidden&amp;#39; data-add=&amp;#39;true&amp;#39; expr:data-id=&amp;#39;data:post.id&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;Ở đoạn &lt;code&gt;data-add=&amp;#39;true&amp;#39;&lt;/code&gt; các bạn sửa thành false nếu các bạn muốn hiển thị lượt xem tại các trang khác trang bài viết. Cụ thể true thì khi tải trang nó sẽ +1 lượt xem còn false thì khi tải lại trang nó sẽ không cộng thêm lượt xem mà nó chỉ hiển thị lượt xem đã có.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Tiếp theo chèn đoạn &lt;b&gt;JavaScript&lt;/b&gt; dưới đây vào trước thẻ &lt;code&gt;/body&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;
  /*&amp;lt;![CDATA[*/
  /*! Realtime Post View Counter by NLD Blog */
  const viewSeting = {
      blogID: &amp;#39;&lt;mark&gt;0000000000000000000&lt;/mark&gt;&amp;#39;,
      databaseUrl: &amp;#39;&lt;mark&gt;databaseUrl&lt;/mark&gt;&amp;#39;,
      abbreviation: true,
      lazyload: true
  }
  function loadJs(e, b, c, d) {
      let a = document.createElement(&amp;quot;script&amp;quot;);
      b &amp;amp;&amp;amp; (a.id = b), a.async = c, a.defer = c, a.src = e, d &amp;amp;&amp;amp; (a.onload = d), document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(a)
  }
  function abvr(a) {
      var b = Math.sign(Number(a));
      return 1e9 &amp;lt;= Math.abs(Number(a)) ? b * (Math.abs(Number(a)) / 1e9).toFixed(2) + &amp;quot;B&amp;quot; : 1e6 &amp;lt;= Math.abs(Number(a)) ? b * (Math.abs(Number(a)) / 1e6).toFixed(2) + &amp;quot;M&amp;quot; : 1e3 &amp;lt;= Math.abs(Number(a)) ? b * (Math.abs(Number(a)) / 1e3).toFixed(2) + &amp;quot;K&amp;quot; : Math.abs(Number(a))
  }
  function loadPostVw() {
      for (var c = document.querySelectorAll(&amp;quot;.nld_view&amp;quot;), e = firebase.database(), a = 0; a &amp;lt; c.length; a++) {
          var d = c[a],
              b = d.getAttribute(&amp;quot;data-id&amp;quot;);
          (b = e.ref(&amp;quot;BlogID_&amp;quot; + viewSeting.blogID + &amp;quot;/PostID_&amp;quot; + b)).once(&amp;quot;value&amp;quot;, function(a, b) {
              return function(c) {
                  0 &amp;lt; (c = c.exists() ? c.val() : 0) &amp;amp;&amp;amp; (a.setAttribute(&amp;quot;data-view&amp;quot;, viewSeting.abbreviation ? abvr(c) : c), a.classList.remove(&amp;quot;hidden&amp;quot;)), &amp;quot;true&amp;quot; == a.getAttribute(&amp;quot;data-add&amp;quot;) &amp;amp;&amp;amp; (a.setAttribute(&amp;quot;data-add&amp;quot;, !1), c = parseInt(c) + 1, b.set(c))
              }
          }(d, b))
      }
  }
  function postVw() {
      loadJs(&amp;quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js&amp;quot;, &amp;quot;fb-app&amp;quot;, !0, () =&amp;gt; {
          loadJs(&amp;quot;https://www.gstatic.com/firebasejs/8.10.1/firebase-database.js&amp;quot;, &amp;quot;fb-db&amp;quot;, !0, () =&amp;gt; {
              var a = {};
              a.databaseURL = viewSeting.databaseUrl, firebase.initializeApp(a), loadPostVw()
          })
      })
  }
  if (!0 === viewSeting.lazyload) {
      var a = [],
          b = [];
      let c = () =&amp;gt; {
          0 == a.length &amp;amp;&amp;amp; null == localStorage.getItem(&amp;quot;LZ_VIEW&amp;quot;) &amp;amp;&amp;amp; (localStorage.setItem(&amp;quot;LZ_VIEW&amp;quot;, 1), postVw())
      };
      window.addEventListener(&amp;quot;scroll&amp;quot;, a =&amp;gt; {
          (0 != document.documentElement.scrollTop &amp;amp;&amp;amp; 0 == b.length || 0 != document.body.scrollTop &amp;amp;&amp;amp; 0 == b.length) &amp;amp;&amp;amp; c()
      }, !0), document.getElementsByTagName(&amp;quot;body&amp;quot;)[0].addEventListener(&amp;quot;click&amp;quot;, a =&amp;gt; {
          c()
      }), localStorage.getItem(&amp;quot;LZ_VIEW&amp;quot;) &amp;amp;&amp;amp; postVw()
  } else postVw()
  /*]]&amp;gt;*/
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p class=&quot;note&quot;&gt;Bước này các bạn thay: &lt;br/&gt;1. &lt;code&gt;0000000000000000000&lt;/code&gt; giống với Blog ID ở trên phần &lt;b&gt;Thêm Rules vào Database&lt;/b&gt;.&lt;br/&gt;
  2. &lt;code&gt;databaseUrl&lt;/code&gt; các bạn thay thành Realtime Database URL của các bạn mà mình đã bảo copy ở phần trên.&lt;br/&gt;
  3. &lt;code&gt;abbreviation&lt;/code&gt; có thể để là &lt;code&gt;true&lt;/code&gt; hoặc &lt;code&gt;false&lt;/code&gt;.&lt;br/&gt;
  4. &lt;code&gt;lazyload&lt;/code&gt; cũng tương tự &lt;code&gt;true&lt;/code&gt; hoặc &lt;code&gt;false&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;Cuối cùng lưu lại và kiểm tra trên Blog của các bạn.&lt;/p&gt;
&lt;p&gt;Như vậy chỉ vài bước đơn giản thôi là các bạn đã thêm được lượt xem bài viết trông rất chuyên nghiệp đúng không.&lt;/p&gt;











&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/3018965849344751161/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/08/cach-them-luot-xem-bai-viet-blogger-su-dung-javascript-va-firebase.html#comment-form' title='8 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3018965849344751161'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3018965849344751161'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/08/cach-them-luot-xem-bai-viet-blogger-su-dung-javascript-va-firebase.html' title='Cách thêm lượt xem bài viết Blogger sử dụng JavaScript và Firebase'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSeJTbaA5ZErReR0EqPOQx8uTYvxfWTSdoUW77h_n9hNL34EZy_P_sgOU4fmdeMqhsynQJFX6GiCjhSyaf3busNe0iMfg7UHq-oFYeYeTqpmZsHpiCym3x5vyCrXAR4AE0CRiyjusJ-w9krtuKQixFV9XhQcSQL4yZyIHwuMIyxCuDGzVFK8yR9f-k/s72-c-rw/realtime-post-view-for-blogger.webp" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1294702151863832143</id><published>2022-07-09T12:54:00.104+07:00</published><updated>2023-10-31T11:36:36.709+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="cloudflare"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách tạo Progressive Web App (PWA) cho Blogger/Website</title><content type='html'>&lt;p&gt;Chào các bạn đến với NLD Blog. Đã bao giờ các bạn truy cập vào một Website hay một Blog và các bạn thấy hiện trên màn hình nút &quot;Add To Home Screen&quot; chưa? Nếu bạn đã thấy và đang muốn tìm cách để thêm nó vào Blog/Website của mình mà chưa biết cách thì bài viết này mình sẽ hướng dẫn các bạn &lt;b&gt;Cách tạo Progressive Web App (PWA) cho Blogger/Website&lt;/b&gt;.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách tạo Progressive Web App (PWA) cho Blogger/Website&quot; title=&quot;Cách tạo Progressive Web App (PWA) cho Blogger/Website&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd0g-Z0mGmZaY_mCs5SDpZfY0ATzR4PpFkMFBUnCOCdIXi6XN5p0tG60KgEvobMooKFRkAL7XproJnTVcROpycUZFlYUF_ImI8pFb3W9A0fxCvqObfqUZcc2oj1d12Nxakrlkf4wg1LQzpm54qGiG1GrtWd2Eq6C85l5-t49dKSxamL5MnWNNmtSGU/s600-rw-e30/cach-tao-progressive-web-app-pwa-cho-bloggerwebsite.webp&quot;/&gt;&lt;/div&gt;
&lt;h2&gt;&lt;strike&gt;Cách tạo &lt;em&gt;Progressive Web App&lt;/em&gt; (PWA) cho Blogger/Website&lt;/strike&gt;&lt;/h2&gt;
&lt;p&gt;Trong bài viết này mình sẽ hướng dẫn các bạn cách xây dựng Progressive Web App hay còn gọi tắt là PWA một cách dễ ràng với Blogger.&lt;/p&gt;
&lt;p&gt;Trước khi bắt đầu chúng ta hãy cũng nhau tìm hiểu một chút về Progressive Web App hay PWA là gì và nó quan trọng như thế nào đối với Website.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2&gt;PWA là gì?&lt;/h2&gt;
&lt;p&gt;Progressive Web App (PWA) là sự kết hợp hoàn hảo giữa web và ứng dụng, giúp cho các ứng dụng sử dụng trên trang web có những tính năng như một ứng dụng thực sự.&lt;/p&gt;
&lt;p&gt;Nhờ vào tính năng của service worker, manifest và https, PWA có thể hoạt động offline ngay cả khi không có mạng.&lt;/p&gt;
&lt;p&gt;Bên cạnh đó, PWA còn hỗ trợ gửi những thông báo liên quan, góp phần tăng hiệu quả hoạt động marketing.&lt;/p&gt;
&lt;p&gt;Tóm lại, PWA là ứng dụng có thể cung cấp những tính năng bổ sung dựa trên các thiết bị hỗ trợ, cung cấp khả năng ngoại tuyến, đẩy thông báo, có giao diện và tốc độ tương đương với ứng dụng Native và lưu trữ cục bộ các tài nguyên.&lt;/p&gt;
&lt;h2&gt;Tại sao PWAs lại quan trọng?&lt;/h2&gt;
&lt;p&gt;Mặc dù các ngôn ngữ lập trình như PHP, Java, Javascript cung cấp những bản cập nhật giúp tăng tốc rất nhiều. Nhưng những trang web được tạo ra vẫn có độ trễ và thời gian chờ đợi lên tới vài giây. Thậm chí hơn nếu có nhiều chức năng.&lt;/p&gt;
&lt;p&gt;Với việc người dùng càng ngày càng thiếu kiên nhận, việc chờ đợi 3-5s (hiện nay là tốc độ cực kỳ tốt) cũng có thể sẽ không còn ưu thế trong 1 vài năm tới. Khi đó PWA sẽ nhanh chóng trở thành một giải pháp hàng đầu cho các lập trình viên web.&lt;/p&gt;
&lt;p&gt;Bằng cách tạo ra sự kết hợp giữa trang web và ứng dụng di động, tận dụng được lợi thế tốc độ của PWA, các công ty này có thể sớm lôi kéo được khách hàng tốt hơn đối thủ.&lt;/p&gt;
&lt;p&gt;Đúng thế, tạo ra một giải pháp giúp khách hàng truy cập nhanh với tốc độ gần bằng 0 thì tại sao khách hàng lại muốn truy cập trang web mà phải chờ đợi mỗi lần load chứ.&lt;/p&gt;
&lt;p&gt;Thậm chí, tốc độ là yếu tố hàng đầu khi nói đến SEO, gia tăng chuyển đổi và tạo ra trải nghiệm người dùng tốt hơn. Sử dụng PWA bạn sẽ tạo ra được trải nghiệm &quot;WOW&quot; - Đây là thứ mà mọi lập trình viên đều muốn.&lt;/p&gt;
&lt;h2&gt;Làm thế nào để xây dựng PWA cho Blogger?&lt;/h2&gt;
&lt;p&gt;Dể xây dựng Progressive Web App, bạn cần phải thêm một số dịch vụ vào website của bạn. Các dịch vụ đó bao gồm: service workers, cho phép website hoạt động khi offline và thông báo đẩy. Bạn cũng có thể thêm thông báo Add-to-Home screen để nhắc người dùng thêm website hay ứng dụng của bạn vào màn hình điện thoại hoặc máy tính cá nhân.&lt;/p&gt;
&lt;p&gt;Nghe thì có vẻ hơi khó hiểu và nó rất khó để thực hiện với Blogger, các bạn hãy chú ý và làm theo các bước hướng dẫn dưới đây thì các bạn có thể dễ dàng xây dựng được PWA cho Blogger.&lt;/p&gt;
&lt;p class=&#39;alert-message alert-info&#39;&gt;Để tạo Progressive Web App cho Blogger yêu cầu bạn phải có một tên miền tùy chỉnh và sử dụng dịch vụ của Cloudflare. Đối với tên miền mặc định .blogspot.com thì bạn không thể thiết lập được service worker.&lt;/p&gt;
&lt;h2&gt;Yêu cầu&lt;/h2&gt;
&lt;p&gt;Để xây dựng PWA cho Blogger, có một số yêu cầu cần thiết để thiết lập như sau:&lt;p&gt;
&lt;ol&gt;
  &lt;li&gt;Bạn phải có một logo icon dạng &lt;code&gt;.png&lt;/code&gt; với kích thước là 512x512.&lt;/li&gt;
  &lt;li&gt;5 ảnh chụp màn hình Blog của bạn dạng &lt;code&gt;.png&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Có một tài khoản GitHub.&lt;/li&gt;
  &lt;li&gt;Có một tài khoản Cloudflare và tên miền của bạn phải được quản lý DNS ở đây.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Uploading Icons&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;Logo icon với định dạng &lt;code&gt;.png&lt;/code&gt; kích thước 512x512, các bạn đổi tên nó thành &lt;code&gt;android-icon-512x512.png&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Vào trang &lt;a href=&quot;https://www.favicon-generator.org&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopenner&quot;&gt;favicon-generator.org&lt;/a&gt; và upload icon lên.&lt;/li&gt;
  &lt;li&gt;Tại bộ favicon và icon vừa tạo và giải nén ra.&lt;/li&gt;
  &lt;li&gt;Xoá bỏ một số file không cần thiết như &lt;code&gt;browserconfig.xml&lt;/code&gt; và &lt;code&gt;manifest.json&lt;/code&gt;.&lt;/li&gt;  
  &lt;li&gt;Vào Github và tạo một &lt;a href=&quot;https://github.com/new&quot; target=&quot;_blank&quot;&gt;Repository&lt;/a&gt;, ví dụ như &lt;code&gt;icon-nldblog&lt;/code&gt; và upload tất cả các file icon vào trong nhánh &lt;code&gt;main&lt;/code&gt;.
    &lt;br&gt;&lt;span style=&quot;color:red&quot;&gt;*&lt;/span&gt;Bao gồm cả file &lt;code&gt;android-icon-512x512.png&lt;/code&gt;.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Upload ảnh chụp màn hình&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;Lưu 5 ảnh chụp màn hình Blog của bạn dưới dạng &lt;code&gt;.png&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Đổi tên các file theo thứ tự như sau: scr1.png, scr2.png, scr3.png, scr4.png, scr5.png&lt;/li&gt;
  &lt;li&gt;Tiếp tục upload 5 ảnh chụp màn hình vào nhánh main của GitHub Repository vừa tạo.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Tạo Workers trong Cloudflare&lt;/h2&gt;
&lt;blockquote&gt;Chúng ta sẽ tạo 4 Workers trong Cloudflare, để dễ dàng hơn trong việc quản lý chúng ta lưu nó bằng tên worker và tên blog, như sau:&lt;br/&gt;
main-nldblog&lt;br/&gt;
manifest-nldblog&lt;br/&gt;
serviceworker-nldblog&lt;br/&gt;
offline-nldblog&lt;/blockquote&gt;
&lt;h3&gt;Main Worker&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Đăng nhập vào tài khoản &lt;a href=&quot;https://www.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopenner&quot;&gt;Cloudflare&lt;/a&gt; của bạn.&lt;/li&gt;
  &lt;li&gt;Chọn vào Workers và chọn Manage Workers.&lt;/li&gt;
  &lt;li&gt;Chọn vào Create a Service và đặt tên cho nó như sau &lt;code&gt;main-blogname&lt;/code&gt;, ví dụ: &lt;code&gt;main-nldblog&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Xoá bỏ đoạn Script có sẵn và thay thế bằng đoạn Script sau:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#39;js&#39;&gt;addEventListener(&amp;quot;fetch&amp;quot;, event =&amp;gt; {
  event.respondWith(handleRequest(event))
})

//const BUCKET_NAME = &amp;quot;main&amp;quot;
const BUCKET_URL = `https://cdn.statically.io/gh/ngylduy/icon-nldblog`

async function serveAsset(event) {
  const url = new URL(event.request.url)
  const cache = caches.default
  let response = await cache.match(event.request)

  if (!response) {
    response = await fetch(`${BUCKET_URL}${url.pathname}`)
    const headers = { &amp;quot;cache-control&amp;quot;: &amp;quot;public, max-age=14400&amp;quot; }
    response = new Response(response.body, { ...response, headers })
    event.waitUntil(cache.put(event.request, response.clone()))
  }
  return response
}

async function handleRequest(event) {
  if (event.request.method === &amp;quot;GET&amp;quot;) {
    let response = await serveAsset(event)
    if (response.status &amp;gt; 399) {
      response = new Response(response.statusText, { status: response.status })
    }
    return response
  } else {
    return new Response(&amp;quot;Method not allowed&amp;quot;, { status: 405 })
  }
}&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
  &lt;li&gt;Thay thế &lt;code&gt;ngylduy&lt;/code&gt; bằng GitHub username của bạn và &lt;code&gt;icon-nldblog&lt;/code&gt; bằng tên của bạn Repository&lt;/li&gt;
  &lt;li&gt;Nhấn vào Save and Deploy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Manifest.json&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Giống như cách tạo ở trên chúng ta tạo Service có tên như sau &lt;code&gt;manifest-blogname&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Thay thế Script có sẵn bằng Script sau:&lt;/li&gt;
&lt;/ol&gt;
  &lt;pre class=&#39;js&#39;&gt;addEventListener(&amp;quot;fetch&amp;quot;, event =&amp;gt; {
  const data = {
    name: &amp;quot;NLD BLOG&amp;quot;,
    short_name: &amp;quot;NLD BLOG&amp;quot;,
    description: &amp;quot;Install Now NLD BLOG App.&amp;quot;,
    display: &amp;quot;standalone&amp;quot;,
    prefer_related_applications: false,
    start_url: &amp;quot;\/?utm_source=homescreen&amp;quot;,
    scope: &amp;quot;\/&amp;quot;,
    background_color: &amp;quot;#2196f3&amp;quot;,
    theme_color: &amp;quot;#2196f3&amp;quot;,
    icons: [
      {
      src: &amp;quot;\/main\/android-icon-512x512.png&amp;quot;,
      sizes: &amp;quot;512x512&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;4.0&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      },
      {
      src: &amp;quot;\/main\/android-icon-192x192.png&amp;quot;,
      sizes: &amp;quot;192x192&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;4.0&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      },
      {
      src: &amp;quot;\/main\/apple-icon-144x144.png&amp;quot;,
      sizes: &amp;quot;144x144&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;3.0&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      },
      {
      src: &amp;quot;\/main\/android-icon-96x96.png&amp;quot;,
      sizes: &amp;quot;96x96&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;2.0&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      },
      {
      src: &amp;quot;\/main\/android-icon-72x72.png&amp;quot;,
      sizes: &amp;quot;72x72&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;1.5&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      },
      {
      src: &amp;quot;\/main\/android-icon-48x48.png&amp;quot;,
      sizes: &amp;quot;48x48&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;1.0&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      },
      {
      src: &amp;quot;\/main\/android-icon-36x36.png&amp;quot;,
      sizes: &amp;quot;36x36&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      density: &amp;quot;0.75&amp;quot;,
      purpose: &amp;quot;any maskable&amp;quot;
      }
    ],
    shortcuts: [
      {
      name: &amp;quot;NLD BLOG&amp;quot;,
      short_name: &amp;quot;NLD BLOG&amp;quot;,
      description: &amp;quot;The Best Website where you can find Blogger Widgets, Tech News, Tech Reviews, Coding related Tutorials and many more.&amp;quot;,
      url: &amp;quot;\/?utm_source=homescreen&amp;quot;,
      icons: [
          {
          src: &amp;quot;\/main\/android-icon-192x192.png&amp;quot;,
          sizes: &amp;quot;192x192&amp;quot;
          }
        ]
      },
      {
      name: &amp;quot;NLD BLOG&amp;quot;,
      short_name: &amp;quot;NLD BLOG&amp;quot;,
      description: &amp;quot;Explore NLD BLOG.&amp;quot;,
      url: &amp;quot;\/search?utm_source=homescreen&amp;quot;,
      icons: [
          {
          src: &amp;quot;\/main\/android-icon-192x192.png&amp;quot;,
          sizes: &amp;quot;192x192&amp;quot;
          }
        ]
      },
      {
      name: &amp;quot;Giao diện Blogspot&amp;quot;,
      short_name: &amp;quot;Giao diện Blogspot&amp;quot;,
      description: &amp;quot;Giao diện miễn phí cho Blogspot.&amp;quot;,
      url: &amp;quot;\/search\/label\/theme-blogspot?utm_source=homescreen&amp;quot;,
      icons: [
          {
          src: &amp;quot;\/main\/android-icon-192x192.png&amp;quot;,
          sizes: &amp;quot;192x192&amp;quot;
          }
        ]
      }
    ],
    screenshots: [
      {
      src: &amp;quot;\/main\/scr1.png&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      sizes: &amp;quot;540x720&amp;quot;
      },
      {
      src: &amp;quot;\/main\/scr2.png&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      sizes: &amp;quot;540x720&amp;quot;
      },
      {
      src: &amp;quot;\/main\/scr3.png&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      sizes: &amp;quot;540x720&amp;quot;
      },
      {
      src: &amp;quot;\/main\/scr4.png&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      sizes: &amp;quot;540x720&amp;quot;
      },
      {
      src: &amp;quot;\/main\/scr5.png&amp;quot;,
      type: &amp;quot;image\/png&amp;quot;,
      sizes: &amp;quot;540x720&amp;quot;
      }
    ],
    serviceworker: {
      src: &amp;quot;\/sw.js&amp;quot;
    }
  }

  const json = JSON.stringify(data, null, 2)

  return event.respondWith(
    new Response(json, {
      headers: {
        &amp;quot;content-type&amp;quot;: &amp;quot;application/json;charset=UTF-8&amp;quot;
      }
    })
  )
})&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
  &lt;li&gt;Thay thế những thông tin như tên và mã màu ở trên.&lt;/li&gt;
  &lt;li&gt;Nhấn vào Save and Deploy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ServiceWorker&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Như trên, tạo một Service tên như sau &lt;code&gt;serviceworker-blogname&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Thay thế Script có sẵn bằng Script sau:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#39;js&#39;&gt;const js = `
importScripts(&amp;#39;https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js&amp;#39;);
if (workbox) {
workbox.core.skipWaiting();
workbox.core.clientsClaim();
workbox.core.setCacheNameDetails({
  prefix: &amp;#39;thn-sw&amp;#39;,
  suffix: &amp;#39;v22&amp;#39;,
  precache: &amp;#39;install-time&amp;#39;,
  runtime: &amp;#39;run-time&amp;#39;
});

const FALLBACK_HTML_URL = &amp;#39;/offline.html&amp;#39;;
const version = workbox.core.cacheNames.suffix;
workbox.precaching.precacheAndRoute([{url: FALLBACK_HTML_URL, revision: null},{url: &amp;#39;/manifest.json&amp;#39;, revision: null},{url: &amp;#39;/main/favicon.ico&amp;#39;, revision: null}]);

workbox.routing.setDefaultHandler(new workbox.strategies.NetworkOnly());

workbox.routing.registerRoute(
    new RegExp(&amp;#39;.(?:css|js|png|gif|jpg|svg|ico)$&amp;#39;),
    new workbox.strategies.CacheFirst({
        cacheName: &amp;#39;images-js-css-&amp;#39; + version,
        plugins: [
            new workbox.expiration.ExpirationPlugin({
                maxAgeSeconds: 60 * 24 * 60 * 60,
                maxEntries:200,
                purgeOnQuotaError: true
            })
        ],
    }),&amp;#39;GET&amp;#39;
);

workbox.routing.setCatchHandler(({event}) =&amp;gt; {
      switch (event.request.destination) {
        case &amp;#39;document&amp;#39;:
        return caches.match(FALLBACK_HTML_URL);
      break;
      default:
        return Response.error();
  }
});

self.addEventListener(&amp;#39;activate&amp;#39;, function(event) {
  event.waitUntil(
    caches
      .keys()
      .then(keys =&amp;gt; keys.filter(key =&amp;gt; !key.endsWith(version)))
      .then(keys =&amp;gt; Promise.all(keys.map(key =&amp;gt; caches.delete(key))))
  );
});

}
else {
    console.log(&amp;#39;Oops! Workbox did not load&amp;#39;);
}
`

async function handleRequest(request) {
  return new Response(js, {
    headers: {
      &amp;quot;content-type&amp;quot;: &amp;quot;application/javascript;charset=UTF-8&amp;quot;,
    },
  })
}

addEventListener(&amp;quot;fetch&amp;quot;, event =&amp;gt; {
  return event.respondWith(handleRequest(event.request))
})&lt;/pre&gt;
&lt;ol start=&#39;3&#39;&gt;
  &lt;li&gt;Sử dụng Workbox, chúng ta có thể lưu vào bộ đệm HTML, CSS, JS.&lt;/li&gt;
  &lt;li&gt;Nhấn vào Save and Deploy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Offline&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Vẫn như trên, chúng tạo một Service đặt tên là &lt;code&gt;offline-blogname&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Thay thế Script có sẵn bằng Script sau:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#39;js&#39;&gt;const html = `&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;

&amp;lt;head&amp;gt;
  &amp;lt;!--[ Meta Tags ]--&amp;gt;
  &amp;lt;title&amp;gt;Oops, You&amp;#39;re Offline!&amp;lt;/title&amp;gt;
  &amp;lt;meta charset=&amp;#39;UTF-8&amp;#39;/&amp;gt;
  &amp;lt;meta content=&amp;#39;width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0&amp;#39; name=&amp;#39;viewport&amp;#39;/&amp;gt;
  &amp;lt;meta content=&amp;#39;IE=edge&amp;#39; http-equiv=&amp;#39;X-UA-Compatible&amp;#39;/&amp;gt;

  &amp;lt;!--[ Theme Color ]--&amp;gt;
  &amp;lt;meta content=&amp;#39;#2196f3&amp;#39; name=&amp;#39;theme-color&amp;#39;/&amp;gt;
  &amp;lt;meta content=&amp;#39;#2196f3&amp;#39; name=&amp;#39;msapplication-navbutton-color&amp;#39;/&amp;gt;
  &amp;lt;meta content=&amp;#39;#2196f3&amp;#39; name=&amp;#39;apple-mobile-web-app-status-bar-style&amp;#39;/&amp;gt;
  &amp;lt;meta content=&amp;#39;true&amp;#39; name=&amp;#39;apple-mobile-web-app-capable&amp;#39;/&amp;gt;

  &amp;lt;!--[ Favicon ]--&amp;gt;
  &amp;lt;link href=&amp;#39;/main/apple-icon-120x120.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;120x120&amp;#39;/&amp;gt;
  &amp;lt;link href=&amp;#39;/main/apple-icon-152x152.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;152x152&amp;#39;/&amp;gt;
  &amp;lt;link href=&amp;#39;/main/favicon-32x32.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;32x32&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
  &amp;lt;link href=&amp;#39;/main/favicon-96x96.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;96x96&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
  &amp;lt;link href=&amp;#39;/main/favicon-16x16.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;16x16&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
  &amp;lt;link href=&amp;#39;/main/favicon.ico&amp;#39; rel=&amp;#39;icon&amp;#39; type=&amp;#39;image/x-icon&amp;#39;/&amp;gt;
  &amp;lt;link href=&amp;#39;/main/favicon.ico&amp;#39; rel=&amp;#39;shortcut icon&amp;#39; type=&amp;#39;image/x-icon&amp;#39;/&amp;gt;

  &amp;lt;!--[ Stylesheet ]--&amp;gt;
  &amp;lt;style&amp;gt;/*&amp;lt;![CDATA[*/
/* Merriweather - Font */ @font-face{font-family: &amp;#39;Merriweather&amp;#39;; font-style: italic; font-weight: 300; font-display: swap; src: local(&amp;#39;Merriweather-LightItalic&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4l0qyriQwlOrhSvowK_l5-eR7lXff4jvw.woff2) format(&amp;#39;woff2&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4l0qyriQwlOrhSvowK_l5-eR7lXcf8.woff) format(&amp;#39;woff&amp;#39;)} @font-face{font-family: &amp;#39;Merriweather&amp;#39;; font-style: italic; font-weight: 700; font-display: swap; src: url(https://fonts.gstatic.com/s/merriweather/v22/u-4l0qyriQwlOrhSvowK_l5-eR7NWPf4jvw.woff2) format(&amp;#39;woff2&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4l0qyriQwlOrhSvowK_l5-eR71Wsf8.woff) format(&amp;#39;woff&amp;#39;)} @font-face{font-family: &amp;#39;Merriweather&amp;#39;; font-style: italic; font-weight: 900; font-display: swap; src: url(https://fonts.gstatic.com/s/merriweather/v22/u-4l0qyriQwlOrhSvowK_l5-eR7NWPf4jvw.woff2) format(&amp;#39;woff2&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4l0qyriQwlOrhSvowK_l5-eR7NWMf8.woff) format(&amp;#39;woff&amp;#39;)} @font-face{font-family: &amp;#39;Merriweather&amp;#39;; font-style: normal; font-weight: 300; font-display: swap; src: url(https://fonts.gstatic.com/s/merriweather/v22/u-4n0qyriQwlOrhSvowK_l521wRZWMf6.woff2) format(&amp;#39;woff2&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4n0qyriQwlOrhSvowK_l521wRpXA.woff) format(&amp;#39;woff&amp;#39;)} @font-face{font-family: &amp;#39;Merriweather&amp;#39;; font-style: normal; font-weight: 700; font-display: swap; src: url(https://fonts.gstatic.com/s/merriweather/v22/u-4n0qyriQwlOrhSvowK_l52xwNZWMf6.woff2) format(&amp;#39;woff2&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4n0qyriQwlOrhSvowK_l52xwNpXA.woff) format(&amp;#39;woff&amp;#39;)} @font-face{font-family: &amp;#39;Merriweather&amp;#39;; font-style: normal; font-weight: 900; font-display: swap; src: url(https://fonts.gstatic.com/s/merriweather/v22/u-4n0qyriQwlOrhSvowK_l52_wFZWMf6.woff2) format(&amp;#39;woff2&amp;#39;), url(https://fonts.gstatic.com/s/merriweather/v22/u-4n0qyriQwlOrhSvowK_l52_wFpXA.woff) format(&amp;#39;woff&amp;#39;)}
/* Content */ body{background:#f1f3f6;color:#1f1f1f;font-family:&amp;#39;Merriweather&amp;#39;,serif;font-weight:400;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body:focus{outline:none !important} .mainCont{margin:0 auto;position:fixed;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;padding:15px} .noIntPop{position:relative;overflow:hidden;text-align:center;padding:15px;border-radius:30px;background:#f1f3f6;box-shadow:inset 0 0 15px rgba(55, 84, 170, 0), inset 0 0 20px rgba(255, 255, 255, 0), 7px 7px 15px rgba(55, 84, 170, 0.15), -7px -7px 20px white, inset 0px 0px 4px rgba(255, 255, 255, 0.2)} .circle.t{top:-150px;right:-150px} .circle.b{bottom:-150px;left:-150px} .noIntCont{position:relative;z-index:1} .noIntIcon{padding:30px} .noConHead{font-weight:700;font-size:1.3rem} .noConDesc{font-size:16px;line-height:1.4em;padding-top:20px;font-weight:400;opacity:.8} .cta,.relCont{display:flex;justify-content:center;align-items:center} .relCont{padding:30px} .cta{width:66px;height:66px;background:#f1f3f6;outline:none;border:none;border-radius:690px;box-shadow:inset 0 0 15px rgba(55, 84, 170, 0), inset 0 0 20px rgba(255, 255, 255, 0), 7px 7px 15px rgba(55, 84, 170, 0.15), -7px -7px 20px white, inset 0px 0px 4px rgba(255, 255, 255, 0.2);transition:box-shadow 399ms ease-in-out} .cta:hover{box-shadow:inset 7px 7px 15px rgba(55, 84, 170, 0.15), inset -7px -7px 20px white, 0px 0px 4px rgba(255, 255, 255, 0.2)} .icon{content:&amp;#39;&amp;#39;;width:25px;height:25px;display:inline-block} .iconB{content:&amp;#39;&amp;#39;;width:50px;height:50px;display:inline-block} .icon.reload{background:url(&amp;quot;data:image/svg+xml,&amp;lt;svg xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39; viewBox=&amp;#39;0 0 24 24&amp;#39; fill=&amp;#39;none&amp;#39; stroke=&amp;#39;%239dabc0&amp;#39; stroke-width=&amp;#39;1.5&amp;#39; stroke-linecap=&amp;#39;round&amp;#39; stroke-linejoin=&amp;#39;round&amp;#39;&amp;gt;&amp;lt;polyline points=&amp;#39;23 4 23 10 17 10&amp;#39;/&amp;gt;&amp;lt;path d=&amp;#39;M20.49 15a9 9 0 1 1-2.12-9.36L23 10&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;quot;) center / 25px no-repeat} .iconB.wifiOff{background:url(&amp;quot;data:image/svg+xml,&amp;lt;svg xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39; viewBox=&amp;#39;0 0 24 24&amp;#39; fill=&amp;#39;none&amp;#39; stroke=&amp;#39;%231f1f1f&amp;#39; stroke-width=&amp;#39;2&amp;#39; stroke-linecap=&amp;#39;round&amp;#39; stroke-linejoin=&amp;#39;round&amp;#39;&amp;gt;&amp;lt;line x1=&amp;#39;1&amp;#39; y1=&amp;#39;1&amp;#39; x2=&amp;#39;23&amp;#39; y2=&amp;#39;23&amp;#39;/&amp;gt;&amp;lt;path d=&amp;#39;M16.72 11.06A10.94 10.94 0 0 1 19 12.55&amp;#39;/&amp;gt;&amp;lt;path d=&amp;#39;M5 12.55a10.94 10.94 0 0 1 5.17-2.39&amp;#39;/&amp;gt;&amp;lt;path d=&amp;#39;M10.71 5.05A16 16 0 0 1 22.58 9&amp;#39;/&amp;gt;&amp;lt;path d=&amp;#39;M1.42 9a15.91 15.91 0 0 1 4.7-2.88&amp;#39;/&amp;gt;&amp;lt;path d=&amp;#39;M8.53 16.11a6 6 0 0 1 6.95 0&amp;#39;/&amp;gt;&amp;lt;line x1=&amp;#39;12&amp;#39; y1=&amp;#39;20&amp;#39; x2=&amp;#39;12.01&amp;#39; y2=&amp;#39;20&amp;#39;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;quot;) center / 50px no-repeat} .circle{position:absolute;z-index:1;width:280px;height:280px;border-radius:50%;background-color:#f1f3f6;box-shadow:inset 8px 8px 12px #d1d9e6, inset -8px -8px 12px #f9f9f9}
  /*]]&amp;gt;*/&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
  &amp;lt;div class=&amp;#39;mainCont notranslate&amp;#39;&amp;gt;
    &amp;lt;div class=&amp;#39;noIntPop&amp;#39;&amp;gt;
      &amp;lt;div class=&amp;#39;circle t&amp;#39;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;div class=&amp;#39;circle b&amp;#39;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;div class=&amp;#39;noIntCont&amp;#39;&amp;gt;
        &amp;lt;div class=&amp;#39;noIntIcon&amp;#39;&amp;gt;
          &amp;lt;i class=&amp;#39;iconB wifiOff&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;#39;noConHead&amp;#39;&amp;gt;Oops, You&amp;#39;re Offline!&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;#39;noConDesc&amp;#39;&amp;gt;It looks like your network connection isn&amp;#39;t working right now.&amp;lt;/div&amp;gt;

        &amp;lt;div class=&amp;#39;relCont&amp;#39;&amp;gt;
          &amp;lt;button class=&amp;#39;cta&amp;#39; onclick=&amp;#39;window.location.reload()&amp;#39;&amp;gt;
            &amp;lt;i class=&amp;#39;icon reload&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
          &amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;`

async function handleRequest(request) {
  return new Response(html, {
    headers: {
      &amp;quot;content-type&amp;quot;: &amp;quot;text/html;charset=UTF-8&amp;quot;,
    },
  })
}

addEventListener(&amp;quot;fetch&amp;quot;, event =&amp;gt; {
  return event.respondWith(handleRequest(event.request))
})&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
  &lt;li&gt;Thay thế một số thông tin ở trên.&lt;/li&gt;
  &lt;li&gt;Nhấn vào Save and Deploy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Tạo Routes&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;Bây giờ chúng ta quay lại Workers và nhấn vào Add Route.&lt;/li&gt;
  &lt;li&gt;Nhập các thông tin như bảng sau:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;table-reponsive&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Route&lt;/th&gt;
        &lt;th&gt;Service&lt;/th&gt;
        &lt;th&gt;Environment&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;www.nldblog.com/main/*&lt;/td&gt;
        &lt;td&gt;main-nldblog&lt;/td&gt;
        &lt;td&gt;production&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;www.nldblog.com/manifest.json&lt;/td&gt;
        &lt;td&gt;manifest-nldblog&lt;/td&gt;
        &lt;td&gt;production&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;www.nldblog.com/sw.js&lt;/td&gt;
        &lt;td&gt;serviceworker-nldblog&lt;/td&gt;
        &lt;td&gt;production&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;www.nldblog.com/offline.html&lt;/td&gt;
        &lt;td&gt;offline-nldblog&lt;/td&gt;
        &lt;td&gt;production&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;ol start=&#39;3&#39;&gt;
  &lt;li&gt;&lt;span style=&quot;color:red&quot;&gt;*&lt;/span&gt; Nhớ thay thế url blog của bản và tên các service của bạn như đã đặt ở các bước trên.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bây giờ bạn hãy thư vào các đường dẫn sau
   &lt;br&gt;&lt;code&gt;www.nldblog.com/main/android-icon-512x512.png&lt;/code&gt;
   &lt;br&gt;&lt;code&gt;www.nldblog.com/manifest.json&lt;/code&gt;
   &lt;br&gt;&lt;code&gt;www.nldblog.com/sw.js&lt;/code&gt;
   &lt;br&gt;&lt;code&gt;www.nldblog.com/offline.html&lt;/code&gt;
   &lt;br&gt;Nếu truy cập được và không bị chuyển vào link 404 là OK.
&lt;/p&gt;
&lt;h2&gt;Chỉnh sửa trong Blogger&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;Bây giờ truy cập vào &lt;a href=&quot;https://www.blogger.com&quot; target=&quot;_blank&quot;&gt;Blogger&lt;/a&gt; và vào phần Giao diện.&lt;/li&gt;
  &lt;li&gt;Chỉnh sửa HTML.&lt;/li&gt;
  &lt;li&gt;Dán đoạn code dưới đây vào dưới thẻ &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, một số theme là &lt;code&gt;&amp;amp;lt;head&amp;amp;gt;&lt;/code&gt;. Nhớ kiểm tra và xoá bỏ những đoạn code cũ tương tự nếu có.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;link href=&amp;#39;/main/apple-icon-57x57.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;57x57&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-60x60.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;60x60&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-72x72.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;72x72&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-76x76.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;76x76&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-114x114.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;114x114&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-120x120.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;120x120&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-114x114.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;144x144&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-152x152.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;152x152&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/apple-icon-180x180.png&amp;#39; rel=&amp;#39;apple-touch-icon&amp;#39; sizes=&amp;#39;180x180&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/android-icon-192x192.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;192x192&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/favicon-32x32.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;32x32&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/favicon-96x96.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;96x96&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/favicon-16x16.png&amp;#39; rel=&amp;#39;icon&amp;#39; sizes=&amp;#39;16x16&amp;#39; type=&amp;#39;image/png&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/main/favicon.ico&amp;#39; rel=&amp;#39;icon&amp;#39; type=&amp;#39;image/x-icon&amp;#39;/&amp;gt;
&amp;lt;meta content=&amp;#39;#2196f3&amp;#39; name=&amp;#39;msapplication-TileColor&amp;#39;/&amp;gt;
&amp;lt;meta content=&amp;#39;/main/ms-icon-144x144.png&amp;#39; name=&amp;#39;msapplication-TileImage&amp;#39;/&amp;gt;
&amp;lt;meta content=&amp;#39;#2196f3&amp;#39; name=&amp;#39;theme-color&amp;#39;/&amp;gt;
&amp;lt;link href=&amp;#39;/manifest.json&amp;#39; rel=&amp;#39;manifest&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;ol start=&#39;4&#39;&gt;
  &lt;li&gt;Dán tiếp đoạn JavaScript dưới đây vào trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#39;js&#39;&gt;&amp;lt;script&amp;gt;/*&amp;lt;![CDATA[*/ /* Service Worker */ if(&amp;#39;serviceWorker&amp;#39; in navigator){window.addEventListener(&amp;#39;load&amp;#39;,()=&amp;gt;{navigator.serviceWorker.register(&amp;#39;/sw.js&amp;#39;).then(registration=&amp;gt;{console.log(&amp;#39;ServiceWorker registeration successful&amp;#39;)}).catch(registrationError=&amp;gt;{console.log(&amp;#39;ServiceWorker registration failed: &amp;#39;, registrationError)})})}; /*]]&amp;gt;*/&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;ol start=&#39;5&#39;&gt;
  &lt;li&gt;Nhấp Lưu và xem kết quả.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Lời kết&lt;/h2&gt;
&lt;p&gt;Đây là toàn bộ cách xây dựng Progressive Web App cho Blogger, các bạn có thể xem demo bằng cách truy cập &lt;a href=&quot;https://www.nldblog.com/&quot; target=&quot;_blank&quot;&gt;nldblog.com&lt;/a&gt;. Nếu có bất kì vấn đề và câu hỏi nào về bài viết hãy bình luận xuống bên dưới và mình sẽ giải đáp thắc mắc nhanh nhất có thể!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1294702151863832143/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/07/cach-tao-progressive-web-app-pwa-cho-blogger-website.html#comment-form' title='20 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1294702151863832143'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1294702151863832143'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/07/cach-tao-progressive-web-app-pwa-cho-blogger-website.html' title='Cách tạo Progressive Web App (PWA) cho Blogger/Website'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd0g-Z0mGmZaY_mCs5SDpZfY0ATzR4PpFkMFBUnCOCdIXi6XN5p0tG60KgEvobMooKFRkAL7XproJnTVcROpycUZFlYUF_ImI8pFb3W9A0fxCvqObfqUZcc2oj1d12Nxakrlkf4wg1LQzpm54qGiG1GrtWd2Eq6C85l5-t49dKSxamL5MnWNNmtSGU/s72-c-e30-rw/cach-tao-progressive-web-app-pwa-cho-bloggerwebsite.webp" height="72" width="72"/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-3438304312765861996</id><published>2022-06-21T14:49:00.018+07:00</published><updated>2023-10-31T11:36:36.711+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>20 Mẹo và Thủ Thuật cho Thiết Kế và Phát Triển Blogger Template</title><content type='html'>&lt;p&gt;Xin chào các bạn, trong bài viết này mình sẽ chia sẻ cho các bạn 20 Mẹo và Thủ Thuật cho mọi người Thiết Kế và Phát Triển Blogger Template mà mình biết kể từ khi làm Blogspot cho các bạn để giúp các bạn có thêm kiến thức về Thiết Kế và Phát Triển giao diện hay template Blogger. Có những mẹo có thể rất ít người biết hoặc không để ý nhưng nó giúp ích rất nhiều cho các bạn.&lt;/p&gt;
&lt;p&gt;Hãy cùng bắt đầu tìm hiểu về 20 Mẹo và Thủ Thuật mà mình nói để có thể giúp ích cho các bạn nhé!&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;20 Mẹo và Thủ Thuật cho mọi người Thiết Kế và Phát Triển Blogger Template&quot; title=&quot;20 Mẹo và Thủ Thuật cho mọi người Thiết Kế và Phát Triển Blogger Template&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCmKoX1T-ju_LjEjz1vN1A_kPZnx7TdvdGslFUUFieGfHnhXSeMrXQpTgnVfgW-FdaJ9iUXidBNT6ia5rXDLV1Wj1VhkmJFayKlovC0-yw8sF22a4aUUaD-Hll-EF5QYMxWE-TxwEm1QG7QlwzpCN2FKA85x2v1GLvtUu1baElTKdvV670PfHtivQZ/s600-rw/20-meo-va-thu-thuat-cho-moi-nguoi-thiet-ke-va-phat-trien-blogger-template.webp&quot;/&gt;&lt;/div&gt;
&lt;h2&gt;Đảo ngược 1 vòng lặp&lt;/h2&gt;
&lt;p&gt;Các bạn có thể đạo ngược thứ tự 1 vòng lặp bằng cách thêm &lt;code&gt;reverse=&#39;true&#39;&lt;/code&gt; vào trong thẻ loop như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:loop reverse=&amp;#39;true&amp;#39; values=&amp;#39;data:array&amp;#39; var=&amp;#39;object&amp;#39;&amp;gt;
...
&amp;lt;/b:loop&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Vô hiệu hoá hiển thị HTML Comment&lt;/h2&gt;
&lt;p&gt;Các bạn có thể tắt hay vô hiệu hoá hiển thị các comment HTML. Các comment sẽ chỉ hiển thị trong giao diện chỉnh sửa XML của Blogger nhưng không hiển thị trong HTML ở trang web khi bạn xem code. Để làm như vậy, các bạn cần thêm &lt;code&gt;render=&#39;false&#39;&lt;/code&gt; vào những thẻ comment như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:comment render=&amp;apos;false&amp;apos;&amp;gt;
        Your comment
&amp;lt;/b:comment&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Tạo 1 Object tuỳ chỉnh và lấy giá trị của nó&lt;/h2&gt;
&lt;p&gt;Các bạn có thể tạo 1 Object tùy chỉnh và lấy các giá trị của nó như sau:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;b:with value=&amp;#39;{item1: &amp;quot;Value&amp;quot;, item2: &amp;quot;value&amp;quot;}&amp;#39; var=&amp;#39;object&amp;#39;&amp;gt; &amp;lt;data:object.item1/&amp;gt; &amp;lt;data:object.item2/&amp;gt; &amp;lt;/b:with&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Ẩn 1 widget hay tiện ích đang hoạt động.&lt;/h2&gt;
&lt;p&gt;Các bạn có thể ẩn bất kỳ tiện ích nào trên website của mình bằng cách thêm &lt;code&gt;cond=&#39;false&#39;&lt;/code&gt; như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:widget cond=&amp;#39;false&amp;#39; id=&amp;#39;HTML1&amp;#39; type=&amp;#39;HTML&amp;#39;&amp;gt;
...
&amp;lt;/b:widget&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Tính toán các biểu thức toán học&lt;/h2&gt;
&lt;p&gt;Các bạn cũng có thể thực hiện các phép tính giá trị trong toán học và hiển thị ra kết quả của chúng như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;(10 + 3 ) * 2&amp;#39; /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Hiển thị Tiện Ích trên 1 Trang Cụ Thể:&lt;/h2&gt;
&lt;p&gt;Các bạn có thể ẩn hoặc hiển thị các tiện ích blogger cụ thể nào đó trên các trang blogger cụ thể. Ví dụ như:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:widget cond=&amp;#39;data:view.isHomepage&amp;#39; id=&amp;#39;HTML1&amp;#39; type=&amp;#39;HTML&amp;#39;&amp;gt;
...
&amp;lt;/b:widget&amp;gt;&lt;/pre&gt;
&lt;p&gt;isHomepage có nghĩa là tiện ích sẽ chỉ hiển thị tại trang chủ, các bạn có thể đọc thêm, &lt;a href=&quot;https://www.nldblog.com/2021/07/tim-hieu-ve-the-dieu-kien-va-tong-hop-cac-the-dieu-kien-blogger.html&quot; target=&quot;_blank&quot;&gt;Tìm hiểu về thẻ điều kiện và tổng hợp các thẻ điều kiện blogger/blogspot mới nhất&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Giới hạn độ dài của 1 chuỗi kí tự&lt;/h2&gt;
&lt;p&gt;Các bạn có thể giới hạn độ dài của chuỗi ký tự bất kỳ nào, đặc biệt khi các bạn tóm tắt 1 văn bản dài. Bạn có thể tạo các đoạn trích ngắn bằng cách giới hạn số ký tự như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;data:post.body snippet { length: 250 }&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;Trong trường hợp này, chúng ta giới hạn 250 tự từ nội dung bài đăng.&lt;/p&gt;
&lt;h2&gt;Xem độ dài của 1 chuỗi ký tự&lt;/h2&gt;
&lt;p&gt;Chúng ta có thể tính toán độ dài của chuỗi ký tự trong blogger như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;data:view.title.length&amp;#39; /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Làm tròn kết quả của phép chia&lt;/h2&gt;
&lt;p&gt;Chúng ta có thể sử dụng một thủ thuật đơn giản như sau để làm trong một phép chia trong blogger.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;(13 - (13 % 3)) / 3&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Hiển thị 1 giá trị của data trong HTML Comment&lt;/h2&gt;
&lt;p&gt;Có vẻ đơn giản nhưng các bạn có thể sử dụng bất kỳ thẻ XML nào của blogger bên trong thẻ nhận xét.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:comment render=&amp;#39;true&amp;#39;&amp;gt;
    &amp;lt;data:view.title/&amp;gt;
&amp;lt;/b:comment&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Giới hạn số vòng lặp trong thẻ loop&lt;/h2&gt;
&lt;p&gt;Các bạn có thể giới hạn số lần lặp trong một vòng lặp loop. Nói cách đơn giản, các bạn có thể giới hạn số lượng kết quả của một vòng lặp.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:loop values=&amp;#39;data:array limit 4&amp;#39; var=&amp;#39;object&amp;#39;&amp;gt;
...
&amp;lt;/b:loop&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Đảo ngược giá trị của Boolean&lt;/h2&gt;
&lt;p&gt;Các bạn có thể đảo ngược giá trị của boolean trong trường hợp bạn muốn.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;not true&amp;#39; /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Thay đổi định dạng hiển thị của ngày&lt;/h2&gt;
&lt;p&gt;Các bạn có thể sửa đổi hoặc thay đổi định dạng của ngày bằng thủ thuật sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;format (data:post.date, &amp;quot;dd/MM/YYYY&amp;quot;)&amp;#39; /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Thay đổi kích thước hoặc cắt hình ảnh&lt;/h2&gt;
&lt;p&gt;Các bạn có thể thay đổi kích thước hoặc cắt hình ảnh mặc định của blogger theo kích thước yêu cầu của các bạn như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;img expr:src=&amp;#39;resizeImage(data:view.featuredImage, 600, &amp;quot;16:9&amp;quot;)&amp;#39; /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Thêm tham số vào đường dẫn URL&lt;/h2&gt;
&lt;p&gt;Các bạn có thể thêm tham số tùy chỉnh vào bất kỳ liên kết hoặc URL nào như sau:/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;a expr:href=&amp;#39;data:view.url params { hl: &amp;quot;en&amp;quot; }&amp;#39;&amp;gt;
    LINK 
&amp;lt;/a&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Hiển thị hoặc Ẩn Phần tử HTML theo điều kiện&lt;/h2&gt;
&lt;p&gt;Các bạn có thể hiển thị hoặc ẩn phần tử HTML dựa trên các điều kiện.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b: tag cond=&amp;#39;data:view.ispost&amp;#39; name=&amp;#39;div&amp;#39;&amp;gt; &amp;lt;/b: tag&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Tạo một thẻ động&lt;/h2&gt;
&lt;p&gt;Thẻ động ở đây có nghĩa là thẻ tag đó sẽ thay đổi khi hiển thị tại các trang điều kiện khác nhau. Các bạn có thể tự quyết định có thêm thẻ HTML đó hay không.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:tag expr:name=&amp;#39;data:view.isSingleItem ? &amp;quot;h1&amp;quot; : &amp;quot;h2&amp;quot;&amp;gt; &amp;lt;/b:tag&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Xác định giá trị mặc định nếu dữ liệu không tồn tại&lt;/h2&gt;
&lt;p&gt;Các bạn có thể xác định giá trị mặc định của riêng mình nếu không có dữ liệu trong một object.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:eval expr=&amp;#39;data:foo ?: &amp;quot;default value&amp;quot; /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Lấy thuộc tính đầu tiên từ một Mảng mà không cần sử dụng Vòng lặp&lt;/h2&gt;
&lt;p&gt;Nếu các bạn chỉ muốn lấy thuộc tính hay phần tử đầu tiên của một mảng thì bạn không cần sử dụng vòng lặp.&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;b:with value=&amp;#39;data:posts first&amp;#39; var=&amp;#39;post&amp;#39;&amp;gt;
    &amp;lt;data:post.title/&amp;gt;
    &amp;lt;data:post.body /&amp;gt;
&amp;lt;/b:with&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Tắt hay xoá bỏ CSS và JS mặc định của Blogger&lt;/h2&gt;
&lt;p&gt;Nếu CSS hay JavaScript mặc định của Blogger làm cho website của bạn load chậm hay là nó gây ra sung đột khi bạn thiết kế template thì các bạn có thể xoá đi bằng các sử dụng các thuộc tính &lt;code&gt;b:css&lt;/code&gt; cho CSS và &lt;code&gt;b:js&lt;/code&gt; cho JavaScript như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;html b:css=&amp;#39;false&amp;#39; b:js=&amp;#39;false&amp;#39;&amp;gt;
...
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Lời kết&lt;/h3&gt;
&lt;p&gt;Đó là tất cả, mình nghĩ những mẹp và thủ thuật này sẽ giúp các bạn cỏ thể tạo một template blogger chuyên nghiệp và hiệu quả hơn. Nếu có thằng mắc gì các bạn đừng ngại comment xuống phía dưới mình sẽ giải đáp nhanh nhất nếu có thể.&lt;/p&gt;
&lt;b&gt;{fullwidth}&lt;/b&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/3438304312765861996/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/06/20-meo-va-thu-thuat-cho-moi-nguoi-thiet-ke-va-phat-trien-blogger-template.html#comment-form' title='6 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3438304312765861996'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3438304312765861996'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/06/20-meo-va-thu-thuat-cho-moi-nguoi-thiet-ke-va-phat-trien-blogger-template.html' title='20 Mẹo và Thủ Thuật cho Thiết Kế và Phát Triển Blogger Template'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCmKoX1T-ju_LjEjz1vN1A_kPZnx7TdvdGslFUUFieGfHnhXSeMrXQpTgnVfgW-FdaJ9iUXidBNT6ia5rXDLV1Wj1VhkmJFayKlovC0-yw8sF22a4aUUaD-Hll-EF5QYMxWE-TxwEm1QG7QlwzpCN2FKA85x2v1GLvtUu1baElTKdvV670PfHtivQZ/s72-c-rw/20-meo-va-thu-thuat-cho-moi-nguoi-thiet-ke-va-phat-trien-blogger-template.webp" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1642218252340337330</id><published>2022-05-31T14:58:00.021+07:00</published><updated>2023-10-31T11:36:36.710+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog</title><content type='html'>&lt;p&gt;Chào các bạn đã quay lại với Blog chia sẻ thủ thuật, hôm nay trong bài viết này mình sẽ chia sẻ cho các bạn cách tạo Accordion sử dụng code HTML, CSS và JavaScript có Responsive. Bài viết gần đây về chia sẻ code của mình là &lt;a href=&quot;https://www.nldblog.com/2022/04/code-hieu-ung-chu-danh-may-dep-cho-blog-su-dung-html-css-va-javascript.html&quot; target=&quot;_blank&quot;&gt;Code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript&lt;/a&gt; các bạn có thể đọc thêm tham khảo!&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog&quot; title=&quot;Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7FMosvv-htGz2KqKG1VCpTfHyo058mNnd1ABNkimkIyHWJXXIyBKBB997_79q3Dsi1UB5ZelXLAYE8DPUW-QU_q0Ky7wldBHGigqeMUlJqHsSAcVfuNbW6iCFgqmIkGRAtt5JFyBPhoBBflY8qH1Rb2b93oXOrUZcCOXNb9CUmtEz6zLqcd1-FV5q/s600-rw/tao-accordion-su-dung-code-html--css-va-javascript-cho-website-blog.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Accordion là dạng tiêu đề mô tả với chức năng mở và đóng mô tả.&lt;/p&gt;
&lt;p&gt;Về cơ bản, mô tả của accordion ở trạng thái ẩn và chúng ta phải nhấp vào phần tiêu đề để hiện mô tả. Mỗi tiêu đề của accordion có mô tả riêng. Accordion có thể được chứa nhiều nội dung văn bản khác nhau, ví dụ như Câu hỏi thường gặp.&lt;/p&gt;
&lt;h4&gt;Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog&lt;/h4&gt;
&lt;p&gt;Sau đây là source code Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog, mình sẽ chia sẻ code HTML và JavaScript là chính còn CSS thì mình sẽ chỉ để ở mức độ tham khảo và các bạn cần phải chỉnh sử CSS hay tuỳ biến cho phù hợn với Blog của các bạn.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;HTML Code:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div class=&amp;quot;accordion&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;accordion-content&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;a-header&amp;quot;&amp;gt;
      &amp;lt;span class=&amp;quot;a-title&amp;quot;&amp;gt;What do you mean by Accordion?&amp;lt;/span&amp;gt;
      &amp;lt;i class=&amp;quot;fa-solid fa-plus&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;p class=&amp;quot;a-description&amp;quot;&amp;gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;accordion-content&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;a-header&amp;quot;&amp;gt;
      &amp;lt;span class=&amp;quot;a-title&amp;quot;&amp;gt;What do you mean by Accordion?&amp;lt;/span&amp;gt;
      &amp;lt;i class=&amp;quot;fa-solid fa-plus&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;p class=&amp;quot;a-description&amp;quot;&amp;gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;accordion-content&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;a-header&amp;quot;&amp;gt;
      &amp;lt;span class=&amp;quot;a-title&amp;quot;&amp;gt;What do you mean by Accordion?&amp;lt;/span&amp;gt;
      &amp;lt;i class=&amp;quot;fa-solid fa-plus&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;p class=&amp;quot;a-description&amp;quot;&amp;gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iusto neque, sed inventore illum ut quis ducimus deleniti temporibus maiores? At nisi sed pariatur cupiditate quidem quod adipisci aut, eos quis minima voluptates non veniam ipsam quasi architecto ducimus error eum id ab, suscipit doloribus, ut accusantium consequuntur voluptate! Unde, hic sed rerum officia totam id libero officiis nihil rem sequi porro labore praesentium repudiandae a blanditiis molestias nisi beatae natus! Ea, ut voluptates, natus harum nesciunt odio hic eveniet reprehenderit veritatis, possimus tempora magni soluta eaque quidem neque maxime nostrum sapiente commodi? Earum ex cumque cupiditate dicta, tempora temporibus quaerat.
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;accordion-content&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;a-header&amp;quot;&amp;gt;
      &amp;lt;span class=&amp;quot;a-title&amp;quot;&amp;gt;What do you mean by Accordion?&amp;lt;/span&amp;gt;
      &amp;lt;i class=&amp;quot;fa-solid fa-plus&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;p class=&amp;quot;a-description&amp;quot;&amp;gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;CSS Code&lt;/b&gt; chèn vào trước thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;&amp;lt;style&amp;gt;/*&amp;lt;![CDATA[*/
  .accordion .accordion-content{margin:10px 0;border-radius:4px;background:#FFF7F0;border:1px solid #FFD6B3;overflow:hidden}
  .accordion-content:nth-child(2){background-color:#F0FAFF;border-color:#CEF}
  .accordion-content:nth-child(3){background-color:#FFF0F3;border-color:#FFCCD6}
  .accordion-content:nth-child(4){background-color:#F0F0FF;border-color:#CCF}
  .accordion-content.open{padding-bottom:10px}
  .accordion-content .a-header{display:flex;min-height:50px;padding:0 15px;cursor:pointer;align-items:center;justify-content:space-between;transition:all .2s linear}
  .accordion-content.open .a-header{min-height:35px}
  .accordion-content .a-header .a-title{font-size:14px;font-weight:500;color:#333}
  .accordion-content .a-header i{font-size:15px;color:#333}
  .accordion-content .a-description{height:0;margin:0!important;font-size:12px;color:#333;font-weight:400;padding:0 15px;transition:all .2s linear}
/*]]&amp;gt;*/&amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;p&gt;Thêm thư viện &lt;b&gt;font awesome&lt;/b&gt; vào trước thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css&amp;quot;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;JavaScript Code chèn vào trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
  const accordionContent = document.querySelectorAll(&amp;quot;.accordion-content&amp;quot;);

  accordionContent.forEach((item, index) =&amp;gt; {
    let header = item.querySelector(&amp;quot;.a-header&amp;quot;);
    header.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt;{
      item.classList.toggle(&amp;quot;open&amp;quot;);

      let description = item.querySelector(&amp;quot;.a-description&amp;quot;);
      if(item.classList.contains(&amp;quot;open&amp;quot;)){
        description.style.height = `${description.scrollHeight}px`;
        item.querySelector(&amp;quot;i&amp;quot;).classList.replace(&amp;quot;fa-plus&amp;quot;, &amp;quot;fa-minus&amp;quot;);
      }else{
        description.style.height = &amp;quot;0px&amp;quot;;
        item.querySelector(&amp;quot;i&amp;quot;).classList.replace(&amp;quot;fa-minus&amp;quot;, &amp;quot;fa-plus&amp;quot;);
      }
      removeOpen(index);
    })
  })

  function removeOpen(index1){
    accordionContent.forEach((item2, index2) =&amp;gt; {
      if(index1 != index2){
        item2.classList.remove(&amp;quot;open&amp;quot;);

        let des = item2.querySelector(&amp;quot;.a-description&amp;quot;);
        des.style.height = &amp;quot;0px&amp;quot;;
        item2.querySelector(&amp;quot;i&amp;quot;).classList.replace(&amp;quot;fa-minus&amp;quot;, &amp;quot;fa-plus&amp;quot;);
      }
    })
  }
//]]&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Thế là mình đã chia sẻ xong cho các bạn &lt;b&gt;Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog&lt;/b&gt;. Các bạn có vấn đề gì liên quan đến code trong bài viết thì có thể comment xuống dưới mình sẽ hỗ trợ nhanh nhất. Các bạn xem demo code dưới đây nhé:&lt;/p&gt;
&lt;div class=&quot;accordion&quot;&gt;
  &lt;div class=&quot;accordion-content&quot;&gt;
    &lt;div class=&quot;a-header&quot;&gt;
      &lt;span class=&quot;a-title&quot;&gt;What do you mean by Accordion?&lt;/span&gt;
      &lt;i class=&quot;fa-solid fa-plus&quot;&gt;&lt;/i&gt;
    &lt;/div&gt;

    &lt;p class=&quot;a-description&quot;&gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;accordion-content&quot;&gt;
    &lt;div class=&quot;a-header&quot;&gt;
      &lt;span class=&quot;a-title&quot;&gt;What do you mean by Accordion?&lt;/span&gt;
      &lt;i class=&quot;fa-solid fa-plus&quot;&gt;&lt;/i&gt;
    &lt;/div&gt;

    &lt;p class=&quot;a-description&quot;&gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;accordion-content&quot;&gt;
    &lt;div class=&quot;a-header&quot;&gt;
      &lt;span class=&quot;a-title&quot;&gt;What do you mean by Accordion?&lt;/span&gt;
      &lt;i class=&quot;fa-solid fa-plus&quot;&gt;&lt;/i&gt;
    &lt;/div&gt;

    &lt;p class=&quot;a-description&quot;&gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iusto neque, sed inventore illum ut quis ducimus deleniti temporibus maiores? At nisi sed pariatur cupiditate quidem quod adipisci aut, eos quis minima voluptates non veniam ipsam quasi architecto ducimus error eum id ab, suscipit doloribus, ut accusantium consequuntur voluptate! Unde, hic sed rerum officia totam id libero officiis nihil rem sequi porro labore praesentium repudiandae a blanditiis molestias nisi beatae natus! Ea, ut voluptates, natus harum nesciunt odio hic eveniet reprehenderit veritatis, possimus tempora magni soluta eaque quidem neque maxime nostrum sapiente commodi? Earum ex cumque cupiditate dicta, tempora temporibus quaerat.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;accordion-content&quot;&gt;
    &lt;div class=&quot;a-header&quot;&gt;
      &lt;span class=&quot;a-title&quot;&gt;What do you mean by Accordion?&lt;/span&gt;
      &lt;i class=&quot;fa-solid fa-plus&quot;&gt;&lt;/i&gt;
    &lt;/div&gt;

    &lt;p class=&quot;a-description&quot;&gt;
      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Natus nobis ut perspiciatis minima quidem nisi, obcaecati, delectus consequatur fuga nostrum iusto ipsam ducimus quibusdam possimus. Maiores non enim numquam voluptatem?
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css&quot;/&gt;
&lt;style&gt;/*&lt;![CDATA[*/
  .accordion .accordion-content{margin:10px 0;border-radius:4px;background:#FFF7F0;border:1px solid #FFD6B3;overflow:hidden}
  .accordion-content:nth-child(2){background-color:#F0FAFF;border-color:#CEF}
  .accordion-content:nth-child(3){background-color:#FFF0F3;border-color:#FFCCD6}
  .accordion-content:nth-child(4){background-color:#F0F0FF;border-color:#CCF}
  .accordion-content.open{padding-bottom:10px}
  .accordion-content .a-header{display:flex;min-height:50px;padding:0 15px;cursor:pointer;align-items:center;justify-content:space-between;transition:all .2s linear}
  .accordion-content.open .a-header{min-height:35px}
  .accordion-content .a-header .a-title{font-size:14px;font-weight:500;color:#333}
  .accordion-content .a-header i{font-size:15px;color:#333}
  .accordion-content .a-description{height:0;margin:0!important;font-size:12px;color:#333;font-weight:400;padding:0 15px;transition:all .2s linear}
/*]]&gt;*/&lt;/style&gt;
&lt;script&gt;//&lt;![CDATA[
  const accordionContent = document.querySelectorAll(&quot;.accordion-content&quot;);
  accordionContent.forEach((item, index) =&gt; {
    let header = item.querySelector(&quot;.a-header&quot;);
    header.addEventListener(&quot;click&quot;, () =&gt;{
      item.classList.toggle(&quot;open&quot;);

      let description = item.querySelector(&quot;.a-description&quot;);
      if(item.classList.contains(&quot;open&quot;)){
        description.style.height = `${description.scrollHeight}px`;
        item.querySelector(&quot;i&quot;).classList.replace(&quot;fa-plus&quot;, &quot;fa-minus&quot;);
      }else{
        description.style.height = &quot;0px&quot;;
        item.querySelector(&quot;i&quot;).classList.replace(&quot;fa-minus&quot;, &quot;fa-plus&quot;);
      }
      removeOpen(index);
    })
  })

  function removeOpen(index1){
    accordionContent.forEach((item2, index2) =&gt; {
      if(index1 != index2){
        item2.classList.remove(&quot;open&quot;);

        let des = item2.querySelector(&quot;.a-description&quot;);
        des.style.height = &quot;0px&quot;;
        item2.querySelector(&quot;i&quot;).classList.replace(&quot;fa-minus&quot;, &quot;fa-plus&quot;);
      }
    })
  }
//]]&gt;&lt;/script&gt;
&lt;b&gt;{featureimage}&lt;/b&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1642218252340337330/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/05/tao-accordion-su-dung-code-html--css-va-javascript-cho-website-blog.html#comment-form' title='6 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1642218252340337330'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1642218252340337330'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/05/tao-accordion-su-dung-code-html--css-va-javascript-cho-website-blog.html' title='Tạo Accordion sử dụng code HTML, CSS và JavaScript cho Website/Blog'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7FMosvv-htGz2KqKG1VCpTfHyo058mNnd1ABNkimkIyHWJXXIyBKBB997_79q3Dsi1UB5ZelXLAYE8DPUW-QU_q0Ky7wldBHGigqeMUlJqHsSAcVfuNbW6iCFgqmIkGRAtt5JFyBPhoBBflY8qH1Rb2b93oXOrUZcCOXNb9CUmtEz6zLqcd1-FV5q/s72-c-rw/tao-accordion-su-dung-code-html--css-va-javascript-cho-website-blog.webp" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-4856040497898918030</id><published>2022-04-07T15:42:00.014+07:00</published><updated>2023-10-31T11:35:20.993+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><title type='text'>Code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript</title><content type='html'>&lt;p&gt;Chào các bạn đến với Blog của mình, trong bài viết ngày hôm nay thì mình sẽ chia sẻ cho các bạn code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript. Các bạn có thể xem demo như ảnh bên dưới và ở cuối bài viết.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript&quot; title=&quot;Code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHiDIjssjZaP3DWPIXc7jaXWQ7bhqg2rFuw3v-HoyxrCKDEy3Z5TuhGHXf2nPdwUzgsOk0q_I9h8XkfzwHllDv6DwnbTPOsz3k53YdMP7moFuwFGnlFwuPg8HfSCxvQg_mBeBdCdIrAr_R41kpPSqE9oe7mOXhXc1Iw9HONpCXWF2zXcKwXxpPG7pZ/s600-rw/code-hieu-ung-chu-danh-may-dep-cho-blog-su-dung-html-css-va-javascript.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Typing text animation hay còn gọi là hiệu ứng gõ văn bản hay chữ đánh máy có nghĩa là văn bản thay đổi tự động giống như hiệu ứng chữ đánh máy và như việc xoá đi rồi đánh lại văn bản.&lt;/p&gt;
&lt;h2&gt;Code hiệu ứng chữ đánh máy&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Các bạn truy cập vào trang chỉnh sửa HTML của Blogger.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Thêm đoạn HTML hiển thị văn bản dạng như sau:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;span class=&amp;quot;text first-text&amp;quot;&amp;gt;I&amp;#39;m a&amp;lt;/span&amp;gt;
&amp;lt;span class=&amp;quot;text sec-text&amp;quot;&amp;gt;Freelancer&amp;lt;/span&amp;gt;&lt;/pre&gt;
&lt;p&gt;Trong đó:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;first-text&lt;/code&gt; là văn bản sẽ không thay đổi.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;sec-text&lt;/code&gt; là văn bản sẽ thay đổi và có hiệu ứng chữ đánh máy&lt;/li&gt;  
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Thêm đoạn JavaScipt sau vào trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
        const text = document.querySelector(&amp;quot;.sec-text&amp;quot;);
        const textLoad = () =&amp;gt; {
            setTimeout(() =&amp;gt; {
                text.textContent = &amp;quot;Freelancer&amp;quot;;
            }, 0);
            setTimeout(() =&amp;gt; {
                text.textContent = &amp;quot;Blogger&amp;quot;;
            }, 4000);
            setTimeout(() =&amp;gt; {
                text.textContent = &amp;quot;YouTuber&amp;quot;;
            }, 8000); //1s = 1000 milliseconds
        }
        textLoad();
        setInterval(textLoad, 12000);
//]]&amp;gt;&amp;lt;/script&amp;gt;  &lt;/pre&gt;
&lt;p&gt;Thay thế nội dung trong đoạn &lt;code&gt;text.textContent&lt;/code&gt; bằng nội dung đánh máy sẽ thay đổi. Các bạn có thể thêm nhiều chữ hơn bằng cách nhân bản hàm &lt;code&gt;setTimeout&lt;/code&gt; và trong đó 1 giây sẽ bằng 1000 mili giây và khoảng các là 4 giây.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 4:&lt;/b&gt; Thêm đoạn CSS sau vào trước thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;&amp;lt;style&amp;gt;/* &amp;lt;![CDATA[ */
.text{position:relative;font-size:30px;font-weight:600}
.text.first-text{color:#333}
.text.sec-text{color:#4070F4}
.text.sec-text:before{content:&amp;quot;&amp;quot;;position:absolute;top:0;left:0;height:100%;width:100%;background-color:#ffffff;border-left:2px solid #4070F4;animation:animate 4s steps(12) infinite}
@keyframes animate{40%,60%{left:calc(100% + 4px)}100%{left:0%}}
/* ]]&amp;gt; */&amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;p&gt;Trong đó:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;color:#333&lt;/code&gt; là màu văn bản hiển thị&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;color:#4070F4&lt;/code&gt; là màu văn và con trỏ đánh máy&lt;/li&gt;  
  &lt;li&gt;&lt;code&gt;background-color:#ffffff&lt;/code&gt; là màu nền giống với mày backgroud nền chứa văn bản&lt;/li&gt;  
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Bước 5:&lt;/b&gt; Bấm lưu lại.&lt;/p&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Vậy là vừa rồi mình đã chia sẻ cho các bạn Code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript trong quá trình thực hiện có vấn đề gì các bạn có thể comment phía bên dưới mình sẽ hỗ trợ. Các bạn có thể xem demo dưới đây.&lt;/p&gt;
&lt;p&gt;
&lt;span class=&quot;text first-text&quot;&gt;I&#39;m a&lt;/span&gt;
&lt;span class=&quot;text sec-text&quot;&gt;Freelancer&lt;/span&gt;
&lt;/p&gt;
&lt;script&gt;//&lt;![CDATA[
  const text = document.querySelector(&quot;.sec-text&quot;);
  const textLoad = () =&gt; {
    setTimeout(() =&gt; {
      text.textContent = &quot;Freelancer&quot;;
    }, 0);
    setTimeout(() =&gt; {
      text.textContent = &quot;Blogger&quot;;
    }, 4000);
    setTimeout(() =&gt; {
      text.textContent = &quot;YouTuber&quot;;
    }, 8000); //1s = 1000 milliseconds
  }
  textLoad();
  setInterval(textLoad, 12000);
  //]]&gt;&lt;/script&gt;  
&lt;style&gt;/* &lt;![CDATA[ */
.text{position:relative;font-size:30px;font-weight:700}
.text.first-text{color:#333}
.text.sec-text{color:#7577a9}
.text.sec-text:before{content:&quot;&quot;;position:absolute;top:0;left:0;height:100%;width:100%;background-color:#ffffff;border-left:2px solid #7577a9;animation:animate 4s steps(12) infinite}
@keyframes animate{40%,60%{left:calc(100% + 4px)}100%{left:0%}}
/* ]]&gt; */&lt;/style&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/4856040497898918030/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/04/code-hieu-ung-chu-danh-may-dep-cho-blog-su-dung-html-css-va-javascript.html#comment-form' title='4 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4856040497898918030'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4856040497898918030'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/04/code-hieu-ung-chu-danh-may-dep-cho-blog-su-dung-html-css-va-javascript.html' title='Code hiệu ứng chữ đánh máy đẹp cho Blog sử dụng HTML CSS và JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHiDIjssjZaP3DWPIXc7jaXWQ7bhqg2rFuw3v-HoyxrCKDEy3Z5TuhGHXf2nPdwUzgsOk0q_I9h8XkfzwHllDv6DwnbTPOsz3k53YdMP7moFuwFGnlFwuPg8HfSCxvQg_mBeBdCdIrAr_R41kpPSqE9oe7mOXhXc1Iw9HONpCXWF2zXcKwXxpPG7pZ/s72-c-rw/code-hieu-ung-chu-danh-may-dep-cho-blog-su-dung-html-css-va-javascript.webp" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1867490888930031667</id><published>2022-04-01T15:45:00.006+07:00</published><updated>2023-10-31T11:38:27.543+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="tien-ich-blogger"/><title type='text'>Chia sẻ code công cụ tạo QR Code sử dụng HTML, CSS và JavaScript</title><content type='html'>&lt;p&gt;Chào các bạn, bài viết hôm nay mình sẽ chia sẻ cho các bạn code công cụ tạo QR Code sử dụng HTML, CSS và JavaScript. Trong bài viết gần đây nhất trên Blog thì mình có chia sẻ &lt;a title=&quot;Cách thêm Lazy Load quảng cáo Google Adsense cho Blog&quot; href=&quot;https://www.nldblog.com/2022/03/cach-them-lazy-load-quang-cao-google-adsense-cho-blog.html&quot; target=&quot;_blank&quot;&gt;Cách thêm Lazy Load quảng cáo Google Adsense cho Blog&lt;/a&gt; và &lt;a href=&quot;https://www.nldblog.com/2022/03/muc-do-quan-trong-cua-dau-ngat-trang-jumb-break-va-so-bai-dang-toi-da-hien-thi-tai-trang-chi-muc.html&quot; title=&quot;Mức độ quan trọng của dấu ngắt trang jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot; target=&quot;_blank&quot;&gt;Mức độ quan trọng của dấu ngắt trang jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục
&lt;/a&gt; các bạn có thể đọc nếu các bạn bỏ qua.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Chia sẻ code công cụ tạo QR Code sử dụng HTML, CSS và JavaScript&quot; title=&quot;Chia sẻ code công cụ tạo QR Code sử dụng HTML, CSS và JavaScript&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUZxVaIJ5jS18Xx4nRmAnH1-gzz2pLIBq4_HXuuTvBTN7Y8gmwHE6M5JTFpWLG_tTi0dFJV5extUwxBqnjDFXKyG8uZ__R9DZ15QP7eYlV7tIC5UOLn82C6mWEupzakIdac1O6ljmKiNDrFk3EniVI28chNBWyDvgnfvpnV88zJeVoSlcb2Bj5O0y2/s600-rw/chia-se-code-cong-cu-tao-qr-code-su-dung-html-css-va-javascript.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Mã QR viết tắt của Quick Response có khả năng lưu trữ nhiều dữ liệu và người dùng có thể dễ dàng truy cập thông tin bằng cách quét mã QR. Trong bài viết này code công cụ tạo QR Code người dùng có thể nhập văn bản hoặc URL để chuyển và tạo mã QR cho nó, để đọc được mã QR thì các bạn cần phải có phần mềm đọc mã hoặc là cộng cụ máy đọc mã QR.&lt;/p&gt;
&lt;h4&gt;Chia sẻ code công cụ tạo QR Code sử dụng HTML, CSS và JavaScript&lt;/h4&gt;
&lt;p&gt;Sau đây là source code của công cụ tạo QR Code, mình sẽ chia sẻ code HTML và JavaScript là chính còn CSS thì mình sẽ chỉ để ở mức độ tham khảo và các bạn cần phải chỉnh sử CSS hay tuỳ biến cho phù hợn với Blog của các bạn.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;HTML Code&lt;/b&gt; chèn vào vị trí bạn muốn hiển thị.&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div class=&amp;quot;qr-wrapper&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;qr-header&amp;quot;&amp;gt;
    &amp;lt;h4&amp;gt;QR Code Generator&amp;lt;/h4&amp;gt;
    &amp;lt;p&amp;gt;Paste a url or enter text to create QR code&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;qr-form&amp;quot;&amp;gt;
    &amp;lt;input type=&amp;quot;qr-text&amp;quot; spellcheck=&amp;quot;false&amp;quot; placeholder=&amp;quot;Enter text or url&amp;quot;&amp;gt;
    &amp;lt;button class=&amp;quot;qr-button&amp;quot;&amp;gt;Generate QR Code&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;qr-code&amp;quot;&amp;gt;
    &amp;lt;img src=&amp;quot;&amp;quot; alt=&amp;quot;qr-code&amp;quot;&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;CSS Code(tham khảo)&lt;/b&gt; chèn vào trước thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;
&amp;lt;style&amp;gt;/* &amp;lt;![CDATA[ */
.qr-wrapper{max-width:100%;background:#fff;border-radius:7px;padding:15px;transition:height .2s ease}
.qr-header h4{font-size:21px;font-weight:500}
.qr-header p{margin-top:5px;color:#575757;font-size:16px}
.qr-wrapper .qr-form{margin:20px 0 25px}
.qr-form :where(input,button){width:100%;height:55px;border:none;outline:none;border-radius:5px;transition:.1s ease}
.qr-form input{font-size:18px;padding:0 17px;border:1px solid #eee;transition:.2s ease}
.qr-form input:focus{border:1px solid #7577a9}
.qr-form input::placeholder{color:#999}
.qr-form button{color:#fff;cursor:pointer;margin-top:20px;font-size:17px;background:#7577a9}
.qr-code{opacity:0;display:none;padding:33px 0;border-radius:5px;align-items:center;pointer-events:none;justify-content:center;border:1px solid #ccc}
.qr-wrapper.active .qr-code{opacity:1;display:flex;pointer-events:auto;transition:opacity .5s .05s ease}
.qr-code img{width:170px}
@media (max-width: 430px) {
.qr-header p{color:#696969}
.qr-form :where(input,button){height:52px}
.qr-code img{width:160px}
}
/* ]]&amp;gt; */&amp;lt;/style&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;JavaScript Code&lt;/b&gt; chèn vào trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;
&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
  const qrWrapper = document.querySelector(&amp;quot;.qr-wrapper&amp;quot;),
qrInput = qrWrapper.querySelector(&amp;quot;.qr-form input&amp;quot;),
generateBtn = qrWrapper.querySelector(&amp;quot;.qr-form button&amp;quot;),
qrImg = qrWrapper.querySelector(&amp;quot;.qr-code img&amp;quot;);
let preValue;
generateBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    let qrValue = qrInput.value.trim();
    if(!qrValue || preValue === qrValue) return;
    preValue = qrValue;
    generateBtn.innerText = &amp;quot;Generating QR Code...&amp;quot;;
    qrImg.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&amp;amp;data=${qrValue}`;
    qrImg.addEventListener(&amp;quot;load&amp;quot;, () =&amp;gt; {
        qrWrapper.classList.add(&amp;quot;active&amp;quot;);
        generateBtn.innerText = &amp;quot;Generate QR Code&amp;quot;;
    });
});

qrInput.addEventListener(&amp;quot;keyup&amp;quot;, () =&amp;gt; {
    if(!qrInput.value.trim()) {
        qrWrapper.classList.remove(&amp;quot;active&amp;quot;);
        preValue = &amp;quot;&amp;quot;;
    }
});
//]]&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Thế là xong toàn bộ code để tạo công cụ tạo QR Code sử dụng HTML, CSS và JavaScrip mình đã chia sẻ ở trên. Các bạn có vấn đề gì liên quan đến code trong bài viết thì có thể comment xuống dưới mình sẽ hỗ trợ nhanh nhất. Và các bạn cũng có thể sử dụng thử công cụ demo ở bên dưới đây:&lt;/p&gt;
&lt;div class=&quot;qr-wrapper&quot;&gt;
  &lt;div class=&quot;qr-header&quot;&gt;
    &lt;h4&gt;QR Code Generator&lt;/h4&gt;
    &lt;p&gt;Paste a url or enter text to create QR code&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;qr-form&quot;&gt;
    &lt;input type=&quot;qr-text&quot; spellcheck=&quot;false&quot; placeholder=&quot;Enter text or url&quot;&gt;
    &lt;button class=&quot;qr-button&quot;&gt;Generate QR Code&lt;/button&gt;
  &lt;/div&gt;
  &lt;div class=&quot;qr-code&quot;&gt;
    &lt;img src=&quot;&quot; alt=&quot;qr-code&quot;&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;//&lt;![CDATA[
  const qrWrapper = document.querySelector(&quot;.qr-wrapper&quot;),
qrInput = qrWrapper.querySelector(&quot;.qr-form input&quot;),
generateBtn = qrWrapper.querySelector(&quot;.qr-form button&quot;),
qrImg = qrWrapper.querySelector(&quot;.qr-code img&quot;);
let preValue;
generateBtn.addEventListener(&quot;click&quot;, () =&gt; {
    let qrValue = qrInput.value.trim();
    if(!qrValue || preValue === qrValue) return;
    preValue = qrValue;
    generateBtn.innerText = &quot;Generating QR Code...&quot;;
    qrImg.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&amp;data=${qrValue}`;
    qrImg.addEventListener(&quot;load&quot;, () =&gt; {
        qrWrapper.classList.add(&quot;active&quot;);
        generateBtn.innerText = &quot;Generate QR Code&quot;;
    });
});

qrInput.addEventListener(&quot;keyup&quot;, () =&gt; {
    if(!qrInput.value.trim()) {
        qrWrapper.classList.remove(&quot;active&quot;);
        preValue = &quot;&quot;;
    }
});
//]]&gt;&lt;/script&gt;
&lt;style&gt;/* &lt;![CDATA[ */
.qr-wrapper{max-width:100%;background:#fff;border-radius:7px;padding:15px;transition:height .2s ease}
.qr-header h4{font-size:21px;font-weight:500}
.qr-header p{margin-top:5px;color:#575757;font-size:16px}
.qr-wrapper .qr-form{margin:20px 0 25px}
.qr-form :where(input,button){width:100%;height:55px;border:none;outline:none;border-radius:5px;transition:.1s ease}
.qr-form input{font-size:18px;padding:0 17px;border:1px solid #eee;transition:.2s ease}
.qr-form input:focus{border:1px solid #7577a9}
.qr-form input::placeholder{color:#999}
.qr-form button{color:#fff;cursor:pointer;margin-top:20px;font-size:17px;background:#7577a9}
.qr-code{opacity:0;display:none;padding:33px 0;border-radius:5px;align-items:center;pointer-events:none;justify-content:center;border:1px solid #ccc}
.qr-wrapper.active .qr-code{opacity:1;display:flex;pointer-events:auto;transition:opacity .5s .05s ease}
.qr-code img{width:170px}
@media (max-width: 430px) {
.qr-header p{color:#696969}
.qr-form :where(input,button){height:52px}
.qr-code img{width:160px}
}
/* ]]&gt; */&lt;/style&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1867490888930031667/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/04/chia-se-code-cong-cu-tao-qr-code-su-dung-html-css-va-javascript.html#comment-form' title='3 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1867490888930031667'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1867490888930031667'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/04/chia-se-code-cong-cu-tao-qr-code-su-dung-html-css-va-javascript.html' title='Chia sẻ code công cụ tạo QR Code sử dụng HTML, CSS và JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUZxVaIJ5jS18Xx4nRmAnH1-gzz2pLIBq4_HXuuTvBTN7Y8gmwHE6M5JTFpWLG_tTi0dFJV5extUwxBqnjDFXKyG8uZ__R9DZ15QP7eYlV7tIC5UOLn82C6mWEupzakIdac1O6ljmKiNDrFk3EniVI28chNBWyDvgnfvpnV88zJeVoSlcb2Bj5O0y2/s72-c-rw/chia-se-code-cong-cu-tao-qr-code-su-dung-html-css-va-javascript.webp" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-841656636446775525</id><published>2022-03-30T23:44:00.020+07:00</published><updated>2023-10-31T11:36:36.708+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Mức độ quan trọng của dấu ngắt trang và số bài đăng tối đa tại trang chỉ mục</title><content type='html'>&lt;p&gt;Có thể bạn chưa biết về giới hạn số bài đăng tối đa có thể hiển thị được tại một trang thuộc nhóm trang chỉ mục trong Blogger. Nếu blog bạn thuộc loại trang xuất bản bài đăng thường xuyên hàng ngày lúc đó tổng số bài đăng sẽ rất lớn lên đến con số hàng ngàn, hàng chục ngàn và nhiều hơn nữa.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Mức độ quan trọng của dấu ngắt trang jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot; title=&quot;Mức độ quan trọng của dấu ngắt trang jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijTPn26a0kuPwezHQbvdaclTAEf0y2SRYOf5hMYBL7RF0UcTQF4NplgEbNqjQ8yKyTSGX33KnI3ke0pN7bugr5t2L_XOx2FT5iO1UiqDiH0fE-IpCrnyQgKaBnGXRS_1nrfNKRce-mzfokOq2pvv3P2eYDOKjl9mPiWlqGZKzu9ga0yjGYHepjh0Tr/s600-rw/muc-do-quan-trong-cua-dau-ngat-trang-jumb-break-va-so-bai-dang-toi-da-hien-thi-tai-trang-chi-muc.webp&quot;/&gt;&lt;/div&gt;
&lt;h3&gt;Phân loại trang chỉ mục (index)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Page Type: URL&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trang chủ: /&lt;/li&gt;
&lt;li&gt;Trang các bài đăng cũ hơn: /search&lt;/li&gt;
&lt;li&gt;Trang label: /search/label/LABEL hoặc /search?label=LABEL&lt;/li&gt;
&lt;li&gt;Trang tìm kiếm kết quả: /search?q=từ+khóa&lt;/li&gt;
&lt;li&gt;Trang lưu trữ: /year/month hoặc /year&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Các tham số được sử dụng theo sau url cho loại trang này&lt;/p&gt;
&lt;p&gt;&lt;b&gt;updated-max:&lt;/b&gt; Thời gian xuất bản (định dạng iso8601) bài đăng cuối cùng của trang trước. Ví dụ trang chủ hiển thị 10 bài đăng thì mốc thời gian cho trang tiếp theo (các bài đăng cũ hơn) được lấy từ bài đăng thứ 10 chẳng hạn bài đăng đó có thời gian xuất bản &quot;2019-12-23T03:11:00-08:00&quot; =&amp;gt; thời gian cho các bài đăng tiếp theo /search?updated-max=2019-12-23T03:11:00-08:00&lt;/p&gt;
&lt;p&gt;&lt;b&gt;max-results:&lt;/b&gt; Số mục hay các bài đăng tối đa cho một trang, lưu ý tham số này hiện không áp dụng với trang lưu trữ vì Blogger đã bỏ nó từ 2017&lt;/p&gt;
&lt;p&gt;&lt;b&gt;start:&lt;/b&gt; Bài đầu từ bài đăng thứ mấy tương tự như start-index của url nguồn cấp nhưng có khác biệt nhỏ hơn một số, ví dụ để bắt đầu lấy dữ liệu cho các bài đăng thứ 11 trở đi nếu sử dụng url nguồn cấp thì sử dụng tham số &quot;start-index=11&quot; nhưng nếu sử dụng url trực tiếp sẽ nhỏ hơn một số &quot;start=10&quot;, chẳng hạn hiển thị 10 bài đăng tiếp theo url blog có dạng: &quot;/search?updated-max=2019-12-23T03:11:00-08:00&amp;amp;max-results=10&amp;amp;start=10&quot;. Tương tự như max-results, tham số start&amp;nbsp; không áp dụng với trang lưu trữ và không bắt buộc sử dụng với trang các bài đăng cũ hơn, trang label nhưng riêng với trang tìm kiếm kết quả bắt buộc phải có mới hiển thị đúng số chỉ mục.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Có thể bạn chưa biết:&lt;/b&gt; áp dụng khi tìm kiếm bài viết phạm vi trong một nhãn hoặc nhiều nhãn&lt;/p&gt;
&lt;p&gt;
Hiển thị các bài đăng cho nhiều nhãn: /search/?q=label:LABEL1|label:LABEL2|label:LABEL3&lt;br /&gt;
Hiển thị các bài đăng theo từ khóa tìm kiếm: /search/?q=từ+khóa%20label:LABEL1|label:LABEL2|label:LABEL3&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Giới hạn tối đa số bài đăng của mỗi trang&lt;/h3&gt;
&lt;p&gt;Tại các trang không phải trang chủ mặc định luôn là &lt;b&gt;20&lt;/b&gt; nếu theo sau URL trang không có tham số &lt;b&gt;max-results&lt;/b&gt; với giá trị rõ ràng. Nếu URL trang được thêm tham số &lt;b&gt;max-results&lt;/b&gt; thì con số tối đa mà trang tải hiển thị sô bài là &lt;b&gt;500&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Cả khi có hoặc không có tham số &lt;b&gt;max-results&lt;/b&gt; thì kích thước của tồng số bài đăng cũng không được vượt quá &lt;b&gt;1000 kilobytes (1 Mb)&lt;/b&gt;. Như vậy các bạn đã hiểu vì sao số bài đăng bị thiếu không hiển thị chính xác.&lt;/p&gt;
&lt;h3&gt;Tầm quan trọng của jumb break&lt;/h3&gt;
&lt;p&gt;Jumb break hay dấu ngắt nhảy là biểu tượng trang trên thanh công cụ soạn thảo bài viết, biểu tượng chỉ có bên khung &lt;b&gt;Viết&lt;/b&gt; còn bên khung &lt;b&gt;HTML&lt;/b&gt; chèn bằng dấu &lt;b&gt;&amp;lt;!--more--&amp;gt;&lt;/b&gt;, có tác dụng ngắt (không tải) nội dung đằng sau nó.&lt;/p&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;blogger jumb break icon&quot; class=&quot;lazyload&quot; data-src=&quot;https://www.nldblog.com/images/-opnU74-RbOI/Xhaa4tu2ImI/AAAAAAAAThk/2nFYOSie9RcVizx5dpDLRGUrils2NNU4QCLcBGAsYHQ/s1600/blogger_jumb_break_icon.png&quot; loading=&quot;lazy&quot; src=&quot;https://www.nldblog.com/images/-opnU74-RbOI/Xhaa4tu2ImI/AAAAAAAAThk/2nFYOSie9RcVizx5dpDLRGUrils2NNU4QCLcBGAsYHQ/s24/blogger_jumb_break_icon.png&quot; title=&quot;Tầm quan trọng của jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nút jumb break trên thanh công cụ&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Jumb break nên được chèn sau vài dòng văn bản trên đầu bài viết và không được chèn sau ảnh vì sẽ làm tăng kích thước trang&lt;/p&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;blogger jumb break page&quot; class=&quot;lazyload&quot; data-src=&quot;https://www.nldblog.com/images/-RcYc0RbB0uA/Xhacyc62-zI/AAAAAAAAThw/s1IOMwxrJLsrtVTIIH_76iWbLoVwAjbBwCLcBGAsYHQ/s1600/blogger_jumb_break_page.png&quot; loading=&quot;lazy&quot; src=&quot;https://www.nldblog.com/images/-RcYc0RbB0uA/Xhacyc62-zI/AAAAAAAAThw/s1IOMwxrJLsrtVTIIH_76iWbLoVwAjbBwCLcBGAsYHQ/s24/blogger_jumb_break_page.png&quot; title=&quot;Tầm quan trọng của jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Dấu ngắt nhảy chèn sau vài dòng đầu bài&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Đoạn văn bản bên trên dấu ngắt nhảy được lấy làm đoạn trích tóm tắt của mỗi bài bên ngoài trang chỉ mục. Khi trích xuất HTML bài viết, dấu ngắt nhảy được trích xuất thành liên kết &lt;span class=&quot;cm-tag&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;cm-attribute&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;cm-string&quot;&gt;&quot;more&quot;&lt;/span&gt;&lt;span class=&quot;cm-tag&quot;&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Nếu cạnh đoạn trích mà có liên kết Đọc thêm đó là trong theme đang sử dụng thẻ dữ liệu cho liên kết đọc thêm&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;
&amp;lt;a expr:href=&#39;data:post.hasJumpLink ? data:post.url.canonical fragment &quot;more&quot; : data:post.url.canonical&#39; expr:title=&#39;data:post.title&#39;&amp;gt;
&amp;nbsp; &amp;lt;data:blog.jumpLinkMessage/&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Thẻ dữ liệu văn bản &lt;span class=&quot;cm-blogger-tag&quot;&gt;&amp;lt;data:blog.jumpLinkMessage/&amp;gt;&lt;/span&gt; được lấy từ cấu hình tiện ích Bài đăng trên Blog&lt;/p&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;blogger blog posts widget&quot; class=&quot;lazyload&quot; data-src=&quot;https://www.nldblog.com/images/-FL0NDhvUEP8/XhagEqO4sXI/AAAAAAAATh8/-05lF67jsuAp4sghsaMYM_yFh6A9lcMQACLcBGAsYHQ/s1600/blogger_blog_widget.png&quot; loading=&quot;lazy&quot; src=&quot;https://www.nldblog.com/images/-FL0NDhvUEP8/XhagEqO4sXI/AAAAAAAATh8/-05lF67jsuAp4sghsaMYM_yFh6A9lcMQACLcBGAsYHQ/s24/blogger_blog_widget.png&quot; title=&quot;Tầm quan trọng của jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Định cấu hình tiện ích Bài đăng trên Blog&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Khi trang được tải căn cứ vào giá trị number của tham số &lt;b&gt;max-results&lt;/b&gt; sẽ tải hết số bài đăng nhưng không vượt quá &lt;b&gt;500&lt;/b&gt; và kích thước &lt;b&gt;1 Mb&lt;/b&gt;. Nếu một hoặc nhiều bài đăng &lt;b&gt;không chèn dấu ngắt nhảy&lt;/b&gt;, trang sẽ tải luôn nội dung của bài dẫn đến kích thước trang tăng lên và số bài hiển thị đằng sau của bài đó ít đi&lt;/p&gt;
&lt;p&gt;Ngoài ra Jumb break còn liên quan đến nguồn cấp dữ liệu cho phép quản trị cài đặt cho phép nguồn cấp dữ liệu blog cho đến dấu ngắt để URL nguồn cấp feeds chỉ tải đoạn trích bên trên dấu ngắt tăng tốc độ tải và tránh bị đánh cắp toàn bộ dữ liệu của tất cả bài đăng.&lt;/p&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;blogger feeds settings&quot; class=&quot;lazyload&quot; data-src=&quot;https://www.nldblog.com/images/-zWLaQ_2KTIw/XhaoRHsP4mI/AAAAAAAATiU/wFWM1_nyO-g_b33CqVJ7OzuALqvLwRxaQCLcBGAsYHQ/s1600/blogger_feeds_settings.png&quot; loading=&quot;lazy&quot; src=&quot;https://www.nldblog.com/images/-zWLaQ_2KTIw/XhaoRHsP4mI/AAAAAAAATiU/wFWM1_nyO-g_b33CqVJ7OzuALqvLwRxaQCLcBGAsYHQ/s24/blogger_feeds_settings.png&quot; title=&quot;Tầm quan trọng của jumb break và số bài đăng tối đa hiển thị tại trang chỉ mục&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Cho phép nguồn cấp dữ liệu blog cho đến dấu ngắt&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/841656636446775525/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/03/muc-do-quan-trong-cua-dau-ngat-trang-jumb-break-va-so-bai-dang-toi-da-hien-thi-tai-trang-chi-muc.html#comment-form' title='0 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/841656636446775525'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/841656636446775525'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/03/muc-do-quan-trong-cua-dau-ngat-trang-jumb-break-va-so-bai-dang-toi-da-hien-thi-tai-trang-chi-muc.html' title='Mức độ quan trọng của dấu ngắt trang và số bài đăng tối đa tại trang chỉ mục'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijTPn26a0kuPwezHQbvdaclTAEf0y2SRYOf5hMYBL7RF0UcTQF4NplgEbNqjQ8yKyTSGX33KnI3ke0pN7bugr5t2L_XOx2FT5iO1UiqDiH0fE-IpCrnyQgKaBnGXRS_1nrfNKRce-mzfokOq2pvv3P2eYDOKjl9mPiWlqGZKzu9ga0yjGYHepjh0Tr/s72-c-rw/muc-do-quan-trong-cua-dau-ngat-trang-jumb-break-va-so-bai-dang-toi-da-hien-thi-tai-trang-chi-muc.webp" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-5773261329955754327</id><published>2022-03-30T19:56:00.006+07:00</published><updated>2023-10-31T11:36:36.713+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="google-adsense"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jquery"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách thêm Lazy Load quảng cáo Google Adsense cho Blog</title><content type='html'>&lt;p&gt;Chắc hẳn các bạn đang sử dụng Google Adsense để phân phát quảng cáo trên Blog để kiếm tiền đều biết một điều rằng khi gắn quảng cáo Google Adsense nên Blog nó khiến cho Blog của bạn tải trang chậm đi nếu không muốn nói là rất chậm. Bài viết này mình sẽ chia sẻ cho các bạn cách tối ưu và giúp Blog của bạn tải nhanh hơn khi gắn quảng cáo của Google Adsense và cách mình muốn chia sẻ ở bài viết này là sử dụng Lazy Load. Vậy đầu tiên Lazy Load là gì?&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách thêm Lazy Load quảng cáo Google Adsense cho Blog&quot; title=&quot;Cách thêm Lazy Load quảng cáo Google Adsense cho Blog&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SefYUwI1jLP9YWqy7kOjGlnh5HxEgPKW0aWgm89Lvwu-DbrPQnPdaIzyU_bSpSIhICaiiMOyQCYNJ4wuBGGCNCOUSCs0bDo60fLtGUQeaczw62QAfJB-DQtkiiGJFSIy29ph0x6IKHQ1NXF2oZgAQ0flARx9kMdYKOL77xLB8UodNI8QFx3Yy8mX/s600-rw/cach-them-lazy-load-quang-cao-google-adsense-cho-blog.webp&quot;/&gt;&lt;/div&gt;
&lt;h4&gt;Lazy Load là gì?&lt;/h4&gt;
&lt;p&gt;Lazy load hay lazy loading là 1 kĩ thuật tối ưu khi làm web, thay vì tải toàn bộ trang web và render ngay từ đầu, kỹ thuật này cho phép tải ngay các thành phần cần thiết để hiển thị tới người dùng và trì hoãn các tài nguyên còn lại cho đến khi cần.&lt;/p&gt;
&lt;h4&gt;Ưu điểm của Lazy Loading&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Cải thiện trải nghiệm người dùng.&lt;/li&gt;
&lt;li&gt;Nâng cao website performance.&lt;/li&gt;
&lt;li&gt;Tiết kiệm tài nguyên.&lt;/li&gt;
&lt;li&gt;Gia tăng điểm số đánh giá website.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google cũng luôn khuyên các nhà xuất bản cải thiện tốc đọ tải trang nhanh hơn. Họ luôn phát triển nhiều công cụ và bài viết để giúp các nhà xuất bản cải thiện tốc độ trang web. Để cải thiện tốc độ của trang web, Google khuyên bạn nên Lazy Loading để hạn chế những hình ảnh không xuất hiện tại màn hình đầu tiên.&lt;/p&gt;
&lt;h4&gt;Cách thêm Lazy Load quảng cáo Google Adsense cho Blog&lt;/h4&gt;
&lt;p&gt;Tiếp theo đến với vấn đề chính mình sẽ hướng dẫn hay chia sẻ cho các bạn thêm đoạn code Lazy Load cho Google Adsense để giúp Blog của bạn tải nhanh hơn.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Các bạn truy cập vào trang chỉnh sửa HTML của Blogger.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Tìm và xoá thẻ script của Google Adsense đi, code có dạng:&lt;/p&gt;
&lt;pre class=&#39;xml&#39;&gt;&amp;lt;script async=&amp;#39;async&amp;#39; src=&amp;#39;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;#39;&amp;gt;&amp;lt;script&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Copy và dán đoạn JavaScript bên dưới vào phía trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;
&amp;lt;script&amp;gt;//&amp;lt;![CDATA[ 
window.addEventListener(&amp;quot;scroll&amp;quot;, function() {
    var adsenseCodehay = document.createElement(&amp;quot;script&amp;quot;);
    adsenseCodehay.src = &amp;quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;quot;;
    adsenseCodehay.async = true;
    adsenseCodehay.setAttribute(&amp;#39;crossorigin&amp;#39;, &amp;#39;anonymous&amp;#39;);
    adsenseCodehay.setAttribute(&amp;#39;data-ad-client&amp;#39;, &amp;#39;ca-pub-xxxxxxxxxxxxxxxxx&amp;#39;);
    document.body.appendChild(adsenseCodehay);
}, true);
//]]&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 4:&lt;/b&gt; Thay &lt;code&gt;ca-pub-xxxxxxxxxxxxxxxxx&lt;/code&gt; bằng AdSense Publisher ID của bạn.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bước 5:&lt;/b&gt; Bấm lưu và kiểm tra Blog của bạn.&lt;/p&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Vậy là xong, mình vừa chia sẻ cho các bạn &lt;b&gt;Cách thêm Lazy Load quảng cáo Google Adsense cho Blog&lt;/b&gt;. Nếu có vấn đề gì khi thực hiện hay lỗi gì các bạn có thể comment xuống phía bên dưới bài viết mình sẽ hỗ trợ các bạn!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/5773261329955754327/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/03/cach-them-lazy-load-quang-cao-google-adsense-cho-blog.html#comment-form' title='0 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/5773261329955754327'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/5773261329955754327'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/03/cach-them-lazy-load-quang-cao-google-adsense-cho-blog.html' title='Cách thêm Lazy Load quảng cáo Google Adsense cho Blog'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SefYUwI1jLP9YWqy7kOjGlnh5HxEgPKW0aWgm89Lvwu-DbrPQnPdaIzyU_bSpSIhICaiiMOyQCYNJ4wuBGGCNCOUSCs0bDo60fLtGUQeaczw62QAfJB-DQtkiiGJFSIy29ph0x6IKHQ1NXF2oZgAQ0flARx9kMdYKOL77xLB8UodNI8QFx3Yy8mX/s72-c-rw/cach-them-lazy-load-quang-cao-google-adsense-cho-blog.webp" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-4511976029393440630</id><published>2022-03-29T17:03:00.040+07:00</published><updated>2023-10-31T11:36:36.712+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="google-adsense"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Cách thêm quảng cáo cố định dưới góc màn hình giống Google Adsense</title><content type='html'>&lt;p&gt;Chắc hẳn ít nhiều các bạn đã và đang kiếm tiền bằng cách hiển thị quảng cáo trên Blog của mình đều đã biết đến một mạng quảng cáo uy tín và chất lượng đó là Google Adsense. Ở Google Adsense thì chắc chắn các bạn đều biết đến quảng cáo tự động.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Cách thêm quảng cáo cố định ở dưới góc màn hình giống Google Adsense cho Blog&quot; title=&quot;Cách thêm quảng cáo cố định ở dưới góc màn hình giống Google Adsense cho Blog&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrwPK746YWroSuHrqTJCOaOAEAfQVwTAsD6epKwcrtxI9jZVNR9v0dAUa4hXXCmsq60dw__wk8TVrkiV4FyTGiXu_cbyZ9qjKpHdLAgXf4JecDWMC4BGlS2l-W8RATruRGE6AOiQ4FHo3ShBhqj8TS4XEMaVgc8V8hz7vGseYywMzL1wJLlTo1sUo7/s600-rw/cach-them-quang-cao-co-dinh-o-duoi-goc-man-hinh-giong-google-adsense-cho-blog.webp&quot;/&gt;&lt;/div&gt;
&lt;blockquote&gt;Quảng cáo tự động giúp bạn kiếm tiền từ nội dung của mình một cách đơn giản và sáng tạo. Với Quảng cáo tự động, bạn chỉ cần đặt một đoạn mã trên tất cả các trang trong trang web của mình. Sau đó, Quảng cáo tự động sẽ quét trang web và tự động đặt quảng cáo ở những nơi quảng cáo có khả năng hoạt động hiệu quả và có tiềm năng tăng doanh thu.&lt;/blockquote&gt;
&lt;p&gt;Về lợi ích của quảng cáo tự động thì có rất nhiều như: có thể giúp bạn tăng doanh thu, dễ sử dụng, cho phép điều chỉnh quảng cáo để phù hợp với trang web và thân thiện với thiết bị di động. Nhắc đến thân thiện với thiết bị di động thì có một loại quảng cáo rất phổ biến đó là quảng cáo cố định ở dưới góc màn hình.&lt;/p&gt;
&lt;h4&gt;Hướng dẫn thêm quảng cáo cố định ở dưới góc màn hình giống Google Adsense cho Blog&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Vào chỉnh sửa HTML của Chủ đề và chèn đoạn code CSS dưới đây vào trước thẻ &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;
&amp;lt;style&amp;gt;/* &amp;lt;![CDATA[ */
.stickyads-bottom{position:fixed;bottom:0;left:0;right:0;min-height:70px;max-height:200px;padding:5px;box-shadow:0 -6px 18px 0 rgba(9,32,76,.1);transition:all .1s ease;display:flex;align-items:center;justify-content:center;background:#fffdfc;z-index:100;border-top:1px solid #e6e6e6}
.stickyads-close{width:40px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:12px 0 0;border:1px solid #e6e6e6;border-bottom:0;border-right:0;position:absolute;right:0;top:-30px;background:inherit;cursor:pointer}
.stickyads-close::after{content:&amp;#39;✕&amp;#39;;line-height:18px;font-size:14px}
.stickyads-content{flex-grow:1;overflow:hidden;display:block;position:relative}
.stickyads-input:checked ~ .stickyads-bottom{padding:0;min-height:0}
.stickyads-input:checked ~ .stickyads-bottom .stickyads-content{display:none}
.hidden{display:none}
.stickyads-ncontent{min-height:70px;display:flex;align-items:center;justify-content:center;font-size:13px;color:#989b9f ;border:1px solid #e6e6e6 ;border-radius:3px} 
.stickyads-ncontent::before{content:attr(data-text)}
/* ]]&amp;gt; */&amp;lt;/style&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Tiếp tục tiềm đến thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; và chèn đoạn code HTML dưới đây vào phía trước thẻ &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;
&amp;lt;b:if cond=&amp;#39;data:blog.isMobileRequest&amp;#39;&amp;gt;
&amp;lt;input class=&amp;#39;stickyads-input hidden&amp;#39; id=&amp;#39;stickyadsInput&amp;#39; type=&amp;#39;checkbox&amp;#39;/&amp;gt;
&amp;lt;div class=&amp;#39;stickyads-bottom&amp;#39;&amp;gt;
  &amp;lt;label aria-label=&amp;#39;Close Menu&amp;#39; class=&amp;#39;stickyads-close&amp;#39; for=&amp;#39;stickyadsInput&amp;#39;/&amp;gt;
  &amp;lt;div class=&amp;#39;stickyads-content&amp;#39;&amp;gt;
	&amp;lt;div class=&amp;#39;stickyads-ncontent&amp;#39; data-text=&amp;#39;Quảng cáo ở đây&amp;#39;/&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/b:if&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 3:&lt;/b&gt; Thay quảng cáo của bạn với thẻ &amp;lt;div class=&amp;#39;stickyads-ncontent&amp;#39; data-text=&amp;#39;Quảng cáo ở đây&amp;#39;/&amp;gt; trong đoạn code HTML vừa chèn.&lt;p&gt;
&lt;p&gt;Bấm lưu và kiểm tra hiển thị.&lt;/p&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Code trên sử dụng hoàn toàn là HTML và CSS không sự dụng đến JavaScript hay JQuery nên không ảnh hước đến tốc độ tải trang mà có thì là do quảng cáo của các bạn. Nếu có vấn đề gì hãy code lỗi các bạn có thể comment ở dưới mình sẽ phản hồi và hỗ trợ.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/4511976029393440630/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/03/cach-them-quang-cao-co-dinh-o-duoi-goc-man-hinh-giong-google-adsense-cho-blog.html#comment-form' title='0 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4511976029393440630'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4511976029393440630'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/03/cach-them-quang-cao-co-dinh-o-duoi-goc-man-hinh-giong-google-adsense-cho-blog.html' title='Cách thêm quảng cáo cố định dưới góc màn hình giống Google Adsense'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrwPK746YWroSuHrqTJCOaOAEAfQVwTAsD6epKwcrtxI9jZVNR9v0dAUa4hXXCmsq60dw__wk8TVrkiV4FyTGiXu_cbyZ9qjKpHdLAgXf4JecDWMC4BGlS2l-W8RATruRGE6AOiQ4FHo3ShBhqj8TS4XEMaVgc8V8hz7vGseYywMzL1wJLlTo1sUo7/s72-c-rw/cach-them-quang-cao-co-dinh-o-duoi-goc-man-hinh-giong-google-adsense-cho-blog.webp" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-1976384034569405032</id><published>2022-03-29T11:38:00.009+07:00</published><updated>2023-10-31T11:36:36.711+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jquery"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Chèn mã Google AdSense hiển thị tại vị trí, trang khác nhau vào Blog</title><content type='html'>&lt;p&gt;Sau khi tài khoản AdSense của bạn được kích hoạt bước tiếp theo bạn cần thiết lập quảng cáo tự động và tạo các mã quảng cáo tùy chỉnh chèn vào các vị trí thích hợp của các trang khác nhau trong Blog. Tùy vào mỗi trang mà lựa chọn mã quảng cáo thích hợp (loại quảng cáo, kích thước tùy chỉnh...)&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;hidden&quot;&gt;
&lt;img alt=&quot;Cách chèn mã quảng cáo AdSense hiển thị tại các vị trí và các trang khác nhau vào Blog&quot; title=&quot;Cách chèn mã quảng cáo AdSense hiển thị tại các vị trí và các trang khác nhau vào Blog&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUxG3NZlE7zsleS4V-c4UChSg0PRxXKlXlLk5HU4WCWhPnawaS3E5e-8b3KHNqk8Rfh0JhssoUyNQ59qMqDPe-to5L6Hjh-yUAh4bDWDobvjaGzZWwl6r74LfSz00qplHHUPD6IipAtXU/s240-rw/insert-the-adsense-ad-code-into-blogspot.webp&quot;&gt;&lt;/div&gt;
&lt;p&gt;Lưu ý:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chèn nhiều mã quảng cáo vào một trang sẽ khiến trang tải chậm và quảng cáo không có giá cao, với mỗi trang chỉ nên chèn tối đa 3 đến 4 mã quảng cáo&lt;/li&gt;
&lt;li&gt;Tuyệt đối không được chèn mã quảng cáo trong menu sổ xuống, hộp thoại popup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hiện tại bên cạnh loại quảng cáo tự động trong các đơn vị quảng cáo có 3 loại quảng cáo (tài khoản mới)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quảng cáo văn bản và quảng cáo hiển thị hình ảnh&lt;/li&gt;
&lt;li&gt;Quảng cáo trong nguồn cấp dữ liệu&lt;/li&gt;
&lt;li&gt;Quảng cáo trong bài viết&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: large;&quot;&gt;Căn cứ vào 3 loại quảng cáo có thể bố trí tại các trang như sau:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Quảng cáo văn bản và quảng cáo hiển thị hình ảnh&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đầu trang chèn trong widget ngay dưới menu lấy kích thước 970x90 sau khi lấy mã sửa 970px thành 100%&lt;/li&gt;
&lt;li&gt;Sidebar chèn trong widget loại hiển thị biểu ngữ dọc, đáp ứng và kích thước tùy chỉnh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Quảng cáo trong nguồn cấp dữ liệu&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chèn vào giữa các bài viết tại trang chủ tùy vào thiết kế mà lấy loại hiển thị phù hợp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Quảng cáo trong bài viết&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chèn trong bài viết dưới tiêu đề, dưới dấu ngắt nháy, vào một vị trí bất kỳ có thể canh giữa bài, dưới chân bài viết, tùy vào thiết kế mà lấy loại hiển thị phù hợp&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: large;&quot;&gt;Hướng dẫn chèn mã quảng cáo&lt;/p&gt;
&lt;p&gt;Phần chèn quảng cáo văn bản và quảng cáo hiển thị hình ảnh đầu trang, bên sidebar đơn giản chỉ cần chèn mã vào widget nên mình không hướng dẫn.&lt;/p&gt;
&lt;p style=&quot;font-size: large;&quot;&gt;Hướng dẫn chèn mã quảng vào giữa các bài viết tại trang chủ&lt;/p&gt;
&lt;p&gt;Ngoài trang chủ các bạn có thể chèn mã quảng vào các trang khác thuộc nhóm trang index, phương pháp này sẽ đặt điều kiện trong vòng lặp các bài viết&lt;/p&gt;
&lt;p&gt;Các bạn vào chỉnh sửa mẫu template chọn chuyển đến tiện ích Blog1 chọn mở rộng cặp thẻ tag &amp;lt;b:includable id=&#39;main&#39;&amp;gt; các bạn thêm index=&#39;item&#39; vào trong thẻ lặp &amp;lt;b:loop values=&#39;data:posts&#39; var=&#39;post&#39;&amp;gt; thành &amp;lt;b:loop index=&#39;item&#39; values=&#39;data:posts&#39; var=&#39;post&#39;&amp;gt;&lt;/p&gt;
&lt;p&gt;Tiếp theo ngay dưới thẻ lặp b:loop này các bạn thêm đoạn code sau&lt;/p&gt;
&lt;pre&gt;
&amp;lt;b:if cond=&#39;data:view.isMultipleItems&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;b:if cond=&#39;data:item==&lt;span style=&quot;color: blue;&quot;&gt;3&lt;/span&gt;&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div class=&#39;post&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;b:if cond=&#39;data:item==&lt;span style=&quot;color: blue;&quot;&gt;6&lt;/span&gt;&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div class=&#39;post&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;lt;/b:if&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Trong đó các số &lt;span style=&quot;color: blue;&quot;&gt;3&lt;/span&gt; và &lt;span style=&quot;color: blue;&quot;&gt;6&lt;/span&gt; là vị trí hiện thị quảng cáo sau bài viết thứ 3 và bài viết thứ 6, nếu trang chủ có nhiều bài chẳng hạn 20 thì các bạn thay đổi vị trí cho hù hợp chẳng hạn sau các bài 5, 10, 15&lt;/p&gt;
&lt;pre&gt;
&amp;lt;b:if cond=&#39;data:view.isMultipleItems&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;b:if cond=&#39;data:item==&lt;span style=&quot;color: blue;&quot;&gt;5&lt;/span&gt;&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div class=&#39;post&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;b:if cond=&#39;data:item==&lt;span style=&quot;color: blue;&quot;&gt;10&lt;/span&gt;&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div class=&#39;post&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;b:if cond=&#39;data:item==&lt;span style=&quot;color: blue;&quot;&gt;15&lt;/span&gt;&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;div class=&#39;post&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/b:if&amp;gt;&lt;br /&gt;
&amp;lt;/b:if&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p style=&quot;font-size: large;&quot;&gt;Hướng dẫn chèn mã quảng cáo vào bài viết&lt;/p&gt;
&lt;p&gt;Các bạn có thể chèn mã quảng cáo dưới tiêu đề (không khuyến khích), dưới dấu ngắt nháy, vào một vị trí bất kỳ có thể canh giữa bài, dưới chân bài viết&lt;/p&gt;
&lt;p&gt;- Chèn dưới tiêu đề: Cái này đơn giản các bạn chỉ cần tìm thẻ tiêu đề &amp;lt;h1&amp;gt; nó thường nằm trong cặp thẻ&amp;nbsp;&amp;lt;b:includable id=&#39;post&#39; var=&#39;post&#39;&amp;gt; chèn mã quảng cáo ngay dưới nó&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Chèn dưới ngắt trang (ngắt nhảy)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Phần này ít bạn để ý chèn dấu ngắt nháy hoặc có bài chèn có bài quên không chèn nhưng không sao bạn vẫn có thể chèn mã quảng cáo bên dưới nếu bài mà bạn thêm dấu ngắt thì quảng cáo hiển thị ngay dưới còn bài không chèn thì không hiển thị quảng cáo. các bạn chèn đoạn mã sau ngay dưới thẻ &amp;lt;data:post.body/&amp;gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class=&#39;adsense1&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;div id=&#39;ads_Code&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Tiếp tục chèn đoạn script sau trước &amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script&amp;gt;//&amp;lt;![CDATA[&lt;br /&gt;
$(function() {&lt;br /&gt;
&amp;nbsp; var more = $(&#39;a[name=&quot;more&quot;]&#39;)&lt;br /&gt;
&amp;nbsp; if (more) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $(&#39;#ads_Code&#39;).appendTo(more)&lt;br /&gt;
&amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $(&#39;.adsense1&#39;).empty()&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
})&lt;br /&gt;
//]]&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Chèn dưới chân bài viết&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Cũng đơn giản các bạn chỉ cần chèn mã quảng cáo ngay trước &amp;lt;div class=&#39;post-footer&#39;&amp;gt;&amp;lt;/div&amp;gt; hoặc ngay dưới thẻ &amp;lt;data:post.body/&amp;gt; đều như nhau vì thẻ này luôn nằm trên post-footer&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Chèn vào một vị trí bất kỳ&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Cách này các bạn chèn id vào vị trí muốn hiển thị quảng cáo có thể giữa bài như sau:&lt;/p&gt;
&lt;p&gt;Chèn đoạn code sau ngay dưới thẻ &amp;lt;data:post.body/&amp;gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class=&#39;adsense2&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;div id=&#39;ads_Body&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Tiếp tục chèn đoạn script sau trước &amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script&amp;gt;//&amp;lt;![CDATA[&lt;br /&gt;
$(function() {&lt;br /&gt;
&amp;nbsp; var ads = document.getElementById(&#39;AdSense&#39;)&lt;br /&gt;
&amp;nbsp; if (ads) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $(&#39;#ads_Body&#39;).appendTo(ads)&lt;br /&gt;
&amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $(&#39;.adsense2&#39;).empty()&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
})&lt;br /&gt;
//]]&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Khi viết bài mới hoặc sửa lại bài cũ các bạn cần thêm đoạn code &amp;lt;div id=&quot;AdSense&quot;&amp;gt;&amp;lt;/div&amp;gt; vào vị trí muốn hiển thị bên khung soạn thảo HTML của bài viết&lt;/p&gt;
&lt;p&gt;Yêu cầu trong template cần có thư viện jquery cái này đa số Blog đều có các bạn kiểm tra nếu không thấy thì chèn trước &amp;lt;/head&amp;gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script src=&#39;https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js&#39;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;Ngoài ra các bạn cũng nên sử dụng điều kiện cho mobile như sau:&lt;/p&gt;
&lt;p&gt;- Điều kiện chỉ tải mã trên mobile (?m=1)&lt;/p&gt;
&lt;pre&gt;
&amp;lt;b:if cond=&#39;data:blog.isMobileRequest&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;lt;/b:if&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;p&gt;- Điều kiện không tải trên mobile (?m=1)&lt;/p&gt;
&lt;pre&gt;
&amp;lt;b:if cond=&#39;!data:blog.isMobileRequest&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;!-- Mã quảng cáo AdSense --&amp;gt;&lt;br /&gt;
&amp;lt;/b:if&amp;gt;&lt;br /&gt;
&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/1976384034569405032/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/03/cach-chen-ma-quang-cao-adsense-hien-thi-tai-cac-vi-tri-va-cac-trang-khac-nhau-vao-blog.html#comment-form' title='2 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1976384034569405032'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/1976384034569405032'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/03/cach-chen-ma-quang-cao-adsense-hien-thi-tai-cac-vi-tri-va-cac-trang-khac-nhau-vao-blog.html' title='Chèn mã Google AdSense hiển thị tại vị trí, trang khác nhau vào Blog'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUxG3NZlE7zsleS4V-c4UChSg0PRxXKlXlLk5HU4WCWhPnawaS3E5e-8b3KHNqk8Rfh0JhssoUyNQ59qMqDPe-to5L6Hjh-yUAh4bDWDobvjaGzZWwl6r74LfSz00qplHHUPD6IipAtXU/s72-c-rw/insert-the-adsense-ad-code-into-blogspot.webp" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-3687848827386330500</id><published>2022-03-02T17:34:00.009+07:00</published><updated>2023-10-31T11:36:36.711+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Chia sẻ code Button Download có Progress Bar</title><content type='html'>&lt;p&gt;Chào các bạn, hôm nay mình sẽ chia sẻ cho các bạn code cho Button Download có Progress Bar cực đẹp. Code sử dụng HTML, CSS và JavaScript. Và Blog mình cũng có nhiều bài viết share code về JavaScript cũng như HTML và CSS bài gần đây nhất &lt;a href=&quot;https://www.nldblog.com/2022/02/chia-se-code-template-thu-vien-anh-voi-lightbox-cho-blogspot.html&quot; target=&quot;_blank&quot;&gt;Chia sẻ code, template thư viện ảnh với Lightbox cho Blogspot&lt;/a&gt; các bạn có thể truy cập để xem.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Chia sẻ code Button Download có Progress Bar&quot; title=&quot;Chia sẻ code Button Download có Progress Bar&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirokjheofkgx--OO1eFX3arfY3ZnxCiBgdvhRkMSaoEYq8GtZ4t_kjj8GpwH0vpXjeIiA35sh5U-RTlnGC7mYCQxfn7Q63onVvTPkTn_HC1QmK2VuVZYTeCaLzrC7fpQ6nKxJmY9GZnHJa_nFXjPfQcyxtX2dBwBVebzVKp74XzSfz1OZroccFXsIA/s600-rw/chia-se-code-button-download-co-progress-bar.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Button Download có Progress Bar là animation xuất hiện sau khi nhấp và hiển thị rằng đường link đang được tải. Hiện tại, hiệu ứng này đang được sử dụng khá nhiều vì nó chiếm ít dung lượng trên trang web và trông rất đẹp, chuyên nghiệp.&lt;/p&gt;
&lt;p&gt;Các bạn có thể xem demo dưới đây, đầu tiên bạn nhìn thấy sẽ là giao diện ban đầu của button và khi bạn nhấp vào nút đó, chiều cao và chiều rộng của nó sẽ được thay đổi thành Progress Bar. Khi Progress Bar hoàn thành tiến trình thì nó sẽ thông báo hoàn tất và chuyển đến link download.&lt;/p&gt;
&lt;div class=&quot;ch-button&quot;&gt;
      &lt;div class=&quot;button-content&quot;&gt;
        &lt;i class=&quot;fa-solid fa-cloud-arrow-down&quot;&gt;&lt;/i&gt;
        &lt;span data-link=&quot;https://www.themebiz.net/&quot; class=&quot;button-text&quot;&gt;Download&lt;/span&gt;
      &lt;/div&gt;
  &lt;/div&gt;
&lt;link href=&quot;https://cdn.jsdelivr.net/gh/hung1001/font-awesome-pro-v6@18657a9/css/all.min.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;  
&lt;style&gt;/* &lt;![CDATA[ */
.ch-button{position:relative;margin:auto auto 0.9375rem;padding:10px;width:40%;min-width:300px;max-width:50%;background:#7D2AE8;border-radius:55px;cursor:pointer;box-shadow:0 5px 10px rgba(0,0,0,0.2);transition:all .4s cubic-bezier(0.68,-0.55,0.265,1.55);overflow:hidden}
.ch-button.active{height:10px;width:40%;min-width:300px;max-width:50%;padding:5px}
.ch-button::before{content:&quot;&quot;;position:absolute;top:0;left:-100%;height:100%;width:100%;background:#5b13b9;border-radius:55px;transition:all 6s ease-in-out}
.ch-button.active::before{animation:layer 6s ease-in-out forwards}
@keyframes layer {
100%{left:0}
}
.ch-button .button-content{height:100%;width:100%;display:flex;align-items:center;justify-content:center;transition:all .2s ease;transition-delay:.2s}
.ch-button.active .button-content{transform:translateY(60px)}
.ch-button .button-content i,.ch-button .button-content .button-text{color:#fff;font-size:20px;font-weight:500}
.ch-button .button-content .button-text{font-size:18px;margin-left:8px}
/* ]]&gt; */&lt;/style&gt;
&lt;script&gt;//&lt;![CDATA[
      const chbutton = document.querySelector(&quot;.ch-button&quot;),
          _link = document.querySelector(&#39;.button-text&#39;);
    if (_link) {

    }
    chbutton.addEventListener(&quot;click&quot;, () =&gt;{
      chbutton.classList.add(&quot;active&quot;);
      chbutton.style.pointerEvents = &quot;none&quot;;
      setTimeout(()=&gt;{
        let _target = _link.getAttribute(&#39;data-link&#39;);
        console.log(_target);
        chbutton.classList.remove(&quot;active&quot;);
        chbutton.querySelector(&quot;i&quot;).classList.replace(&quot;fa-cloud-arrow-down&quot;, &quot;fa-check&quot;);
        chbutton.querySelector(&quot;.button-text&quot;).innerText = &quot;Completed!&quot;;
        setTimeout(()=&gt;{
        window.open(_target, &#39;_blank&#39;);
        setTimeout(()=&gt;{
  		chbutton.querySelector(&quot;i&quot;).classList.replace(&quot;fa-check&quot;, &quot;fa-cloud-arrow-down&quot;)
        chbutton.querySelector(&quot;.button-text&quot;).innerText = &quot;Download&quot;;
        chbutton.style.pointerEvents = &quot;auto&quot;;
         },2000);
          },1000);
      },6000);
    });
//]]&gt;&lt;/script&gt;
&lt;h2&gt;Chia sẻ code Button Download có Progress Bar&lt;/h2&gt;
&lt;p&gt;Để thêm Button Download có Progress Bar vào Blog hay Website các bạn cần thêm code HTML, CSS và JavaScript sau đây vào Blog/Website của các bạn.&lt;/p&gt;
&lt;p&gt;Đầu tiên thêm code HTML vào vị trí hiển thị:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div class=&amp;quot;ch-button&amp;quot;&amp;gt;
      &amp;lt;div class=&amp;quot;button-content&amp;quot;&amp;gt;
        &amp;lt;i class=&amp;quot;fa-solid fa-cloud-arrow-down&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;
        &amp;lt;span data-link=&amp;quot;https://www.themebiz.net/&amp;quot; class=&amp;quot;button-text&amp;quot;&amp;gt;Download&amp;lt;/span&amp;gt;
      &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Tiếp theo thêm code CSS sau:&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;&amp;lt;style&amp;gt;/* &amp;lt;![CDATA[ */
.ch-button{position:relative;margin:auto auto 0.9375rem;padding:10px;width:40%;min-width:300px;max-width:50%;background:#7D2AE8;border-radius:55px;cursor:pointer;box-shadow:0 5px 10px rgba(0,0,0,0.2);transition:all .4s cubic-bezier(0.68,-0.55,0.265,1.55);overflow:hidden}
.ch-button.active{height:10px;width:40%;min-width:300px;max-width:50%;padding:5px}
.ch-button::before{content:&amp;quot;&amp;quot;;position:absolute;top:0;left:-100%;height:100%;width:100%;background:#5b13b9;border-radius:55px;transition:all 6s ease-in-out}
.ch-button.active::before{animation:layer 6s ease-in-out forwards}
@keyframes layer {
100%{left:0}
}
.ch-button .button-content{height:100%;width:100%;display:flex;align-items:center;justify-content:center;transition:all .2s ease;transition-delay:.2s}
.ch-button.active .button-content{transform:translateY(60px)}
.ch-button .button-content i,.ch-button .button-content .button-text{color:#fff;font-size:20px;font-weight:500}
.ch-button .button-content .button-text{font-size:18px;margin-left:8px}
/* ]]&amp;gt; */&amp;lt;/style&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Và chèn thêm thư viên font awesome mới nhất:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;link href=&amp;#39;https://cdn.jsdelivr.net/gh/hung1001/font-awesome-pro-v6@18657a9/css/all.min.css&amp;#39; rel=&amp;#39;stylesheet&amp;#39; type=&amp;#39;text/css&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;Cuối cùng, chèn đoạn JavaScript này vào tiếp website/blog của bạn:&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
      const chbutton = document.querySelector(&amp;quot;.ch-button&amp;quot;),
          _link = document.querySelector(&amp;#39;.button-text&amp;#39;);
    if (_link) {

    }
    chbutton.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt;{
      chbutton.classList.add(&amp;quot;active&amp;quot;);
      chbutton.style.pointerEvents = &amp;quot;none&amp;quot;;
      setTimeout(()=&amp;gt;{
        let _target = _link.getAttribute(&amp;#39;data-link&amp;#39;);
        console.log(_target);
        chbutton.classList.remove(&amp;quot;active&amp;quot;);
        chbutton.querySelector(&amp;quot;i&amp;quot;).classList.replace(&amp;quot;fa-cloud-arrow-down&amp;quot;, &amp;quot;fa-check&amp;quot;);
        chbutton.querySelector(&amp;quot;.button-text&amp;quot;).innerText = &amp;quot;Completed!&amp;quot;;
        setTimeout(()=&amp;gt;{
        window.open(_target, &amp;#39;_blank&amp;#39;);
        setTimeout(()=&amp;gt;{
  		chbutton.querySelector(&amp;quot;i&amp;quot;).classList.replace(&amp;quot;fa-check&amp;quot;, &amp;quot;fa-cloud-arrow-down&amp;quot;)
        chbutton.querySelector(&amp;quot;.button-text&amp;quot;).innerText = &amp;quot;Download&amp;quot;;
        chbutton.style.pointerEvents = &amp;quot;auto&amp;quot;;
         },2000);
          },1000);
      },6000);
    });
//]]&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Xong!&lt;/p&gt;
&lt;h3&gt;Lời kết&lt;/h3&gt;
&lt;p&gt;Đây là tất cả source code để bạn có thể thêm Button Download có Progress Bar trên website/blog của mình bằng cách sử dụng HTML, CSS và JavaScript. Nếu trong quá trình thực hiện gặp lỗi hay code không hoạt động các bạn có thể comment xuống phía dưới mình sẽ phản hồi và giúp đỡ bạn sớm nhất!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/3687848827386330500/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/02/chia-se-code-button-download-co-progress-bar.html#comment-form' title='5 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3687848827386330500'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/3687848827386330500'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/02/chia-se-code-button-download-co-progress-bar.html' title='Chia sẻ code Button Download có Progress Bar'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirokjheofkgx--OO1eFX3arfY3ZnxCiBgdvhRkMSaoEYq8GtZ4t_kjj8GpwH0vpXjeIiA35sh5U-RTlnGC7mYCQxfn7Q63onVvTPkTn_HC1QmK2VuVZYTeCaLzrC7fpQ6nKxJmY9GZnHJa_nFXjPfQcyxtX2dBwBVebzVKp74XzSfz1OZroccFXsIA/s72-c-rw/chia-se-code-button-download-co-progress-bar.webp" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-709311628394817288</id><published>2022-02-19T12:08:00.093+07:00</published><updated>2023-10-31T11:36:36.708+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Chia sẻ code custom menu chuột phải trên website/blog</title><content type='html'>&lt;p&gt;Chào các bạn quay lại với Blog Codehay.net cũng gần 2 tháng rồi mình không ra bài mới, hôm nay bài viết này mình sẽ chia sẻ code custom menu chuột phải sửa dụng HTML, CSS &amp;amp; JavaScript. Bài gần đây nhất của mình là &lt;a href=&quot;https://www.nldblog.com/2022/01/chia-se-code-canh-bao-phat-hien-adblock-su-dung-javascript.html&quot; target=&quot;_blank&quot;&gt;Chia sẻ code cảnh báo phát hiện AdBlock sử dụng Javascript&lt;/a&gt; các bạn có thể truy cập để xem.&lt;/p&gt;
&lt;p&gt;Menu chuột phải sẽ hiệu lên khi các bạn click chuột phải vào vị trí bất kì trên website hay blog của bạn. Và trong menu đó sẽ có những lựa chọn mặc định của trính duyệt đã đưa vào.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Chia sẻ code custom menu chuột phải trên website/blog&quot; title=&quot;Chia sẻ code custom menu chuột phải trên website/blog&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHdhyeSSEfLJmiUAAoONQ9J2Ty9WE7U7vL1XmtQMkgjF7i3ZNFQp81qVN0ICVF5SXcmDDn44g1SOOdd9cGKj6C3MxkBYqpD-UBgY1Wu1jGHm8V0h5HDwqoVMWgpNFB0rqG9r4iJEGL2E5dJCYFBgzZgDpi3KHpVb9NLp9_L2TZo6F3xQwkM_V8yk3H/s600-rw/chia-se-code-custom-menu-chuot-phai-tren-website-blog.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Trong bài viết này code custom menu chuột phải sẽ thay đổi những tuỳ chọn trong menu khi bấm chuột phải và sẽ ẩn đi khi bạn bấm chuột trái và ở trong menu này sẽ có thêm một menu phụ nữa. Các bạn có thể xem demo dưới đây:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://customrightclickcontextmenu.blogspot.com/&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; class=&quot;theme-button preview&quot;&gt;Preview&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Chia sẻ code custom menu chuột phải trên website/blog&lt;/h2&gt;
&lt;p&gt;Để custom menu chuột phải trên website/blog các bạn cần phải chèn những đoạn code HTML, CSS &amp;amp; JavaScript dưới đây vào website/blog của bạn.&lt;/p&gt;
&lt;p&gt;Đầu tiên, chèn đoạn HTML dưới đây:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div class=&amp;#39;context-menu-wrapper&amp;#39;&amp;gt;
&amp;lt;div class=&amp;#39;context-menu-content&amp;#39;&amp;gt;
&amp;lt;ul class=&amp;#39;menu&amp;#39;&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-solid fa-eye&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Preview&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item share&amp;#39;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;i class=&amp;#39;fa-solid fa-share&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Share&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;ul class=&amp;#39;share-menu&amp;#39;&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-brands fa-twitter&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Twitter&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-brands fa-instagram&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Instagram&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-solid fa-basketball&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Dribble&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-brands fa-telegram&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Telegram&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-solid fa-link&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Get Link&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-solid fa-pen-to-square&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Rename&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;#39;item&amp;#39;&amp;gt;
&amp;lt;i class=&amp;#39;fa-solid fa-trash-can&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
&amp;lt;span&amp;gt;Delete&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;Tiếp theo chèn CSS:&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;&amp;lt;style&amp;gt;
.context-menu-wrapper{visibility:hidden;position:absolute;width:300px;border-radius:4px;background:#fff;box-shadow:0 12px 35px rgba(0,0,0,0.1);z-index:9999999999999}
.context-menu-wrapper .menu{padding:5px 0;margin:0!important}
.context-menu-content .item{list-style:none;font-size:18px;height:30px;display:flex;width:100%;cursor:pointer;align-items:center;padding:0 10px}
.context-menu-content .item:hover{background:#f2f2f2}
.context-menu-content .item span{margin-left:8px;font-size:15px}
.context-menu-content .item i{font-size:14px}
.context-menu-content .share{position:relative;justify-content:space-between}
.share .share-menu{position:absolute;background:#fff;width:200px;right:-200px;top:-35px;padding:5px 0;opacity:0;pointer-events:none;border-radius:4px;margin:0!important;box-shadow:0 5px 10px rgba(0,0,0,0.08);transition:.2s ease}
.share:hover .share-menu{opacity:1;pointer-events:auto}
&amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;p&gt;Và chèn thêm thư viên font awesome mới nhất:&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;link href=&amp;#39;https://cdn.jsdelivr.net/gh/hung1001/font-awesome-pro-v6@18657a9/css/all.min.css&amp;#39; rel=&amp;#39;stylesheet&amp;#39; type=&amp;#39;text/css&amp;#39;/&amp;gt;&lt;/pre&gt;
&lt;p&gt;Cuối cùng, chèn đoạn JavaScript này vào tiếp website/blog của bạn:&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
  const contextMenu = document.querySelector(&amp;quot;.context-menu-wrapper&amp;quot;),
shareMenu = contextMenu.querySelector(&amp;quot;.share-menu&amp;quot;);

window.addEventListener(&amp;quot;contextmenu&amp;quot;, e =&amp;gt; {
    e.preventDefault();
    let x = e.offsetX, y = e.offsetY,
    winWidth = window.innerWidth,
    winHeight = window.innerHeight,
    cmWidth = contextMenu.offsetWidth,
    cmHeight = contextMenu.offsetHeight;

    if(x &amp;gt; (winWidth - cmWidth - shareMenu.offsetWidth)) {
        shareMenu.style.left = &amp;quot;-200px&amp;quot;;
    } else {
        shareMenu.style.left = &amp;quot;&amp;quot;;
        shareMenu.style.right = &amp;quot;-200px&amp;quot;;
    }

    x = x &amp;gt; winWidth - cmWidth ? winWidth - cmWidth - 5 : x;
    y = y &amp;gt; winHeight - cmHeight ? winHeight - cmHeight - 5 : y;
    
    contextMenu.style.left = `${x}px`;
    contextMenu.style.top = `${y}px`;
    contextMenu.style.visibility = &amp;quot;visible&amp;quot;;
});

document.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; contextMenu.style.visibility = &amp;quot;hidden&amp;quot;);
    //]]&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;Xong!&lt;/p&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Đây là tất cả source code để bạn có thể custom menu chuột phải trên website/blog của mình bằng cách sử dụng HTML, CSS và JavaScript. Nếu trong quá trình thực hiện gặp lỗi hay code không hoạt động các bạn có thể comment xuống phía dưới mình sẽ phản hồi và giúp đỡ bạn sớm nhất!&lt;/p&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/709311628394817288/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/02/chia-se-code-custom-menu-chuot-phai-tren-website-blog.html#comment-form' title='3 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/709311628394817288'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/709311628394817288'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/02/chia-se-code-custom-menu-chuot-phai-tren-website-blog.html' title='Chia sẻ code custom menu chuột phải trên website/blog'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHdhyeSSEfLJmiUAAoONQ9J2Ty9WE7U7vL1XmtQMkgjF7i3ZNFQp81qVN0ICVF5SXcmDDn44g1SOOdd9cGKj6C3MxkBYqpD-UBgY1Wu1jGHm8V0h5HDwqoVMWgpNFB0rqG9r4iJEGL2E5dJCYFBgzZgDpi3KHpVb9NLp9_L2TZo6F3xQwkM_V8yk3H/s72-c-rw/chia-se-code-custom-menu-chuot-phai-tren-website-blog.webp" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-4840319601661004868</id><published>2022-01-09T21:39:00.034+07:00</published><updated>2023-10-31T11:36:36.713+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="thu-thuat-blogger"/><title type='text'>Chia sẻ code cảnh báo phát hiện AdBlock sử dụng Javascript</title><content type='html'>&lt;p&gt;Xin chào các bạn quay lại với Blog của mình, bài viết hôm nay mình sẽ chia sẻ cho các bạn code hiển cảnh báo phát hiện AdBlock sử dụng Javascript. Bài trước mình có chia sẻ về &lt;a href=&quot;/2021/12/chia-se-code-hien-thi-trinh-phat-nhac-su-dung-javascript.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript
Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript&lt;/a&gt; các bạn có thể vào đọc tham khảo thêm!&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Chia sẻ code cảnh báo phát hiện AdBlock sử dụng Javascript&quot; title=&quot;Chia sẻ code cảnh báo phát hiện AdBlock sử dụng Javascript&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdvo8Y1Le4du3s4j6d0OM_9n6NpBgW_obiuN58Ilj4_ZqB1N90Es_EEc7UzxuG63LRlK-q_tb1fJk1P08nx8ECjxXJfxkHcUj1fCWRoBE1R6O7HMFQPMRFzomQ3tuGJ-RzIEUDFT26mm1aRDDXJiDl5d8Oj1MhuY87DgRvkpc9arPUAJqTrPuMLx9j/s600-rw/chia-se-code-canh-bao-phat-hien-adblock-su-dung-javascript.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;AdBlocker là một tiện ích lọc nội dung hoặc chặn các quảng cáo trên trình duyệt. Nó giúp người dùng ngăn chặn các quảng cáo và các cửa sổ bật lên không mong muốn. Nhưng website có thu nhập chủ yếu nhờ quảng cáo sẽ cần phải thông báo cho người dùng biết phải tắt bỏ AdBlock để hiển thị quảng cáo vì nó làm giảm thu nhập của website.&lt;p/&gt;
&lt;p&gt;Và bài viết này như bạn có thể thấy ở thumbnail, sẽ có một hộp thoại hiện lên thông báo cho người truy cập rằng họ đang sử dụng AdBlock. Nếu người dùng đã bật AdBlocker thì thông báo này sẽ được hiển thị và nếu không thì thông báo này sẽ không được hiển thị.&lt;/p&gt;
&lt;h2&gt;Chia sẻ code cảnh báo phát hiện AdBlock sử dụng Javascript&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Bước 1:&lt;/b&gt; Thêm code HTML dưới đây vào phí trước thẻ đóng &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div id=&amp;#39;ch-detect&amp;#39;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&amp;#39;ch-bg-effect&amp;#39;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&amp;#39;ch-popup-box&amp;#39;&amp;gt;
    &amp;lt;div class=&amp;#39;content&amp;#39;&amp;gt;
        &amp;lt;div class=&amp;#39;warn-icon&amp;#39;&amp;gt;
            &amp;lt;span class=&amp;#39;icon&amp;#39;&amp;gt;&amp;lt;i class=&amp;#39;has-svg-icon icon-exclamation&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;h2&amp;gt;AdBlock Detected!&amp;lt;/h2&amp;gt;
        &amp;lt;p&amp;gt;Our website is made possible by displaying ads. Please whitelist our site to copy the given source codes. &amp;lt;a href=&amp;#39;#!&amp;#39; target=&amp;#39;_blank&amp;#39;&amp;gt;Read more&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;button class=&amp;#39;dismiss-btn&amp;#39;&amp;gt;Okay, I&amp;#39;ll Whitelist&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Bước 2:&lt;/b&gt; Thêm code JavsScript dưới đây vào phía dưới đoạn HTML vừa chèn.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;&amp;lt;script&amp;gt;//&amp;lt;![CDATA[
window.addEventListener(&amp;#39;load&amp;#39;,function(){
    const detectElem = document.querySelector(&amp;quot;#ch-detect&amp;quot;);
    const adBlockPopup = document.querySelector(&amp;quot;.ch-popup-box&amp;quot;);
    const dismissBtn = adBlockPopup.querySelector(&amp;quot;.dismiss-btn&amp;quot;);
    const BgEffect = document.querySelector(&amp;quot;.ch-bg-effect&amp;quot;);
    let adClasses = [&amp;quot;ad&amp;quot;, &amp;quot;ads&amp;quot;, &amp;quot;adsbox&amp;quot;, &amp;quot;doubleclick&amp;quot;, &amp;quot;ad-placement&amp;quot;, &amp;quot;ad-placeholder&amp;quot;, &amp;quot;adbadge&amp;quot;, &amp;quot;BannerAd&amp;quot;];
    for(let item of adClasses){
      detectElem.classList.add(item);
    }
    let getProperty = window.getComputedStyle(detectElem).getPropertyValue(&amp;quot;display&amp;quot;);
    if(!adBlockPopup.classList.contains(&amp;quot;show&amp;quot;)){
      getProperty == &amp;quot;none&amp;quot; ? adBlockPopup.classList.add(&amp;quot;show&amp;quot;) : adBlockPopup.classList.remove(&amp;quot;show&amp;quot;);
      getProperty == &amp;quot;none&amp;quot; ? BgEffect.classList.add(&amp;quot;show&amp;quot;) : BgEffect.classList.remove(&amp;quot;show&amp;quot;);
    }
    dismissBtn.addEventListener(&amp;quot;click&amp;quot;, ()=&amp;gt;{
      adBlockPopup.classList.remove(&amp;quot;show&amp;quot;);
	  BgEffect.classList.remove(&amp;quot;show&amp;quot;);
    });
})
  //]]&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Cuối cùng:&lt;/b&gt; Thêm đoạn code CSS dưới đây vào trong website của bạn. Nhớ chỉnh lại cho phù hợp với Website của bạn nhé CSS này là theo Blog của mình.&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;.ch-popup-box{box-sizing:unset;position: fixed;max-width: 420px;top: 50%;left: 50%;width: 100%;padding: 40px 50px;background:var(--white) url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTrPM_8MImVG539G58_8EVodWT_2up-eUm4XCP9HcZ0OJvHfWAcwM9wyK18Q1OG79YE3M1t0nE5Tyj6ONpvvNk2I3xioeUwPGSHBBjKkKDjoQ8bpPtnNvSaPrPsB8inQcy37goX-lWYLs/s150/kitten-ink.webp) no-repeat right bottom;background-size:100px;border-radius:4px;opacity: 0;z-index: 2147483647;pointer-events: none;transform: translate(-50%, -50%) scale(1.2);box-shadow: 10px 10px 15px rgba(0,0,0,0.06);transition: opacity 0.2s 0s ease-in-out,transform 0.2s 0s ease-in-out;}
.ch-popup-box.show{opacity: 1;pointer-events: auto;transform: translate(-50%, -50%) scale(1);}
@media screen and (max-width: 600px){.ch-popup-box{transform: translate(-50%, -50%) scale(0.7);}.ch-popup-box.show{transform: translate(-50%, -50%) scale(0.9);}.ch-popup-box h2{text-align: center;}}
.ch-bg-effect{backdrop-filter:blur(2px) sepia() brightness(0.5) grayscale(1);position: fixed;left: 0;top: 0;z-index: 2147484000;height: 100%;width: 100%;background:rgba(0,0,0,.2);opacity: 0;pointer-events: none;transition: opacity 0.3s ease;}
.ch-bg-effect.show{opacity: 1;pointer-events: auto;}
.ch-popup-box .content,.ch-popup-box .content .warn-icon,.ch-popup-box .warn-icon .icon{display: flex;align-items: center;justify-content: center;}
.ch-popup-box .content{flex-direction: column;}
.ch-popup-box .content .warn-icon{height:115px;width:115px;border-radius:50%;background:#66689c}
.ch-popup-box .warn-icon .icon{height: 100px;width:100px;background:#fff;border-radius:inherit}
.ch-popup-box .content h2{margin: 0;margin-top: 40px;font-size: 32px;font-weight: 600;letter-spacing:1px}
.ch-popup-box .content p{margin: 0;font-size: 19px;text-align: center;margin-top: 23px;line-height: 30px}
.ch-popup-box .content p a{color: #7577a9}
.ch-popup-box .content p a:hover{text-decoration: underline;}
.ch-popup-box .content .dismiss-btn{margin-top:30px;padding:15px 27px;font-size:18px;border:none;outline:none;color:#fff;cursor:pointer;border-radius:50px;background:#7577a9;transition:background 0.3s ease;}
.ch-popup-box .content .dismiss-btn:hover{background: #66689c;}
.icon-exclamation:before{background-image: url(&quot;data:image/svg+xml,%3Csvg width=&#39;24&#39; height=&#39;24&#39; fill=&#39;%2366689c&#39; viewBox=&#39;0 0 1000 1000&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;%3E%3Cpath d=&#39; M 526 150C 576 150 602 175 601 224C 600 300 600 350 575 525C 570 560 560 575 525 575C 525 575 475 575 475 575C 440 575 430 560 425 525C 400 355 400 300 400 226C 400 175 425 150 475 150M 500 650C 527 650 552 661 571 679C 589 698 600 723 600 750C 600 805 555 850 500 850C 445 850 400 805 400 750C 400 723 411 698 429 679C 448 661 473 650 500 650C 500 650 500 650 500 650&#39;/%3E%3C/svg%3E&quot;);width:80px;height:80px;background-size:100%;content:&quot;&quot;;display:inline-block;vertical-align:middle}&lt;/pre&gt;
&lt;h4&gt;Lời kết&lt;/h4&gt;
&lt;p&gt;Mình thấy cứ hiện nên như vậy thì hơi khó chịu với người dùng khi truy cập những bài viết có nội dung trả phí bởi vì bài viết được trả phí rồi và không cần quảng cáo nữa. Các bạn hãy kết hợp cho những nội dung miễn phí, như Blog mình khi bạn bật AdBlock thì sẽ không thể copy code trực tiếp từ Blog mình các bạn có thể thử nếu dùng AdBlock. Các bạn hãy sử dụng cho hợp lý để tránh gây kho chịu nhé!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/4840319601661004868/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2022/01/chia-se-code-canh-bao-phat-hien-adblock-su-dung-javascript.html#comment-form' title='3 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4840319601661004868'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/4840319601661004868'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2022/01/chia-se-code-canh-bao-phat-hien-adblock-su-dung-javascript.html' title='Chia sẻ code cảnh báo phát hiện AdBlock sử dụng Javascript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdvo8Y1Le4du3s4j6d0OM_9n6NpBgW_obiuN58Ilj4_ZqB1N90Es_EEc7UzxuG63LRlK-q_tb1fJk1P08nx8ECjxXJfxkHcUj1fCWRoBE1R6O7HMFQPMRFzomQ3tuGJ-RzIEUDFT26mm1aRDDXJiDl5d8Oj1MhuY87DgRvkpc9arPUAJqTrPuMLx9j/s72-c-rw/chia-se-code-canh-bao-phat-hien-adblock-su-dung-javascript.webp" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6311614170532925167.post-2442580679868092030</id><published>2021-12-30T23:56:00.018+07:00</published><updated>2023-10-31T11:38:27.543+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="tien-ich-blogger"/><title type='text'>Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript</title><content type='html'>&lt;p&gt;Chào các bạn, blog cũ nhưng tên miền mới hôm nay thì mình sẽ chia sẻ cho bạn cách thêm tiện ích trình phát nhạc sử dụng JavaScript cho website hoặc blog của bạn. Tiện ích này sẽ sử dụng HTML CSS và JavaScript, gần đây mình có chia sẻ bài viết &lt;a href=&quot;/2021/10/code-hien-thi-thong-bao-khi-mat-ket-noi-mang-cho-website-blogspot.html&quot; target=&quot;_blank&quot;&gt;Code hiển thị thông báo khi mất kết nối mạng cho Website/Blogspot&lt;/a&gt; các bạn có thể thảm khảo thêm.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;div class=&quot;separator hide&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript&quot; title=&quot;Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2667&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjleRgN09myCJF4jh-sTkadsBGU2ZtKMF2LJ2xxYrzKQe4Bu8BVMorTdcVmjcHJjXs8IDd63N9kLHFugD6XGS5EciRv_TVgKuMFeXGCySfeIti-YuU86rZdrOHIz2Ikl0X0kIyAEjpddxUGKr-TNXq-UgCpyslQps_aJpk7fq6iuHhg2ZrvWz_yHGtR/s600-rw/chia-se-code-hien-thi-trinh-phat-nhac-su-dung-javascript.webp&quot;/&gt;&lt;/div&gt;
&lt;p&gt;Tiện ích trình phát nhạc sử dụng JavaScript này có các chức năng phát lặp bài nhạc, phát lặp danh sách nhạc, phát ngẫu nhiên các bài nhạc trong danh sách và các nút play/pause, bài trước bài sau. Bạn cũng có thể xem được danh sách các bài nhạc và bài nhạc đang phát hiện tại trong danh sách.&lt;/p&gt;
&lt;h2&gt;Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bước 1:&lt;/strong&gt; Bạn thêm đoạn code HTML sau vào vị trí bạn muốn hiển thị trình phát nhạc.&lt;/p&gt;
&lt;pre class=&#39;html&#39;&gt;&amp;lt;div class=&amp;#39;music-box&amp;#39;&amp;gt;
	&amp;lt;div class=&amp;#39;top-bar&amp;#39;&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon music-more&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;span&amp;gt;Now Playing&amp;lt;/span&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon music-horiz&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&amp;#39;img-area&amp;#39;&amp;gt;
		&amp;lt;img alt=&amp;#39;&amp;#39; loading=&amp;#39;lazy&amp;#39; src=&amp;#39;&amp;#39; title=&amp;#39;&amp;#39; /&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&amp;#39;song-details&amp;#39;&amp;gt;
		&amp;lt;p class=&amp;#39;name&amp;#39;&amp;gt;&amp;lt;/p&amp;gt;
		&amp;lt;p class=&amp;#39;artist&amp;#39;&amp;gt;&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&amp;#39;progress-area&amp;#39;&amp;gt;
		&amp;lt;div class=&amp;#39;progress-bar&amp;#39;&amp;gt;
			&amp;lt;audio id=&amp;#39;main-audio&amp;#39; src=&amp;#39;&amp;#39;&amp;gt;&amp;lt;/audio&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&amp;#39;song-timer&amp;#39;&amp;gt;
			&amp;lt;span class=&amp;#39;current-time&amp;#39;&amp;gt;0:00&amp;lt;/span&amp;gt;
			&amp;lt;span class=&amp;#39;max-duration&amp;#39;&amp;gt;0:00&amp;lt;/span&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&amp;#39;controls&amp;#39;&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon music-repeat&amp;#39; id=&amp;#39;repeat-plist&amp;#39; title=&amp;#39;Playlist looped&amp;#39;&amp;gt;&amp;lt;span&amp;gt;repeat&amp;lt;/span&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon music-skippre&amp;#39; id=&amp;#39;prev&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;div class=&amp;#39;play-pause&amp;#39;&amp;gt;
			&amp;lt;i class=&amp;#39;has-svg-icon music-play play&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon music-skipnext&amp;#39; id=&amp;#39;next&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon music-queue&amp;#39; id=&amp;#39;more-music&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&amp;#39;slider_volumn&amp;#39;&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon icon-volume-down&amp;#39; id=&amp;#39;min-volume&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;input class=&amp;#39;volume_slider&amp;#39; max=&amp;#39;100&amp;#39; min=&amp;#39;1&amp;#39; onchange=&amp;#39;setVolume()&amp;#39; type=&amp;#39;range&amp;#39; value=&amp;#39;100&amp;#39; /&amp;gt;
		&amp;lt;i class=&amp;#39;has-svg-icon icon-volume-up&amp;#39; id=&amp;#39;max-volume&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&amp;#39;music-list&amp;#39;&amp;gt;
		&amp;lt;div class=&amp;#39;header-music&amp;#39;&amp;gt;
			&amp;lt;div class=&amp;#39;row-music&amp;#39;&amp;gt;
				&amp;lt;i class=&amp;#39;has-svg-icon list music-queuemenu&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
				&amp;lt;span&amp;gt;Music list&amp;lt;/span&amp;gt;
			&amp;lt;/div&amp;gt;
			&amp;lt;i class=&amp;#39;has-svg-icon music-close&amp;#39; id=&amp;#39;close&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;ul&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bước 2:&lt;/strong&gt; Thêm đoạn CSS sau vào giao diện hoặc là file CSS của bạn. Lưu ý bạn nhớ chỉnh sửa lại CSS cho phù hợp với website hay blog của bạn nhé.&lt;/p&gt;
&lt;pre class=&#39;css&#39;&gt;.music-box{max-width:300px;width:100%;padding:10px;overflow:hidden;position:relative;background:#fff;box-shadow:0 6px 15px 0 12px 25px 0 rgb(30 30 30 / 4%)}
.music-box i{cursor:pointer}
.top-bar,.progress-area .song-timer,.music-list .header-music,.music-list ul li{display:flex;align-items:center;justify-content:space-between}
.controls{display:flex;align-items:center;justify-content:space-evenly}
.top-bar span{font-size:16px;margin-left:-3px;color:#555}
.img-area{width:185px;height:185px;position:relative;overflow:hidden;margin:15px auto 0;border:5px solid #fff;border-radius:50%;box-shadow:0 6px 12px rgba(0,0,0,0.09)}
.img-area:before{content:&#39;&#39;;position:absolute;top:50%;left:50%;width:20px;height:20px;transform:translate(-50%, -50%);background-color:#d6dee7;border-radius:50%;box-shadow:inset 0 0 0 2px #fff;z-index:2}
.img-area img{width:100%;height:100%;border-radius:50%;object-fit:cover}
.music-box.paused .img-area img{animation: rotateAlbumArt 3s linear 0s infinite forwards}
.song-details{text-align:center;margin:20px 0}
.song-details p{color:#666}
.song-details .name{font-size:16px}
.song-details .artist{font-size:13px;opacity:.9;line-height:35px}
.progress-area{height:10px;width:100%;border-radius:50px;background:#f0f0f0;cursor:pointer}
.progress-area .progress-bar{height:inherit;width:0;position:relative;border-radius:inherit;background:linear-gradient(90deg,#7577a9 0%,#66689c 100%)}
.progress-area .song-timer{margin-top:5px}
.song-timer span{font-size:13px;color:#666}
.controls{margin:30px 0 20px}
.controls .play-pause{height:30px;width:30px;display:flex;cursor:pointer;align-items:center;justify-content:center;border-radius:50%;background:#fff}
.play-pause::before{position:absolute;content:&quot;&quot;;height:30px;width:30px;border-radius:inherit;background:linear-gradient(#7577a9 0%,#66689c 100%)}
.play-pause i{position:absolute}
.music-list{position:absolute;background:#fff;width:100%;left:0;bottom:-55%;opacity:0;pointer-events:none;z-index:5;padding:15px 30px;box-shadow:0 -5px 10px rgba(0,0,0,0.05);transition:all .15s ease-out}
#repeat-plist &gt; span{display:none}
.music-list.show{bottom:0;opacity:1;pointer-events:auto}
.header-music .row-music{display:flex;align-items:center;font-size:19px}
.header-music .row-music i{cursor:default}
.header-music .row-music span{margin-left:5px;font-size:15px;color:#666666}
.music-list ul{margin:10px 0!important;max-height:260px;overflow:auto}
.music-list ul::-webkit-scrollbar{width:0}
.music-list ul li{list-style:none;display:flex;cursor:pointer;padding-bottom:10px;margin-bottom:10px;color:#666;border-bottom:1px solid #E5E5E5}
.music-list ul li:last-child{border-bottom:0}
.music-list ul li .row span{font-size:15px}
.music-list ul li .row p{opacity:.9;font-size:13px;margin-top:5px}
ul li .audio-duration{font-size:13px}
ul li.playing{pointer-events:none;color:#66689c}
.slider_volumn{display:flex;justify-content:center;align-items:center}
.volume_slider{height:10px;width:100%;border-radius:50px;background:#f0f0f0;cursor:pointer;padding:0;overflow:hidden; -webkit-transition: .2s;transition: opacity .2s;-webkit-appearance:none}
.volume_slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width: 10px;height: 10px;background:#66689c;cursor: pointer;border-radius:0 50% 50% 0;box-shadow:-350px 0px 0px 340px #66689c}
.volume_slider::-moz-range-thumb {width:10px;height:10px;background:#66689c;cursor:pointer}
@keyframes rotateAlbumArt{0%{ transform: rotateZ(0)}100%{ transform: rotateZ(360deg)}}
.has-svg-icon:before{background-size:100%;content:&quot;&quot;;display:inline-block;vertical-align:middle}
.music-more:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%23666666&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-horiz:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%23666666&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-play:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%23ffffff&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M8 5v14l11-7z&#39;/%3E%3C/svg%3E%0A&quot;);width:23px;height:23px}
.music-pause:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%23ffffff&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M6 19h4V5H6v14zm8-14v14h4V5h-4z&#39;/%3E%3C/svg%3E%0A&quot;);width:23px;height:23px}
.music-skippre:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M6 6h2v12H6zm3.5 6l8.5 6V6z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-skipnext:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-repeat:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-repeatone:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4zm-4-2V9h-1l-2 1v1h1.5v4H13z&#39;/%3E%3C/svg%3E &quot;);width:20px;height:20px}
.music-shuffle:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-queue:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; enable-background=&#39;new 0 0 24 24&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cg%3E%3Crect fill=&#39;none&#39; height=&#39;24&#39; width=&#39;24&#39;/%3E%3C/g%3E%3Cg%3E%3Cpath d=&#39;M15,6H3v2h12V6z M15,10H3v2h12V10z M3,16h8v-2H3V16z M17,6v8.18C16.69,14.07,16.35,14,16,14c-1.66,0-3,1.34-3,3s1.34,3,3,3 s3-1.34,3-3V8h3V6H17z&#39;/%3E%3C/g%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.music-queuemenu:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%23666666&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; enable-background=&#39;new 0 0 24 24&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cg%3E%3Crect fill=&#39;none&#39; height=&#39;24&#39; width=&#39;24&#39;/%3E%3C/g%3E%3Cg%3E%3Cpath d=&#39;M15,6H3v2h12V6z M15,10H3v2h12V10z M3,16h8v-2H3V16z M17,6v8.18C16.69,14.07,16.35,14,16,14c-1.66,0-3,1.34-3,3s1.34,3,3,3 s3-1.34,3-3V8h3V6H17z&#39;/%3E%3C/g%3E%3C/svg%3E%0A&quot;);width:20px;height:23px}
.music-close:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%23666666&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; width=&#39;24&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39;%3E%3Cpath d=&#39;M24 20.188l-8.315-8.209 8.2-8.282-3.697-3.697-8.212 8.318-8.31-8.203-3.666 3.666 8.321 8.24-8.206 8.313 3.666 3.666 8.237-8.318 8.285 8.203z&#39;/%3E%3C/svg%3E&quot;);width:11px;height:11px}
.icon-volume-up:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}
.icon-volume-down:before{background-image: url(&quot;data:image/svg+xml,%3Csvg fill=&#39;%237577a9&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39; height=&#39;24&#39; viewBox=&#39;0 0 24 24&#39; width=&#39;24&#39;%3E%3Cpath d=&#39;M0 0h24v24H0z&#39; fill=&#39;none&#39;/%3E%3Cpath d=&#39;M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z&#39;/%3E%3C/svg%3E%0A&quot;);width:20px;height:20px}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bước 3:&lt;/strong&gt; Thêm đoạn JavaScript sau vào giao diện hoặc là file JS của bạn. Ở đây mình tạo JS dạng Array để thêm danh sách các bài nhạc.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;// Để thêm nhạc bạn sao chép và chỉnh sửa bên trong đoạn array như sau
//   {
//     name: &quot;Tên bài nhạc&quot;,
//     artist: &quot;Nghệ sĩ&quot;,
//     img: &quot;Tên đường dẫn hình ảnh&quot;,
//     src: &quot;Tên đường dẫn theo bài nhạc&quot;
//   }
let allMusic = [
    {
        name: &quot;Harley Bird - Home&quot;,
        artist: &quot;Jordan Schor&quot;,
        img: &quot;https://cdn.jsdelivr.net/gh/ngylduy/storage/image/music-1.jpg&quot;,
        src: &quot;https://ia801400.us.archive.org/27/items/music_20210917/music-1.mp3&quot;,
        id: &quot;m1&quot;
    },
    {
        name: &quot;Ikson Anywhere – Ikson&quot;,
        artist: &quot;Audio Library&quot;,
        img: &quot;https://cdn.jsdelivr.net/gh/ngylduy/storage/image/music-2.jpg&quot;,
        src: &quot;https://ia801400.us.archive.org/27/items/music_20210917/music-2.mp3&quot;,
        id: &quot;m2&quot;
    },
    {
        name: &quot;Beauz &amp; Jvna - Crazy&quot;,
        artist: &quot;Beauz &amp; Jvna&quot;,
        img: &quot;https://cdn.jsdelivr.net/gh/ngylduy/storage/image/music-3.jpg&quot;,
        src: &quot;https://ia801400.us.archive.org/27/items/music_20210917/music-3.mp3&quot;,
        id: &quot;m3&quot;
    },
    {
        name: &quot;Hardwind - Want Me&quot;,
        artist: &quot;Mike Archangelo&quot;,
        img: &quot;https://cdn.jsdelivr.net/gh/ngylduy/storage/image/music-4.jpg&quot;,
        src: &quot;https://ia801400.us.archive.org/27/items/music_20210917/music-4.mp3&quot;,
        id: &quot;m4&quot;
    },
    {
        name: &quot;Jim - Sun Goes Down&quot;,
        artist: &quot;Jim Yosef x Roy&quot;,
        img: &quot;https://cdn.jsdelivr.net/gh/ngylduy/storage/image/music-5.jpg&quot;,
        src: &quot;https://ia801400.us.archive.org/27/items/music_20210917/music-5.mp3&quot;,
        id: &quot;m5&quot;
    },
    {
        name: &quot;Lost Sky - Vision NCS&quot;,
        artist: &quot;NCS Release&quot;,
        img: &quot;https://cdn.jsdelivr.net/gh/ngylduy/storage/image/music-6.jpg&quot;,
        src: &quot;https://ia801400.us.archive.org/27/items/music_20210917/music-6.mp3&quot;,
        id: &quot;m6&quot;
    }
];&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bước cuối:&lt;/strong&gt; Tiếp tục thêm đoạn JavaScript sau, đoạn JavaScript này là các function và event cho trình phát nhạc.&lt;/p&gt;
&lt;pre class=&#39;javascript&#39;&gt;const wrapper = document.querySelector(&amp;quot;.music-box&amp;quot;),
    musicImg = wrapper.querySelector(&amp;quot;.img-area img&amp;quot;),
    musicName = wrapper.querySelector(&amp;quot;.song-details .name&amp;quot;),
    musicArtist = wrapper.querySelector(&amp;quot;.song-details .artist&amp;quot;),
    playPauseBtn = wrapper.querySelector(&amp;quot;.play-pause&amp;quot;),
    prevBtn = wrapper.querySelector(&amp;quot;#prev&amp;quot;),
    nextBtn = wrapper.querySelector(&amp;quot;#next&amp;quot;),
    mainAudio = wrapper.querySelector(&amp;quot;#main-audio&amp;quot;),
    progressArea = wrapper.querySelector(&amp;quot;.progress-area&amp;quot;),
    progressBar = progressArea.querySelector(&amp;quot;.progress-bar&amp;quot;),
    musicList = wrapper.querySelector(&amp;quot;.music-list&amp;quot;),
    moreMusicBtn = wrapper.querySelector(&amp;quot;#more-music&amp;quot;),
    closemoreMusic = musicList.querySelector(&amp;quot;#close&amp;quot;),
    volumeslider = wrapper.querySelector(&amp;quot;.volume_slider&amp;quot;),
    maxvolum = wrapper.querySelector(&amp;quot;#max-volume&amp;quot;),
    minvolum = wrapper.querySelector(&amp;quot;#min-volume&amp;quot;);
let musicIndex = Math.floor((Math.random() * allMusic.length) + 1);
isMusicPaused = true;
curr_track = mainAudio;
window.addEventListener(&amp;quot;load&amp;quot;, () =&amp;gt; {
    loadMusic(musicIndex);
    playingSong();
});
function loadMusic(indexNumb) {
    musicName.innerText = allMusic[indexNumb - 1].name;
    musicArtist.innerText = allMusic[indexNumb - 1].artist;
    musicImg.alt = allMusic[indexNumb - 1].artist;
    musicImg.title = allMusic[indexNumb - 1].artist;
    musicImg.src = allMusic[indexNumb - 1].img;
    mainAudio.src = allMusic[indexNumb - 1].src;
}
function playMusic() {
    wrapper.classList.add(&amp;quot;paused&amp;quot;);
    playPauseBtn.querySelector(&amp;quot;i&amp;quot;).classList.remove(&amp;quot;music-play&amp;quot;);
    playPauseBtn.querySelector(&amp;quot;i&amp;quot;).classList.add(&amp;quot;music-pause&amp;quot;);
    mainAudio.play();
}
function pauseMusic() {
    wrapper.classList.remove(&amp;quot;paused&amp;quot;);
    playPauseBtn.querySelector(&amp;quot;i&amp;quot;).classList.remove(&amp;quot;music-pause&amp;quot;);
    playPauseBtn.querySelector(&amp;quot;i&amp;quot;).classList.add(&amp;quot;music-play&amp;quot;);
    mainAudio.pause();
}
function prevMusic() {
    musicIndex--;
    musicIndex &amp;lt; 1 ? musicIndex = allMusic.length : musicIndex = musicIndex;
    loadMusic(musicIndex);
    playMusic();
    playingSong();
}
function nextMusic() {
    musicIndex++;
    musicIndex &amp;gt; allMusic.length ? musicIndex = 1 : musicIndex = musicIndex;
    loadMusic(musicIndex);
    playMusic();
    playingSong();
}
playPauseBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    const isMusicPlay = wrapper.classList.contains(&amp;quot;paused&amp;quot;);
    isMusicPlay ? pauseMusic() : playMusic();
    playingSong();
});
prevBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    prevMusic();
});
nextBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    nextMusic();
});
mainAudio.addEventListener(&amp;quot;timeupdate&amp;quot;, (e) =&amp;gt; {
    const currentTime = e.target.currentTime;
    const duration = e.target.duration;
    let progressWidth = (currentTime / duration) * 100;
    progressBar.style.width = `${progressWidth}%`;
    let musicCurrentTime = wrapper.querySelector(&amp;quot;.current-time&amp;quot;),
        musicDuartion = wrapper.querySelector(&amp;quot;.max-duration&amp;quot;);
    mainAudio.addEventListener(&amp;quot;loadeddata&amp;quot;, () =&amp;gt; {
        let mainAdDuration = mainAudio.duration;
        let totalMin = Math.floor(mainAdDuration / 60);
        let totalSec = Math.floor(mainAdDuration % 60);
        if (totalSec &amp;lt; 10) {
            totalSec = `0${totalSec}`;
        }
        musicDuartion.innerText = `${totalMin}:${totalSec}`;
    });
    let currentMin = Math.floor(currentTime / 60);
    let currentSec = Math.floor(currentTime % 60);
    if (currentSec &amp;lt; 10) {
        currentSec = `0${currentSec}`;
    }
    musicCurrentTime.innerText = `${currentMin}:${currentSec}`;
});
progressArea.addEventListener(&amp;quot;click&amp;quot;, (e) =&amp;gt; {
    let progressWidth = progressArea.clientWidth;
    let clickedOffsetX = e.offsetX;
    let songDuration = mainAudio.duration;
    mainAudio.currentTime = (clickedOffsetX / progressWidth) * songDuration;
    playMusic();
    playingSong();
});
const repeatBtn = wrapper.querySelector(&amp;quot;#repeat-plist span&amp;quot;);
wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    let getText = repeatBtn.innerText;
    switch (getText) {
        case &amp;quot;repeat&amp;quot;:
            repeatBtn.innerText = &amp;quot;repeat_one&amp;quot;;
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).classList.toggle(&amp;quot;music-repeat&amp;quot;);
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).classList.toggle(&amp;quot;music-repeatone&amp;quot;);
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).setAttribute(&amp;quot;title&amp;quot;, &amp;quot;Song looped&amp;quot;);
            break;
        case &amp;quot;repeat_one&amp;quot;:
            repeatBtn.innerText = &amp;quot;shuffle&amp;quot;;
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).classList.toggle(&amp;quot;music-repeatone&amp;quot;);
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).classList.toggle(&amp;quot;music-shuffle&amp;quot;);
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).setAttribute(&amp;quot;title&amp;quot;, &amp;quot;Playback shuffled&amp;quot;);
            break;
        case &amp;quot;shuffle&amp;quot;:
            repeatBtn.innerText = &amp;quot;repeat&amp;quot;;
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).classList.toggle(&amp;quot;music-shuffle&amp;quot;);
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).classList.toggle(&amp;quot;music-repeat&amp;quot;);
            wrapper.querySelector(&amp;quot;#repeat-plist&amp;quot;).setAttribute(&amp;quot;title&amp;quot;, &amp;quot;Playlist looped&amp;quot;);
            break;
    }
});
mainAudio.addEventListener(&amp;quot;ended&amp;quot;, () =&amp;gt; {
    let getText = repeatBtn.innerText;
    switch (getText) {
        case &amp;quot;repeat&amp;quot;:
            nextMusic();
            break;
        case &amp;quot;repeat_one&amp;quot;:
            mainAudio.currentTime = 0;
            loadMusic(musicIndex);
            playMusic();
            break;
        case &amp;quot;shuffle&amp;quot;:
            let randIndex = Math.floor((Math.random() * allMusic.length) + 1);
            do {
                randIndex = Math.floor((Math.random() * allMusic.length) + 1);
            } while (musicIndex == randIndex);
            musicIndex = randIndex;
            loadMusic(musicIndex);
            playMusic();
            playingSong();
            break;
    }
});
moreMusicBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    musicList.classList.toggle(&amp;quot;show&amp;quot;);
});
closemoreMusic.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    moreMusicBtn.click();
});
const ulTag = wrapper.querySelector(&amp;quot;ul&amp;quot;);
for (let i = 0; i &amp;lt; allMusic.length; i++) {
    let liTag = `&amp;lt;li li-index=&amp;quot;${i + 1}&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;
                  &amp;lt;span&amp;gt;${allMusic[i].name}&amp;lt;/span&amp;gt;
                  &amp;lt;p&amp;gt;${allMusic[i].artist}&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;span id=&amp;quot;${allMusic[i].id}&amp;quot; class=&amp;quot;audio-duration&amp;quot;&amp;gt;3:40&amp;lt;/span&amp;gt;
                &amp;lt;audio class=&amp;quot;${allMusic[i].id}&amp;quot; src=&amp;quot;${allMusic[i].src}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;
              &amp;lt;/li&amp;gt;`;
    ulTag.insertAdjacentHTML(&amp;quot;beforeend&amp;quot;, liTag);
    let liAudioDuartionTag = ulTag.querySelector(`#${allMusic[i].id}`);
    let liAudioTag = ulTag.querySelector(`.${allMusic[i].id}`);
    liAudioTag.addEventListener(&amp;quot;loadeddata&amp;quot;, () =&amp;gt; {
        let duration = liAudioTag.duration;
        let totalMin = Math.floor(duration / 60);
        let totalSec = Math.floor(duration % 60);
        if (totalSec &amp;lt; 10) {
            totalSec = `0${totalSec}`;
        };
        liAudioDuartionTag.innerText = `${totalMin}:${totalSec}`;
        liAudioDuartionTag.setAttribute(&amp;quot;t-duration&amp;quot;, `${totalMin}:${totalSec}`);
    });
}
function playingSong() {
    const allLiTag = ulTag.querySelectorAll(&amp;quot;li&amp;quot;);

    for (let j = 0; j &amp;lt; allLiTag.length; j++) {
        let audioTag = allLiTag[j].querySelector(&amp;quot;.audio-duration&amp;quot;);

        if (allLiTag[j].classList.contains(&amp;quot;playing&amp;quot;)) {
            allLiTag[j].classList.remove(&amp;quot;playing&amp;quot;);
            let adDuration = audioTag.getAttribute(&amp;quot;t-duration&amp;quot;);
            audioTag.innerText = adDuration;
        }
        if (allLiTag[j].getAttribute(&amp;quot;li-index&amp;quot;) == musicIndex) {
            allLiTag[j].classList.add(&amp;quot;playing&amp;quot;);
            audioTag.innerText = &amp;quot;Playing&amp;quot;;
        }
        allLiTag[j].setAttribute(&amp;quot;onclick&amp;quot;, &amp;quot;clicked(this)&amp;quot;);
    }
}
function clicked(element) {
    let getLiIndex = element.getAttribute(&amp;quot;li-index&amp;quot;);
    musicIndex = getLiIndex;
    loadMusic(musicIndex);
    playMusic();
    playingSong();
}
function setVolume() {
    curr_track.volume = volumeslider.value / 100;
}
maxvolum.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    curr_track.volume = 1;
    volumeslider.value = 100
})
minvolum.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
    curr_track.volume = 0.01;
    volumeslider.value = 0
})&lt;/pre&gt;
&lt;p&gt;Như vậy là hết rồi đó, ở tên miền cũ nguyenluongduy.com mình thấy một số bạn comments xin code trình phát nhạc của mình thì bài viết này mình đã chia sẻ cho các bạn &lt;b&gt;code hiển thị trình phát nhạc sử dụng JavaScript&lt;/b&gt; rồi. Bạn nào không hiểu đoạn nào hay lỗi gì thì cứ comments bên dưới bài viết này mình sẽ hỗ trợ nhé!&lt;/p&gt;












&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;p&gt;Post by &lt;a href=&quot;https://www.nldblog.com/&quot; rel=&quot;dofollow&quot;&gt;NLD Blog&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://www.nldblog.com/feeds/2442580679868092030/comments/default' title='Đăng Nhận xét'/><link rel='replies' type='text/html' href='https://www.nldblog.com/2021/12/chia-se-code-hien-thi-trinh-phat-nhac-su-dung-javascript.html#comment-form' title='7 Nhận xét'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/2442580679868092030'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/6311614170532925167/posts/default/2442580679868092030'/><link rel='alternate' type='text/html' href='https://www.nldblog.com/2021/12/chia-se-code-hien-thi-trinh-phat-nhac-su-dung-javascript.html' title='Chia sẻ code hiển thị trình phát nhạc sử dụng JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjleRgN09myCJF4jh-sTkadsBGU2ZtKMF2LJ2xxYrzKQe4Bu8BVMorTdcVmjcHJjXs8IDd63N9kLHFugD6XGS5EciRv_TVgKuMFeXGCySfeIti-YuU86rZdrOHIz2Ikl0X0kIyAEjpddxUGKr-TNXq-UgCpyslQps_aJpk7fq6iuHhg2ZrvWz_yHGtR/s72-c-rw/chia-se-code-hien-thi-trinh-phat-nhac-su-dung-javascript.webp" height="72" width="72"/><thr:total>7</thr:total></entry></feed>