Javascript for browser

Updated on

0
(0)

To dive into JavaScript for the browser, understanding its core role and how it interacts with web pages is key.

👉 Skip the hassle and get the ready to use 100% working script (Link in the comments section of the YouTube Video) (Latest test 31/05/2025)

Check more on: How to Bypass Cloudflare Turnstile & Cloudflare WAF – Reddit, How to Bypass Cloudflare Turnstile, Cloudflare WAF & reCAPTCHA v3 – Medium, How to Bypass Cloudflare Turnstile, WAF & reCAPTCHA v3 – LinkedIn Article

Think of it as the brain behind the dynamic, interactive web experiences we all use daily.

Here’s a quick-start guide to get you up and running:

  • Understanding the Basics: JavaScript is a high-level, interpreted programming language. It’s primarily used for making web pages interactive. When you see animations, dynamic content updates, or forms that validate in real-time, that’s JavaScript at work in your browser.
  • Browser as the Runtime Environment: Your web browser like Chrome, Firefox, Safari, Edge includes a JavaScript engine e.g., Google’s V8, Mozilla’s SpiderMonkey. This engine reads and executes the JavaScript code embedded in or linked to an HTML page.
  • Integrating JavaScript:
    • Inline: You can write small snippets directly within HTML tags using the on attributes e.g., <button onclick="alert'Hello!'.">Click Me</button>. While quick for demos, it’s generally discouraged for larger projects due to separation of concerns.

    • Internal: Place your JavaScript code within <script> tags directly in your HTML file, typically at the end of the <body> section to ensure HTML elements are loaded before the script tries to interact with them.

      <!DOCTYPE html>
      <html>
      <head>
          <title>My Page</title>
      </head>
      <body>
          <h1>Welcome!</h1>
          <script>
              // Your JavaScript code here
              console.log"Page loaded!".
          </script>
      </body>
      </html>
      
    • External: The most recommended and widely used method. Write your JavaScript in a separate .js file and link it to your HTML using the src attribute of the <script> tag. This promotes cleaner code, reusability, and better caching.

      <script src="my_script.js" defer></script>
      
      
      <!-- 'defer' ensures script runs after HTML parsing -->
      

      And in my_script.js:

      
      
      document.addEventListener'DOMContentLoaded',  => {
      
      
         console.log'DOM fully loaded and parsed. Ready for action!'.
      
      
         // Your interactive JavaScript code goes here
      
      
         const greetingElement = document.querySelector'h1'.
          if greetingElement {
      
      
             greetingElement.textContent = 'Welcome, JavaScript User!'.
          }
      }.
      
  • Key Concepts to Master:
    • DOM Manipulation: Learning how JavaScript interacts with the Document Object Model DOM is fundamental. This allows you to select, create, modify, and delete HTML elements.
    • Events: Understanding how to listen for and respond to user actions clicks, key presses, form submissions is crucial for interactivity.
    • Asynchronous JavaScript: Concepts like setTimeout, setInterval, Promises, async/await are vital for handling operations that don’t block the main thread, such as fetching data from a server.
    • ES6+ Features: Modern JavaScript includes powerful features like arrow functions, let/const, template literals, and destructuring that make your code cleaner and more efficient.

Table of Contents

The Foundational Role of JavaScript in Web Browsers

JavaScript’s evolution has been nothing short of transformative for the internet. Initially conceived as a “scripting language for the web” to add basic interactivity, it has grown into the undisputed powerhouse driving virtually all modern web applications. When we talk about “JavaScript for the browser,” we’re discussing its intrinsic capability to manipulate the Document Object Model DOM, handle user interactions, communicate with servers asynchronously, and dynamically alter page content without requiring full page reloads. This client-side execution is what distinguishes it from server-side languages, making web experiences fluid and responsive. According to Statista, as of 2023, 65.36% of developers worldwide use JavaScript, solidifying its position as the most popular programming language, largely due to its browser dominance. Without JavaScript, the web would be a static collection of documents, devoid of the rich applications we rely on daily.

Understanding the Browser’s JavaScript Engine

Every major web browser integrates a sophisticated JavaScript engine, a specialized interpreter that reads, parses, and executes JavaScript code. These engines are designed for extreme efficiency and speed. For instance, Google Chrome uses the V8 engine, known for its JIT Just-In-Time compilation, which compiles JavaScript directly into machine code for faster execution. Mozilla Firefox uses SpiderMonkey, and Apple Safari uses JavaScriptCore. These engines are constantly optimized, incorporating new features and performance improvements to handle the increasingly complex demands of web applications. The engine’s primary role is to interpret your .js files, translate them into machine-readable instructions, and then execute those instructions to manipulate the web page, respond to user events, and manage network requests. The performance of these engines directly impacts the responsiveness and smoothness of your web browsing experience.

  • JIT Compilation: A key feature of modern JavaScript engines. Instead of interpreting code line by line, JIT compilers compile sections of JavaScript into machine code just before execution, leading to significant performance gains, often up to 10-100 times faster than traditional interpretation.
  • Memory Management: Engines handle memory allocation and garbage collection automatically, allowing developers to focus on logic rather than low-level memory operations.
  • Event Loop: Critical for handling asynchronous operations without blocking the main thread, ensuring a smooth user experience. The event loop continuously checks the message queue for tasks to execute.

DOM Manipulation: The Core of Interactive Web Development

The Document Object Model DOM is a programming interface for HTML and XML documents. It represents the page structure as a tree of objects, where each node is an HTML element, attribute, or text. JavaScript interacts with the DOM to dynamically change the content, structure, and style of a web page. This is where the magic of interactive web experiences truly happens. Want to change the text of a paragraph when a button is clicked? That’s DOM manipulation. Need to add a new image or remove an old one? Again, DOM manipulation. Mastering DOM manipulation is arguably the most fundamental skill for browser-side JavaScript development. A survey by Stack Overflow consistently shows that DOM manipulation is among the top challenges cited by junior web developers, highlighting its importance and initial complexity.

  • Selecting Elements:
    • document.getElementById'idName': Selects a single element by its unique ID.
    • document.querySelector'.className' or document.querySelector'tagName': Selects the first element matching a CSS selector.
    • document.querySelectorAll'.className': Selects all elements matching a CSS selector, returning a NodeList.
  • Modifying Elements:
    • element.textContent = 'New text': Changes the text content of an element.
    • element.innerHTML = '<strong>New HTML</strong>': Changes the inner HTML use with caution to prevent XSS vulnerabilities.
    • element.setAttribute'attribute', 'value': Sets an attribute e.g., src, href, class.
    • element.style.propertyName = 'value': Changes inline CSS properties e.g., element.style.color = 'blue'.
  • Creating and Deleting Elements:
    • document.createElement'tagName': Creates a new HTML element.
    • parentNode.appendChildchildNode: Adds a new child element to an existing parent.
    • parentNode.removeChildchildNode: Removes a child element from its parent.
    • element.remove: A simpler way to remove an element directly supported by modern browsers.

Handling Events: Making Web Pages Responsive to User Actions

Events are signals fired by the browser when something interesting happens on the web page. This could be anything from a user clicking a button, hovering over an image, typing into a form field, or even the page finishing loading. JavaScript’s event handling mechanism allows developers to “listen” for these events and execute specific code called “event handlers” or “event listeners” in response. This is the bedrock of creating dynamic and responsive user interfaces. Effective event handling is crucial for a smooth user experience. Data from usability studies suggests that an immediate visual or functional response to user interaction within 100ms significantly improves perceived performance and user satisfaction. Poorly handled events, such as those that block the main thread, can lead to a sluggish and frustrating experience.

  • Common Events:
    • click: When an element is clicked.
    • mouseover/mouseout: When the mouse pointer enters/leaves an element.
    • keydown/keyup: When a key is pressed/released.
    • submit: When a form is submitted.
    • load: When the entire page including resources has loaded.
    • DOMContentLoaded: When the HTML document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading.
  • Adding Event Listeners:
    • element.addEventListener'eventType', functionName: The preferred modern method. Allows multiple handlers for a single event and better control.

      Const myButton = document.getElementById’myBtn’.
      myButton.addEventListener’click’, => {
      alert’Button clicked!’.

  • Event Object: Event handlers receive an event object as an argument, which contains useful information about the event e.g., event.target, event.preventDefault, event.stopPropagation.
    • event.preventDefault: Stops the default action of an event e.g., preventing a form from submitting.
    • event.stopPropagation: Prevents the event from bubbling up to parent elements.

Asynchronous JavaScript: Non-Blocking Operations and Data Fetching

In the browser environment, JavaScript runs on a single thread. This means if a long-running operation like fetching data from a server were to block this thread, the entire user interface would freeze, becoming unresponsive. This is where asynchronous programming becomes indispensable. Asynchronous JavaScript allows certain operations to be executed in the background without halting the main execution flow. This ensures that the UI remains responsive, providing a much better user experience. The rise of APIs and dynamic content delivery means that over 80% of modern web applications rely heavily on asynchronous JavaScript for tasks like fetching data, loading images, or submitting forms without full page reloads.

  • Callbacks: The traditional way to handle asynchronous code. A function is passed as an argument to another function and executed once the asynchronous operation completes. While functional, “callback hell” nested callbacks can make code hard to read and maintain.
  • Promises: A significant improvement over callbacks, introduced in ES6. A Promise represents the eventual completion or failure of an asynchronous operation and its resulting value.
    • fetch'url': Modern API for making network requests, returns a Promise.
    • .then: Handles the successful resolution of a Promise.
    • .catch: Handles errors during a Promise’s execution.
    • .finally: Executes regardless of success or failure.
  • Async/Await: Syntactic sugar built on top of Promises, introduced in ES2017. It makes asynchronous code look and behave more like synchronous code, greatly improving readability and maintainability.
    • async function fetchData {}: Declares an asynchronous function.
    • await promise: Pauses the execution of the async function until the Promise resolves, then returns its value.
    async function getUserData {
        try {
    
    
           const response = await fetch'https://api.example.com/users/1'.
            if !response.ok {
    
    
               throw new Error`HTTP error! status: ${response.status}`.
            const data = await response.json.
            console.logdata.
        } catch error {
    
    
           console.error'Error fetching data:', error.
        }
    }
    getUserData.
    

Modern JavaScript ES6+: Enhancing Development Efficiency

ECMAScript 2015 ES6 marked a pivotal moment in JavaScript’s evolution, introducing a plethora of new features and syntax enhancements that dramatically improved developer experience and code readability. Subsequent annual releases ES2016, ES2017, etc. have continued this trend, adding more powerful tools. Embracing these modern features is not just about keeping up. it’s about writing cleaner, more efficient, and more maintainable code. Projects that fail to adopt modern JavaScript often face higher development costs due to legacy code issues and increased onboarding time for new developers. A GitHub survey showed that over 70% of new JavaScript projects initiated in the last two years are leveraging ES6+ features extensively.

  • let and const for variable declarations:

    • let: Block-scoped variable, can be reassigned. Replaces var in most cases.
    • const: Block-scoped constant, cannot be reassigned after initial declaration. Use for values that won’t change.
  • Arrow Functions =>:

    • Concise syntax for writing functions.
    • Lexical this binding inherits this from the enclosing scope, solving common this context issues.
      // Traditional function

    Document.addEventListener’click’, function {

    console.logthis. // 'this' refers to the document
    

    }.

    // Arrow function
    document.addEventListener’click’, => {

    console.logthis. // 'this' refers to the global window object lexical scope
    
  • Template Literals `:

    • Backticks allow for multiline strings and embedded expressions using ${}.
    • Eliminates the need for string concatenation with +.
      const name = “Alice”.
      const greeting = Hello, ${name}! Welcome to our page..
      console.loggreeting.
  • Destructuring Assignment:

    • Extract values from arrays or properties from objects into distinct variables.
    • Improves readability and reduces boilerplate.

    Const person = { firstName: ‘John’, lastName: ‘Doe’ }.
    const { firstName, lastName } = person.
    console.logfirstName, lastName. // John Doe

    const colors = .
    const = colors.
    console.logprimary, secondary. // red green

  • Spread and Rest Operators ...:

    • Spread: Expands an iterable like an array into individual elements or properties of an object. Useful for copying arrays/objects or merging them.
    • Rest: Gathers multiple arguments into a single array. Used in function parameters.
      const arr1 = .

    Const arr2 = . // Spread:

    Function sum…numbers { // Rest: numbers will be an array

    return numbers.reduceacc, curr => acc + curr, 0.
    

    console.logsum1, 2, 3. // 6

  • Modules ESM:

    • Standardized way to organize JavaScript code into reusable modules using import and export.
    • Enhances code organization, reusability, and maintainability.
    • Browser support is widespread, but often used with build tools like Webpack or Rollup for older browser compatibility and optimization.

Browser APIs: Extending JavaScript’s Capabilities Beyond the DOM

While the DOM provides the core for manipulating web page content, browsers expose a vast array of Web APIs that extend JavaScript’s capabilities far beyond simple content manipulation. These APIs allow web applications to interact with the user’s device, access sensors, manage data storage, draw graphics, and much more, blurring the lines between traditional desktop applications and web experiences. Leveraging these APIs can unlock powerful functionalities. For example, the Geolocation API is used by over 1.5 billion mobile web users annually for location-based services, demonstrating the real-world impact of these browser-provided tools. It’s crucial for developers to be aware of the range of APIs available to build rich, immersive web applications.

  • Storage APIs:

    • localStorage and sessionStorage: Store key-value pairs in the user’s browser. localStorage persists across sessions, sessionStorage clears when the browser tab is closed. Useful for storing user preferences, tokens, or temporary data.
    • IndexedDB: A low-level API for client-side storage of large amounts of structured data, including files/blobs. Ideal for offline applications.
  • Fetch API: The modern, Promise-based API for making network requests HTTP requests. Replaces the older XMLHttpRequest.
    fetch’https://api.example.com/data
    .thenresponse => response.json
    .thendata => console.logdata

    .catcherror => console.error’Error:’, error.

  • Geolocation API: Allows web applications to access the user’s geographical location with user permission.
    if navigator.geolocation {

    navigator.geolocation.getCurrentPositionposition => {
    
    
        console.log`Latitude: ${position.coords.latitude}, Longitude: ${position.coords.longitude}`.
    
  • Canvas API: Provides a JavaScript API for drawing graphics, animations, and interactive content on an HTML <canvas> element. Great for games, data visualizations, and image processing.

  • Web Workers API: Allows JavaScript code to run in a background thread, separate from the main execution thread. This is crucial for performing heavy computations without freezing the UI, enhancing responsiveness.

  • Notification API: Enables web pages to send notifications to the user’s desktop, even if the user has switched to another application. Requires user permission.

  • Web Speech API: Provides speech recognition and speech synthesis capabilities, allowing voice commands and spoken responses in web applications.

Performance Optimization and Best Practices for Browser JavaScript

While modern JavaScript engines are incredibly fast, writing inefficient code can still lead to sluggish web applications. Performance optimization in browser JavaScript is about ensuring your code executes quickly, uses minimal resources, and provides a smooth user experience. This involves understanding how browsers render content, how JavaScript interacts with the DOM, and how network requests impact perceived performance. According to Google’s Lighthouse audits, JavaScript execution time is a critical factor in web performance, often accounting for 30-50% of the total page load time for complex applications. Adhering to best practices not only makes your applications faster but also more maintainable and scalable.

  • Minimize DOM Manipulation:
    • Accessing and modifying the DOM is relatively expensive. Batch DOM changes where possible.
    • Use DocumentFragments to build complex DOM structures off-screen and then append them to the DOM in a single operation.
    • Limit reflows and repaints: Changes to layout reflows or appearance repaints are costly. Avoid unnecessary recalculations.
  • Debouncing and Throttling:
    • For events that fire frequently e.g., resize, scroll, mousemove, keyup, debounce or throttle your event handlers to limit how often they execute.
    • Debouncing: Ensures a function is only called after a certain period of inactivity e.g., waiting for user to finish typing.
    • Throttling: Limits the rate at which a function can be called over time e.g., firing scroll events every 100ms.
  • Efficient Asynchronous Operations:
    • Cache API responses: Store frequently accessed data in localStorage or IndexedDB to reduce network requests.
    • Optimize image loading: Use responsive images, lazy loading e.g., loading="lazy" attribute, and appropriate image formats WebP.
    • Prioritize critical requests: Ensure essential scripts and data load first.
  • Code Splitting and Lazy Loading:
    • Break down large JavaScript bundles into smaller chunks that can be loaded on demand lazy loading. This reduces the initial load time.
    • Common with module bundlers like Webpack.
  • Minification and Compression:
    • Minify: Remove unnecessary characters whitespace, comments from your code to reduce file size.
    • Compress: Use Gzip or Brotli compression on your web server to further reduce the size of JavaScript files transferred over the network.
  • Avoid Global Variables: Global variables can lead to naming conflicts and make code harder to debug. Use modules or IIFEs Immediately Invoked Function Expressions to encapsulate your code.
  • Error Handling: Implement robust try...catch blocks and use browser developer tools to effectively debug errors. Logging errors to a server can also provide valuable insights into user-reported issues.
  • WebAssembly as an Alternative: For extremely performance-critical tasks e.g., complex calculations, 3D graphics, video editing within the browser, WebAssembly offers a way to run near-native performance code directly in the browser. While not a replacement for JavaScript, it’s a powerful complement for specific use cases.

Frequently Asked Questions

What is JavaScript used for in the browser?

JavaScript is primarily used in the browser to make web pages interactive and dynamic.

This includes tasks like manipulating the Document Object Model DOM to change content and styles, handling user events clicks, key presses, performing asynchronous data fetching from servers, validating forms, creating animations, and building single-page applications.

Is JavaScript essential for all websites?

No, JavaScript is not essential for all websites. Static websites e.g., simple blogs, informational pages can function perfectly well with just HTML and CSS. However, for any website that requires interactivity, dynamic content updates, real-time communication, or complex user interfaces, JavaScript is indispensable. Most modern web applications heavily rely on it.

How does JavaScript interact with HTML and CSS?

JavaScript interacts with HTML by manipulating the Document Object Model DOM, which is a tree-like representation of the HTML structure.

It can select HTML elements, change their content, attributes, and structure.

It interacts with CSS by modifying the style properties of elements or by adding/removing CSS classes, thereby changing their appearance and layout dynamically.

What are the main differences between let, const, and var in JavaScript?

var is function-scoped and can be re-declared and re-assigned.

let and const are block-scoped limited to the block, e.g., {} within which they are defined. let can be re-assigned but not re-declared in the same scope.

const cannot be re-assigned or re-declared after its initial declaration, making it suitable for values that should not change.

Modern JavaScript primarily uses let and const. Easy code language

What is the DOM and why is it important for browser JavaScript?

The DOM Document Object Model is a programming interface for web documents.

It represents the page as a tree of objects, allowing programming languages like JavaScript to interact with the page’s content, structure, and style.

It’s crucial for browser JavaScript because it provides the API through which scripts can dynamically access, modify, and update the HTML and CSS of a web page.

What are browser developer tools and how do they help with JavaScript?

Browser developer tools often accessed by F12 or right-click -> Inspect are built-in features in web browsers that provide an environment for debugging, profiling, and inspecting web applications.

For JavaScript, they offer a console to execute code and view logs, a debugger to step through code, inspect variables, and set breakpoints, and network tabs to monitor API calls, all of which are invaluable for developing and troubleshooting JavaScript applications.

Can JavaScript run outside of a browser?

Yes, JavaScript can run outside of a browser using runtime environments like Node.js.

Node.js uses Google’s V8 JavaScript engine the same one in Chrome to execute JavaScript code on the server side, allowing developers to build server-side applications, command-line tools, and more using JavaScript.

What is asynchronous JavaScript and why is it important?

Asynchronous JavaScript allows operations to run in the background without blocking the main execution thread of the browser.

This is crucial because JavaScript in the browser is single-threaded.

If operations like fetching data from a server were synchronous, the browser UI would freeze and become unresponsive. Api request using python

Asynchronous programming using callbacks, Promises, async/await ensures a smooth user experience.

What are Promises and how do they simplify asynchronous code?

Promises are a way to handle asynchronous operations more cleanly than traditional callbacks.

A Promise represents the eventual completion or failure of an asynchronous operation and its resulting value.

They simplify asynchronous code by allowing you to chain operations using .then for success and .catch for errors, leading to more readable and manageable code, avoiding “callback hell.”

What is the difference between == and === in JavaScript?

== loose equality performs type coercion, meaning it attempts to convert the operands to the same type before making the comparison.

=== strict equality does not perform type coercion.

It compares both the value and the type of the operands.

It is generally recommended to use === to avoid unexpected type conversion issues.

How do you include JavaScript in an HTML file?

There are three main ways:

  1. Inline: Directly within HTML attributes e.g., <button onclick="alert'Hello!'.">.
  2. Internal: Within <script> tags directly in the HTML file, typically at the end of the <body> for better performance.
  3. External: In a separate .js file, linked using <script src="path/to/script.js"></script>, preferably with the defer attribute. External is generally the preferred method for maintainability and caching.

What is event bubbling and event capturing in JavaScript?

These describe the order in which events are processed on nested HTML elements. Api webpage

  • Capturing trickling down: The event first goes down from the window to the target element.
  • Bubbling bubbling up: The event then propagates from the target element up to the window.
    By default, addEventListener uses bubbling.

You can specify true as the third argument to addEventListener to use capturing instead.

What is the purpose of event.preventDefault?

event.preventDefault is a method of the Event object that stops the default action associated with an event.

For example, when used on a form’s submit event, it prevents the form from actually submitting and reloading the page.

When used on an <a> tag’s click event, it prevents the browser from navigating to the linked URL.

What are Web APIs and why are they important for browser JavaScript?

Web APIs Application Programming Interfaces are browser-provided interfaces that allow JavaScript to interact with various functionalities beyond the DOM.

Examples include the Fetch API for network requests, Geolocation API for location services, Canvas API for drawing graphics, Web Storage API for client-side data storage, and many more.

They are crucial because they extend the capabilities of web applications, enabling richer, more interactive, and feature-rich experiences directly in the browser.

How does JavaScript handle errors in the browser?

JavaScript handles errors primarily using try...catch blocks.

Code that might throw an error is placed inside the try block.

If an error occurs, the execution jumps to the catch block, where the error can be handled or logged. Browser agent

finally can be used to execute code regardless of whether an error occurred.

Modern practices also involve global error handling e.g., window.onerror for capturing uncaught errors.

What is the role of the defer and async attributes on the <script> tag?

Both defer and async improve the loading performance of web pages by allowing scripts to be downloaded in parallel with HTML parsing.

  • async: Scripts with async are downloaded asynchronously and executed as soon as they are available, potentially interrupting HTML parsing. Best for independent scripts.
  • defer: Scripts with defer are downloaded asynchronously but executed only after the HTML document has been fully parsed and before the DOMContentLoaded event. They maintain their relative order of execution. Best for scripts that depend on the DOM.

What is client-side rendering versus server-side rendering in the context of JavaScript?

  • Client-Side Rendering CSR: The browser downloads a minimal HTML page and then JavaScript takes over to fetch data, build the page structure, and render the content directly in the browser. This is common with frameworks like React, Angular, and Vue.
  • Server-Side Rendering SSR: The server renders the initial HTML and CSS for the page, including the dynamic content, and sends it to the browser. JavaScript then “hydrates” this pre-rendered content on the client side to make it interactive. SSR can improve initial load performance and SEO.

What are common performance pitfalls in browser JavaScript?

Common pitfalls include:

  1. Excessive DOM manipulation: Frequent updates to the DOM can be slow.
  2. Long-running synchronous tasks: Blocking the main thread causes UI freezes.
  3. Inefficient loops and algorithms: Poorly optimized code, especially with large datasets.
  4. Unoptimized network requests: Too many requests, large payloads, or lack of caching.
  5. Not using defer or async for script loading: Blocking HTML parsing.
  6. Memory leaks: Unreleased references causing memory consumption to grow.

What is a single-page application SPA and how does JavaScript enable it?

A Single-Page Application SPA is a web application that loads a single HTML page and dynamically updates its content as the user interacts with it, rather than requiring full page reloads.

JavaScript is the core technology that enables SPAs by handling all routing, data fetching, view rendering, and DOM manipulation on the client side, providing a fluid, app-like user experience.

What are JavaScript frameworks and libraries for browser development?

JavaScript frameworks like React, Angular, Vue.js and libraries like jQuery, Lodash provide pre-written code and structures to accelerate browser-side development.

Frameworks offer more opinionated, comprehensive solutions for building entire applications, while libraries offer specific utilities or functionalities.

They help manage complexity, enforce patterns, and improve developer productivity when building large-scale interactive web applications.

C# scrape web page

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *