Fundamentals of JavaScript SEO for your site: how to provide visibility in Google

Fundamentals of JavaScript SEO for your site: how to provide visibility in Google

Have you thought that JavaScript problems can interfere with your site or content to show in the results of the Google search? In this manual, we will explain how to solve JavaScript problems so that your site becomes available for indexation in the search engine.

JavaScript plays an important role in web development, providing many functions that turn the site into a full-fledged platform for applications. To make your JavaScript project available for a search in Google is an opportunity to attract new users and return the old ones who are looking for your content.

Despite the fact that Google uses the modern Chromium engine to process JavaScript, there are several things that should be optimized to improve visibility in the search engine.

How Google processes JavaScript on your site

Google passes through three key stages for processing JavaScript web pages:

  • CRAWING (CRAWLING)
  • Rendering (Rendering)
  • Indexing (indexing)

Googlebot puts pages in the queue for kraling and rendering. This may take some time, since it is not always obvious when the page is processed at each of the stages. With Crailing, Googlebot makes HTTP checks and checks the Robots.txt file. If the URL is blocked, Googlebot misses it without performing rendering.

How to set up unique headlines and meta-descriptions for your Google site

The unique and informative elements of and meta-descriptions help users quickly determine which result will be the most relevant for their request in Google.</p><H2>How to write a code compatible with Google for your site</H2><p>Browsers offer many APIs, and JavaScript is a language that is constantly developing. For your code to work with Google, follow the recommendations for eliminating JavaScript errors.</p><H2>Using the correct HTTP statuses for your Google site</H2><p>Googlebot uses HTTP statuses to determine what went wrong during crowring. If the page cannot be indexed or available, send the correct status code, for example, 404 or 401.</p><H3>Avoid errors "Soft 404" on your Google Site</H3><p>For one -page applications that implement routing on the client side, it is very important to use status codes correctly. Use JavaScript redirect for a mistake with an error, for example:</p><pre> fetch(`/api/products/${productId}`).then(response => response.json()).then(product => { if (product.exists) { showProductDetails(product); // отображает информацию о продукте } else { window.location.href = '/not-found'; // перенаправление на страницу 404 } }); </pre><H2>Using API History instead of fragments for your Google site</H2><p>Google can find your links if they are in <a> elements with the HREF attribute. For one-page applications, use API history for routing between different pages of your web application.</p><H2>Proper implementation of the tag Rel = "Canonical" on your site for Google</H2><p>You can introduce the Rel = "Canonical" tag using JavaScript to indicate which version of the page should be indexed. However, be careful so that there are no duplicate links Rel = "Canonical" on the page.</p><H2>Using Robots Meta Tags on your site for Google</H2><p>You can use the Robots meta-tag to ban page indexing or following links to it. For example, to block indexing, add the following meta-tag:</p><pre> <meta name="robots" content="noindex, nofollow"> </pre><p>It is important to remember that if Google sees noindex before JavaScript rendering, he will miss this page. If you want the page to be indexed, do not use Noindex in the source code.</p><H2>Using long -term caching for your Google site</H2><p>Googlebot actively uses a cache to reduce the number of requests and saving resources. Use the caching strategy taking into account the content change, for example, adding control amounts to file names.</p><H2>Using structured data on your Google website</H2><p>If you use structured data on your site, you can generate JSON-LD using JavaScript and introduce it to the page. However, make sure that your implementation is not mistaken.</p><H2>Following the best practices for web components on your Google website</H2><p>Google supports web components. However, he can only see the content that is displayed in rendering. If you use Dom's shadow or light DOM, make sure Google can see all the content.</p><H2>Correction of images and lazy content loading on your site on Google</H2><p>Images can take a lot of traffic and slow down the loading of pages. Apply lazy loading so that the images are loaded only when the user approaches them. Make sure your laziness is compatible with SEO, following the recommendations on this topic.</p><H2>Design, taking into account the availability for your site in Google</H2><p>When creating your site, think not only about search engines, but also about users, including people with special needs, such as screen readers or less powerful mobile devices. This will help you create a site that will be available and convenient for everyone.</p><p>If you have questions about JavaScript optimization for your site or you need to establish SEO, contact the SEO.computer team. We are happy to help!</p><p>Contact details: <strong>info@seo.computer</strong>, <strong>WhatsApp: +79202044461</strong></p><p>ID 71</p> </div> </div> </div> </section> <section id="consultation" class="py-5"> <div class="container"> <div class="form-bg-gradient bor-r-20 my-3 p-4 p-md-5"> <div class="head-title-white text-center">Send a request and we will provide a consultation on SEO promotion of your website</div> <form class="form row my-3 justify-content-center gy-2 needs-validation" id="form-consultation" action="https://seo.computer/form" method="post" novalidate=""> <input type="hidden" name="form_name" value="Отправьте заявку и мы бесплатно Блог"> <input type="hidden" name="_token" value="P1P7uan3gtTQw5pgm9HayLwfraNPUP4uAdgdF3j1" autocomplete="off"> <div class="col-12 col-xl-3"> <input type="text" name="name" class="form-control form-padding rounded-5" placeholder="your name" required=""> </div> <div class="col-12 col-xl-3"> <input type="tel" name="phone" class="form-control form-padding rounded-5" placeholder="Phone number" required="" maxlength="18"> </div> <div class="col-12 col-xl-3"> <button type="submit" class="btn btn-send btn-light form-padding rounded-5 w-100">Send</button> </div> <div class="col-12 col-md-12"> <div class="text-center"> <a class="text-decoration-none text-white fs-14" href="https://seo.computer/policy">By submitting an application, you agree to the privacy policy</a> </div> </div> </form> </div> </div> </section> <footer class="footer-bg"> <style> .bottom-contact-bar { display:none; } @media(max-width:992px) { .bottom-contact-bar { display:block; position:fixed; bottom:0; left:0; right:0; z-index: 9999; } .footer-bg { padding-bottom: 16px; } .b24-widget-button-position-bottom-right, .social { margin-bottom: 24px; } } </style> <div class="navbar navbar-dark bg-dark py-1 bottom-contact-bar"> <div class="container justify-content-center"> <div class="nav-link h6 mb-0 p-0 text-white" style="text-align:center"> <a style="text-decoration:none; color:inherit" href="mailto:info@seo.computer">info@seo.computer</a> </div> </div> </div> <style>.norender{display:none;visibility:hidden;}</style> <div class="container"> <div class="row row-cols-4 col-md-12 text-light pt-3 pt-md-5 g-3"> <div class="col-12 col-xl-3 col-md-6 vcard" itemscope itemtype="http://schema.org/LocalBusiness"> <a class="url" href="https://seo.computer/en"> <img src="https://seo.computer/assets/svg/seo_logo.svg" alt="SEO Computer Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" title="SEO Computer Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" class="rounded-5" width="200" height="40" /> </a> <ul class="nav flex-column"> <li class="fn org" itemprop="name">SEO COMPUTER</li> <li class="category">Internet Marketing</li> <li>Opening hours: <span class="workhours" itemprop="openingHours" datetime="Mo-Su">around the clock</span></li> <li class="norender"> <span itemprop="priceRange" class="pricerange">from 200 USD</span> <img loading="lazy" aria-hidden="true" width="2048" height="2048" itemprop="image" style="width:unset;height:unset;" class="absolute-bg-from-top__image photo" src="https://seo.computer/uploads/seo-article-1x1/seo-article-10071.webp"> </li> <li class="nav-item mb-2 color-bfbfbf adr"> <span itemprop="address" itemscope itemtype="http://schema.org/PostalAddress"><span class="locality" itemprop="addressLocality">Moscow</span></span> </li> <li class="nav-item mb-2 email"><a href="mailto:info@seo.computer" style="text-decoration:none;" class="color-bfbfbf" title="Email"><span itemprop="email">info@seo.computer</span></a></li> </ul> </div> <div class="col-12 col-xl-3 col-md-6"> <div class="fw-500 fs-20 mb-2">Menu</div> <ul class="nav flex-column"> <li class="nav-item mb-2"><a href="#tarifs" class="nav-link p-0 color-bfbfbf" title="SEO Tariffs">SEO Tariffs</a></li> <li class="nav-item mb-2"><a href="#reviews" class="nav-link p-0 color-bfbfbf" title="SEO Reviews">SEO Reviews</a></li> <li class="nav-item mb-2"><a href="#quiz" class="nav-link p-0 color-bfbfbf" title="SEO Calculator">SEO Calculator</a></li> <li class="nav-item mb-2"><a href="#sales" class="nav-link p-0 color-bfbfbf" title="SEO Promotions">SEO Promotions</a></li> <li class="nav-item mb-2"><a href="https://seo.computer/en/contact" class="nav-link p-0 color-bfbfbf" title="Contacts">SEO Contacts</a></li> </ul> </div> <div class="col-12 col-xl-3 col-md-6"> <div class="fw-500 fs-20 mb-2">Services</div> <ul class="nav flex-column"> <li class="nav-item mb-2"><a href="https://seo.computer/en/business" class="nav-link p-0 color-bfbfbf" title="Businesses">SEO for businesses</a></li> <li class="nav-item mb-2"><a href="https://seo.computer/en/type-sites" class="nav-link p-0 color-bfbfbf" title="Types of websites">SEO for types of websites</a></li> <li class="nav-item mb-2"><a href="https://seo.computer/en/cms" class="nav-link p-0 color-bfbfbf" title="CMS systems">SEO for CMS systems</a></li> <li class="nav-item mb-2"><a href="https://seo.computer/en/languages" class="nav-link p-0 color-bfbfbf" title="Languages">SEO for languages</a></li> <li class="nav-item mb-2"><a href="https://seo.computer/en/engines" class="nav-link p-0 color-bfbfbf" title="Search engines">SEO for search engines</a></li> </ul> </div> <div class="col-12 col-xl-3 col-md-6"> <div class="fw-500 fs-20 mb-2">Social network</div> <ul class="nav flex-column"> <li class="nav-item mb-2"><a href="https://wa.me/79202044461" class="nav-link p-0 color-bfbfbf" title="Whatsapp"><i class="fab fa-whatsapp me-1"></i>Whatsapp</a></li> <li class="nav-item mb-2"><a href="https://t.me/t9202044461/" class="nav-link p-0 color-bfbfbf" title="Telegram"><i class="fab fa-telegram-plane me-1"></i>Telegram</a></li> <li class="nav-item mb-2"><a href="mailto:info@seo.computer" class="nav-link p-0 color-bfbfbf" title="Email"><i class="fas fa-envelope me-1"></i>Email</a></li> </ul> </div> </div> <div class="justify-content-between pt-2 pb-4 mt-2 border-top col-md-12 text-light"> <p>This website is for informational purposes only and is not a public offer. To obtain accurate information about the services provided and their costs, please contact the company’s managers.</p> <a class="text-decoration-none color-bfbfbf" href="https://seo.computer/en/policy">Privacy Policy</a> <div class="mt-2"> <!--LiveInternet counter--><a href="https://www.liveinternet.ru/click" target="_blank"><img id="licntD152" width="31" height="31" style="border:0" title="LiveInternet" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7" alt="LiveInternet"/></a><script defer async>setTimeout(function(){(function(d,s){d.getElementById("licntD152").src="https://counter.yadro.ru/hit?t44.6;r"+escape(d.referrer)+((typeof(s)=="undefined")?"":";s"+s.width+"*"+s.height+"*"+(s.colorDepth?s.colorDepth:s.pixelDepth))+";u"+escape(d.URL)+";h"+escape(d.title.substring(0,150))+";"+Math.random()})(document,screen)},4000);</script><!--/LiveInternet--> </div> </div> </div> </footer> <div class="modal fade" id="exampleModalToggle" aria-hidden="true" aria-labelledby="exampleModalToggleLabel" tabindex="-1"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <div class="modal-title fw-500 fs-20" id="exampleModalToggleLabel">Leave a request</div> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <img loading="lazy" src="https://seo.computer/assets/svg/mobile_marketing.svg" class="my-3 mx-auto" width="300" height="260" alt="Leave a request Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" title="Leave a request Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow"> <form class="form needs-validation" action="https://seo.computer/form" id="form-popup" method="post" novalidate> <input type="hidden" name="form_name" value="Цены - форма (гл. стр.)"> <input type="hidden" name="_token" value="P1P7uan3gtTQw5pgm9HayLwfraNPUP4uAdgdF3j1" autocomplete="off"> <div class="modal-body"> <label class="fs-5 text-center fw-bold">Leave a request and our SEO specialist will contact you soon</label> <div class="row"> <div class="col-12"> <input type="text" name="name" class="form-control form-padding my-2" placeholder="your name" required> </div> <div class="col-12"> <input type="tel" name="phone" class="form-control form-padding my-2" placeholder="Phone number" required> </div> </div> </div> <div class="modal-footer justify-content-center"> <button class="btn rounded-5 btn-primary w-100 form-padding" type="submit">Send</button> <a href="policy.html" class="text-decoration-none text-dark text-center fs-14">By submitting data, you agree to the privacy policy</a> </div> </form> </div> </div> </div> <div class="modal fade" id="ModalLanguage" tabindex="-1" aria-labelledby="ModalLanguage" aria-hidden="true"> <div class="modal-dialog modal-sm modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <div class="modal-title fs-22 fw-500" id="exampleModalLabel">Choose language</div> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <form class="modal-body" id="languageForm" method="post"> <input type="hidden" name="_token" value="P1P7uan3gtTQw5pgm9HayLwfraNPUP4uAdgdF3j1" autocomplete="off"> <select class="form-select mb-2" aria-label="Choose language" name="language" id="language"> <option selected>Choose language</option> <option value="cn" >Chinese (simplified) (cn)</option> <option value="en" selected >English (en)</option> <option value="it" >Italian (it)</option> <option value="nl" >Dutch (nl)</option> <option value="pl" >Polish (pl)</option> <option value="de" >German (de)</option> <option value="tr" >Turkish (tr)</option> <option value="fr" >French (fr)</option> <option value="jp" >Japanese (jp)</option> <option value="id" >Indonesian (id)</option> <option value="pt" >Portuguese (pt)</option> <option value="ru" >Russian (ru)</option> <option value="es" >Spanish (es)</option> </select> <button type="submit" class="btn btn-primary w-100">Change</button> </form> </div> </div> </div> <div class="modal fade" id="SuccessModal" tabindex="-1" aria-labelledby="SuccessModal" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <div class="modal-title fs-22 fw-500" id="SuccessModalLabel"></div> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body text-center"> <img src="https://seo.computer/assets/svg/mail_send.svg" alt="Sent successfully Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" title="Sent successfully Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" width="160" height="144" class="mb-5"> <div class="h4" style="color: #000;">Sent successfully!</div> <p style="color: #000;">Thank you, your application has been sent successfully! We will contact you shortly.</p> </div> </div> </div> </div> <div class="modal fade" id="myModal" tabindex="-1" aria-labelledby="modalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content custom-modal"> <div class="modal-body d-flex align-items-center justify-content-between"> <!-- Rasm joyi --> <div class="modal__contents"> <div class="modal_top"> <span class="section_title">Leave a request</span> <p class="text-muted mt-1">And our SEO specialist will contact you in the near future</p> </div> <form id="form-analytcs" action="https://seo.computer/form" method="post" class="modal__contents_inputs flex flex-wrap justify-content-between "> <input type="hidden" name="form_name" value="Страница анализатора"> <input type="hidden" name="_token" value="P1P7uan3gtTQw5pgm9HayLwfraNPUP4uAdgdF3j1" autocomplete="off"> <div class="modal__contents_input"> <input type="text" class="form-control" placeholder="your name" name="name" id="name" required /> </div> <div class="modal__contents_input"> <input type="tel" class="form-control phone_input" placeholder="Phone number" id="phone" name="phone" required /> </div> <div class="modal__contents_input"> <input type="text" class="form-control" placeholder="Your website address" name="website" id="website" required /> </div> <button type="submit" class="button desctop">Send</button> <button type="submit" class="button mobile">Send</button> </form> <p class="policy mt-3">By sending an application, you agree <a href="https://seo.computer/ru/policy">With a policy of confidentiality</a></p> </div> <div class="img-container d-flex align-items-start"> <!-- Rasmni o'z manzilingiz bilan almashtiring --> <img src="https://seo.computer/assets/images/modal_img.png" alt="Rasm" class="img-fluid" /> <button class="close" data-bs-dismiss="modal" aria-label="Close"> <img src="https://seo.computer/assets/images/exit.svg" alt=""> </button> </div> <!-- Forma --> </div> </div> </div> </div> <div class="modal fade" id="ModalCity" tabindex="-1" aria-labelledby="ModalCity" aria-hidden="true"> <div class="modal-dialog modal-xl modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <div class="modal-title fs-22 fw-500" id="exampleModalLabel">Select a city</div> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body cites"> <div class="row mb-2"> <div class="col-sm-12"> <input class="form-control form-padding" id="search" name="query" placeholder="Enter the name of the city..."> </div> </div> <div class="row row-cols-1" id="cites"></div> </div> </div> </div> </div> <style>.lateload-show-buttons{display:none;}</style> <div class="social lateload-show-buttons"> <button class="shareButton tg open" data-bs-toggle="modal" data-bs-target="#SocialModal" data-bs-content="Write to telegram" title="Write to telegram Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" data-bs-link="https://t.me/t9202044461/"> <img width="24" height="24" style="display:inline-block" src="https://seo.computer/assets/images/c_telegram.webp" alt="Write to telegram Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" title="Write to telegram Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow"> </button> <button class="shareButton wt open" data-bs-toggle="modal" data-bs-target="#SocialModal" data-bs-content="Write to whatsapp" title="Write to whatsapp Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" data-bs-link="https://wa.me/79202044461"> <img width="24" height="24" style="display:inline-block" src="https://seo.computer/assets/images/c_whatsapp.webp" alt="Write to whatsapp Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" title="Write to whatsapp Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow"> </button> </div> <script defer async> setTimeout(function(){$('.lateload-show-buttons').css('display','flex').hide().fadeIn();}, 4000); </script> <!-- Modal --> <div class="modal fade" id="SocialModal" tabindex="-1" aria-labelledby="SocialModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header" style="text-align:center;"> <span style="font-size: 1.25rem;" class="modal-title" id="SocialModalLabel">Connect with us</span> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body text-center"> <a type="button" class="btn btn-primary" id="Soclink" href="#">Write</a> </div> </div> </div> </div> <script defer async> var SocialModal = document.getElementById('SocialModal') SocialModal.addEventListener('show.bs.modal', function (event) { setTimeout(function(el){ let halfScreenHeight = window.screen.height / 2; let coefdBlockHeight = el.offsetHeight * 1.75; //console.log(el.offsetHeight); let newTopPx = Math.round(halfScreenHeight - coefdBlockHeight); el.style.transform = 'translate(0, ' + newTopPx + 'px)'; }, 250, SocialModal.children[0]); // Button that triggered the modal var button = event.relatedTarget // Extract info from data-bs-* attributes var link = button.getAttribute('data-bs-link') var content = button.getAttribute('data-bs-content') var Soclink = SocialModal.querySelector('#Soclink') Soclink.setAttribute('href', link) Soclink.textContent = content }); (() => { 'use strict' // Fetch all the forms we want to apply custom Bootstrap validation styles to const forms = document.querySelectorAll('.needs-validation') // Loop over them and prevent submission Array.from(forms).forEach(form => { form.addEventListener('submit', event => { if (!form.checkValidity()) { event.preventDefault() event.stopPropagation() } form.classList.add('was-validated') }, false) }) })() </script> <!--JavaScripts--> <script rel="lazy" src="https://seo.computer/assets/js/jquery-3.6.0.min.js" ></script> <script defer async src="https://seo.computer/assets/js/bootstrap.min.js" ></script> <script src="https://seo.computer/assets/js/custom-blocks.js" charset="utf-8"></script><script defer async src="https://seo.computer/assets/js/jquery.mask.min.js" async></script> <!-- <script defer async src="https://seo.computer/assets/js/lottie-player.js" ></script> --> <!-- Bitrix --> <!-- <script defer async> setTimeout(function(){ (function(w,d,u){ var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/60000|0); var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h); })(window,document,'https://cdn-ru.bitrix24.ru/b20061858/crm/site_button/loader_7_7psi5t.js'); setTimeout(function(){ let linksNoHref = [...document.querySelectorAll('a.b24-widget-button-social-item')]; if (linksNoHref.length > 0) { for (l of linksNoHref) { if (!l.href) l.setAttribute('href','#'); } } }, 1000); }, 4000); </script> <script defer async> window.addEventListener('onBitrixLiveChat', function(event) { var widget = event.detail.widget; widget.subscribe({ type: BX.LiveChatWidget.SubscriptionType.configLoaded, callback: function() { widget.addLocalize({BX_LIVECHAT_LOADING: ' '}); widget.addLocalize({BX_LIVECHAT_ERROR_TITLE: ' '}); widget.addLocalize({ BX_LIVECHAT_VOTE_BUTTON: ' ', BX_LIVECHAT_ERROR_DESC: ' ', BX_MESSENGER_TEXTAREA_PLACEHOLDER: '✎...', }) } }); }); </script> <style>.b24-widget-button-wrapper.b24-widget-button-position-bottom-right, .b24-widget-button-wrapper.b24-widget-button-position-bottom-middle, .b24-widget-button-wrapper.b24-widget-button-position-bottom-left {bottom: 5px; right: 2px;} .bx-livechat-logo-name, .bx-livechat-logo-icon, .bx-livechat-copyright-link, .bx-livechat-help-title-lg, .bx-im-dialog-group-date, .b24-form-sign, .bx-imopenlines-message-dialog-number, .bx-imopenlines-form-result-title, .bx-livechat-user-position, .bx-im-message-type-system .bx-im-message-content, .b24-form-control-alert-message, .bx-touch .b24-widget-button-position-bottom-right .b24-widget-button-popup-triangle {display:none} .bx-livechat-help-title-sm {font-size:0px;} .b24-form-wrapper {min-height: 150px !important;} .bx-imopenlines-form-result-container {min-height: 50px !important;} .bx-imopenlines-form-result-container.bx-imopenlines-form-success {background: none;border-bottom: none;} .bx-touch .b24-widget-button-position-bottom-right .b24-widget-button-popup {left: -240px !important; bottom: 5px !important;}</style> --> <!-- /Bitrix --> <!-- Yandex.Metrika counter --> <script defer async type="text/javascript" async> setTimeout(function(){ (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(86303743, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, ecommerce:"dataLayer" }); }, 4000); </script> <noscript><div><img width="1" height="1" src="https://mc.yandex.ru/watch/86303743" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-R6MGYCXWFG"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-R6MGYCXWFG'); </script> <!-- Top100 (Kraken) Counter --> <script defer async> setTimeout(function(){ (function (w, d, c) { (w[c] = w[c] || []).push(function() { var options = { project: 7728665, }; try { w.top100Counter = new top100(options); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//st.top100.ru/top100/top100.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(window, document, "_top100q"); }, 4000); </script> <noscript> <img width="1" height="1" src="//counter.rambler.ru/top100.cnt?pid=7728665" alt="Top 100 Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" title="Top 100 Fundamentals of JavaScript SEO for your site: how to provide visibility in Google in Moscow" /> </noscript> <!-- END Top100 (Kraken) Counter --> <script defer async> $(document).ready(function() { $(".form").submit(function(e) { e.preventDefault(); var form = $(this); if (form.find('input:invalid').length === 0) { $.ajax({ type: "POST", url: form.attr('action'), datatype: 'json', data: form.serialize(), // serializes the form's elements. success: function(data) { if(data.message === true) { $('#SuccessModal').modal('show'); form.trigger('reset'); } } }); } }); $("#form-analytcs").submit(function(e) { e.preventDefault(); var form = $(this); if (form.find('input:invalid').length === 0) { $.ajax({ type: "POST", url: form.attr('action'), datatype: 'json', data: form.serialize(), // serializes the form's elements. success: function(data) { if(data.message === true) { $('#myModal').modal('hide'); $('#SuccessModal').modal('show'); form.trigger('reset'); } } }); } }); // ---- Analyzer redirect: hijack hero_form to push directly into seo-analyzer ---- $('form.hero_form[data-analyzer-redirect="1"]').on('submit', function(e){ var form = $(this); var input = form.find('input[name="domain"]'); var raw = (input.val() || '').trim(); if (!raw) { return; } var endpoint = form.attr('data-analyzer-url') || 'https://seo-analyzer.seo.computer/domain'; // Normalize: drop scheme, leading www, trailing slash, anything after first slash/space var host = raw.replace(/^https?:\/\//i,'').replace(/^www\./i,'').split(/[\/\?#\s]/)[0].toLowerCase(); if (!host || host.indexOf('.') === -1) { return; } e.preventDefault(); // Build hidden form and submit it (POST so analyzer can read $_POST['url']) var hf = $('<form>').attr({method:'POST', action: endpoint}).css('display','none'); hf.append($('<input>').attr({type:'hidden', name:'url', value: host})); $('body').append(hf); hf[0].submit(); }); $('.content_toggle').click(function(){ $('.content_block').toggleClass('hide'); if ($('.content_block').hasClass('hide')) { $('.content_toggle').html('Read more'); } else { $('.content_toggle').html('Collapse'); } return false; }); $('.load-more').click(function () { var button = $(this); var link = $(this).data('cat'); var page = $(this).data('page'); var count = page + 1; $.ajax({ type: "GET", url: 'https://seo.computer/en/' + link +'?page=' + page, success: function(response) { if (response.html === ''){ button.fadeOut('slow'); } else { $('#' + link + '_results').append(response.html); button.data('page', count); } }, error: function(request, status, error) { console.log(request); } }); }); $('#languageForm').on('submit', function(e) { e.preventDefault(); $.ajax({ type: 'POST', url: 'https://seo.computer/change-language', data: $('#languageForm').serialize(), success: function(data) { if (data.message === true) { // Обновите URL с новым языком var currentUrl = window.location.href; var split = currentUrl.split('/'); split[3] = data.lang; var newUrl = split.join('/'); if (currentUrl === newUrl) { window.location = '/' + data.lang + '/'; } else { window.location = newUrl; } } } }); }); $('#search').on('input', function(e) { e.preventDefault(); var query = $(this).val(); $.ajax({ type: 'GET', url: 'https://seo.computer/search', data: { query: query, locale: 'en' }, success: function(data) { var results = $('#cites'); results.empty(); if (data.length > 0) { data.forEach(function(city) { results.append($('<a class="col text-decoration-none text-dark">').text(city.prepositional).attr('href', 'https://' + city.slug + '.seo.computer/en')); }); } else { results.html('<div class="col"><span>No results found.</span></div>'); } } }); }); }); </script> <script defer async> (function(){ async function hrefifyLinks(){ let linksnh = []; while (linksnh.length < 2) { linksnh = [...document.querySelectorAll('a')].filter(v=>v.getAttribute('href')===null); if (linksnh.length < 2) { await new Promise(r=>setTimeout(r,500)); } } for (let l of linksnh) {l.href = '#';} } hrefifyLinks(); })(); </script> </body> </html>