A Bit of Background

I have been working with Dynamics CRM/365 since 2005 and have written a tens of thousands of lines of JavaScript over the years and shared countless blog articles as I found tips and techniques for using JavaScript in the product. Here is my first blog post, on how to hide a tab in CRM 3.0.

I obtained my Microsoft Certified Training certification in order to teach what I learned to others.  I started out using the Microsoft-supplied materials but I wasn't satisfied with their depth - so I created my own, which is what you see here.

Unlimited Updates

There is a lot to learn about with this topic and it is constantly changing.   The goal is for this course to be evergreen and always changing and adapting to  new additions and changes that the Microsoft Dynamics 365 product team throws at us. This means new tools, techniques, and tutorials will be added as we move forward into the future.

Why This Course?

JavaScript development in Dynamics 365 can be complex but it doesn't have to be daunting. Based on years of experience teaching JavaScript development, I have created a curriculum that takes a lot of the pain out of the equation.

Let’s take a look at what this course has to offer:

Small, Bite-Sized Chunks

Each module is broken into a lessons consisting of articles, presentations, and exercises to help you learn a specific part of the Dynamics 365 object model.

The course operations in a "drip" fashion so that you do not get overwhelmed by the amount of content you have to cover.

Each Saturday, a new module or modules (depending on the complexity) are released. You may consume them at your leisure.

Lifetime Access

This is a one-time investment. You get unlimited use of all of the content,  sample code, and tutorials, for as long as you want.

Real-World Examples

The other sections are styled to help you create beautiful, high-converting pages. If you already know exactly what you want, use this section to add text, images, video, audio, etc. and build something completely custom. This is your sandbox — create what you want!

Course Completion Certificate

Upon the completion of this course, you will receive a certificate stating  that you are a Dynamics 365 JavaScript developer. We can even post that to LinkedIn, if you wish!

Start Now!

Are you ready? Of course you are. Click the button below to get started!

Get started now

Course curriculum

  • 1
    Discussion Forum
    • Overview
    • Announcements
    • General Discussions
    • Course Suggestions
  • 2
    Module 1: Before We Begin
    • About This Course
    • JavaScript Development Training Roadmap
    • A Note About Versions
    • An Introduction to JavaScript
    • JavaScript or Business Rules?
    • Business Rules Review (encore Free Webinar Friday presentation)
    • Revision History
  • 3
    Module 2: Getting Started
    • Assemble Your Toolbox
    • Install the Sample Entity Solution
    • Creating a New Visual Studio Solution
    • Setting up your Development Environment
    • The Problem with Browser Caching
    • The reality of working with two versions of the Dynamics 365 web interface
    • Solution to Why is the form editor not working correctly?
  • 4
    Module 3: Dynamics 365 JavaScript Object Model
    • Dynamics 365 Object Model (v8.2)
    • Dynamics 365 CE Object Model (v9.x)
    • Common Object Model Methods
    • Understanding Form Field Attributes and Controls
  • 5
    Module 4: Differences in the Dynamics 365 CE v9 Object Model
    • Working with the v9 Object Model
    • Introduction to the Execution Context object
    • Using the executionContext.getFormContext Method
  • 6
    Module 5: Creating a JavaScript Namespace Framework
    • Creating your own object model
  • 7
    Module 6: JavaScript Form Libraries and Event Handlers
    • JavaScript Web Resource Basics
    • Show Me How: Create Your First JavaScript Library
    • Note on Event Handlers
    • Working with the OnLoad, OnSave, and OnChange Event Handlers
    • A quick tour of the Form Library Event Handlers
    • Removing All JavaScript from a Form
    • Test Your Knowledge
  • 8
    Module 7: User Interface Design Elements
    • Introduction to Customizations (webinar replay)
  • 9
    Module 8: Debugging JavaScript
    • DYNAMICS CRM JavaScript Debugging Basics (webinar replay)
  • 10
    Module 9: Working with Data
    • JavaScript code for this lesson
    • Working with Data Methods
    • Getting and Setting Field Values
    • Exercise: Getting and Setting Field Values
    • Show Me How: Getting and Setting Field Values (from Visual Studio)
    • Setting the field requirement level
    • Exercise: Setting the Field Requirement Level
    • Show Me How: Setting the Field Requirement Level
    • Using the setSubmitMode Method
    • getAttributeType and getFormat methods
    • Test Your Knowledge
    • Additional Data Methods
  • 11
    Module 10: Working with Controls
    • Source Code for this Lesson
    • Introduction
    • L1: Working with Controls
    • E1: Setting the visibility of a Field
    • E2: Disable a Field
    • E3: Set a Field's Focus
    • S3: Set a Field's Focus
    • L2: Using the getAttribute Method
    • L3: Using the getControlType Method
    • Working with Control-Level Notifications
    • Show Me How: Working with Control Notifications
    • Q: Test Your Knowledge
  • 12
    Module 11: Working with Tabs
    • Sample code for this lesson
    • Working with Tabs
    • Exercise: Setting the Label of a Tab
    • Show Me How: Setting the Label of a Tab
    • Exercise: Showing a Tab
    • Show Me How: Showing a Tab
    • Exercise: Setting the DisplayState of a tab
    • Show Me How: Setting the DisplayState of a tab
    • Show Me How: Adding a custom entity to a Unifiied Interface Application
    • Show Me How: Running the exercises in the UCI interface
    • Bonus Code: Set field visibility based on a Tab's visibility
    • Test Your Knowledge
  • 13
    Module 12: Working with Sections
    • Sample code for this lesson
    • Working with Sections
    • Exercise: Showing a Hidden Section
    • Show Me How: Showing a Hidden Section
    • Exercise: Setting the Section Label
    • Show Me How: Setting the Section Label
    • Sample Code: Only allow a single checkbox in a section to be checked
    • Test Your Knowledge
  • 14
    Module 13: Working with OptionSets
    • Sample code for this lesson
    • Introduction to OptionSets and OptionSet Methods
    • Working with OptionSets
    • Exercise 1: Using the getInitialValue Method
    • Show Me How: Using the getInitialValue Method
    • Exercise 2: Using the getOption Method
    • Show Me How: Using the getOption Method
    • Exercise 3: Using the getOptions Method
    • Show Me How: Using the getOptions Method
    • Exercise 4: Using the getSelectedOption Method
    • Show Me How: Using the getSelectedOption Method
    • Exercise 5: Using the getText Method
    • Show Me How: Using the getText Method
    • Exercise 6: Using the clearOptions and addOptions Methods
    • Show Me How: Using the clearOptions and addOptions Methods
    • Exercise 7: Use the removeOption Method
    • Show Me How: Use the removeOption Method
    • Test Your Knowledge
    • Bonus: Show Me How: Creating a Dependent OptionSet - Part 1
    • Bonus: Show Me How: Creating a Dependent Option Set - Part 2
  • 15
    Bonus Module 1: Debugging JavaScript
    • A note about this lesson
    • Debugging JavaScript Solution
    • Introduction to JavaScript Debugging using Chrome and Internet Explorer
    • Exercises: Debugging JavaScript - All Labs
    • Show Me How: Exercise 2
    • Show Me How: Exercise 3
    • Show Me How: Exercise 4
    • Show Me How: Exercise 3
    • Show Me How: Exercise 5
    • Show Me How: Exercise 6
    • Show Me How: Exercise 7
    • Show Me How: Exercise 8
    • Show Me How: Exercise 8
  • 16
    Module 14: Working with Lookups
    • L1: Working with the Lookup Data Type
    • Working with Lookups
    • Test Your Knowledge
    • Show Me How Bonus: Working with addCustomView
    • Sample - addCustomView
  • 17
    Module 15: Working with Collections
    • formContext Collections
    • Working with JavaScript Collections
    • Collections Exercises
    • Show Me How: Build and Display a List of Navigation Items
    • Show Me How: Build and Display a List of Sections
    • Show Me How: Build and Display a List of OptionSet Fields
    • Test Your Knowledge
  • 18
    Module 16: Working with formContext.ui Methods
    • Form Types
    • Exercise: Using the getFormType Method
    • Show Me How: Using the getFormType Method
    • Form Notifications
    • Exercise: Using Form Notifications
    • Show Me How: Using Form Notifications
    • close Method
    • refreshRibbon Method
    • Additional Methods
    • Test Your Knowledge
  • 19
    Module 17: Working with Xrm.Navigation Methods
    • Xrm.Navigation Class Overview
    • Sample code for this module
    • Working with the Xrm.Navigation Methods
    • openAlertDialog Notes
    • Exercise: Using the openAlertDialog Method
    • Show Me How: Using openAlertDialog
    • Exercise: Using the openConfirmDialog Method
    • Show Me How: Using the openConfirmDialog Method
    • Using the openErrorDialog Method
    • Using the openFile Method
    • Exercise: Using the openForm Method
    • Show Me How: Using the openForm Method
    • Exercise: Using the openForm (quick create) method
    • Show Me How: Using the openForm - Quick Create Method
    • Using the openUrl Method
    • Exercise: Using the openUrl Method
    • Show Me How: Using the openUrl Method
    • Using the openWebResource Method
    • Exercise: Using the openWebResource Method
    • Show Me How: Using the openWebResource Method
    • Advanced JavaScript (async and await) Methods and Browser Support
    • Show Me How: Working with Async and Await methods
    • Test Your Knowledge
  • 20
    Module 18: Understanding and Working with the Execution Context
    • Exercise: Using the getEventSource Method
    • Show Me How: Using the getEventSource Method
    • setSharedVariable and getSharedVariable Methods
  • 21
    Module 20: Working with the Save Event
    • Sample Code for this Module
    • getSaveMode Method Return Values
    • Exercise: Working with the getSaveMode Method
    • Show Me How: Working with the getSaveMode Method
    • Exercise: Using the getEventArgs and preventDefault Methods
    • Show Me How: Using the getEventArgs and preventDefault Methods
    • Clean Up Your Exercises
    • Test Your Knowledge
  • 22
    Module 21: Client-Side Events
    • Sample code for this lesson
    • Client-Side Events Overview
    • Exercise: Using the addOnChange Method
    • Show Me How: Using the addOnChange Method
    • Exercise: Using the fireOnChange Method
    • Show Me How: Using the fireOnChange Method
    • Using the removeOnChange Method
    • Using the addOnSave Method
    • Using the removeOnSave Method
    • Using the close Method
    • Using the Xrm.Page.data.entity.save Method
    • Test Your Knowledge
  • 23
    Module 22: Working with the CRM RESTBuilder Tool
    • This is a live class where we review the CRM RESTBuilder tool
  • 24
    Module 23: Working with Xrm.WebApi methods
    • This is a live class where we review the Xrm.WebApi functionality
    • Sample code for this module
  • 25
    Module 24: Working with the JavaScript Utility Methods
    • Introduction
    • Working with the getClient, getClientState, and getFormFactor Methods
    • Working with the getAllowedStatusTransitions Method
    • Working with the getEntityMetadata Method
    • Working with the getLearningPathAttributeName Method
    • Working with the getResourceString Method
    • Working with the invokeProcessAction Method
    • Working with the lookupObjects Method
    • Working with the refreshParentGrid Method
    • Working with the showProgressIndicator and closeProgressIndicator Methods
    • Show Me How: Working with the showProgressindicator and closeProgressIndicator
    • Working with the Xrm.Utility.getGlobalContext Object
    • Working with clientContext.client Methods
    • Working with getGlobalContext.organizationSettings
    • Working with getGlobalContext().userSettings
  • 26
    Module 25: Working with Grids
    • Sample code for this chapter
    • Working with Grids - Part 1 - Setup
    • Introduction to the Grids API
    • Working with Grids - Part 2 - Understanding the Grid Hierarchy
    • GridControl Methods
    • Grid Methods
    • Show Me How: Working with the Grid
    • GridRow methods
    • GetRowData Methods
    • GridEntity Methods
    • GridAttribute Methods
    • GridCell Methods
    • ViewSelector Methods
  • 27
    Module 26: Working with Process Methods
    • Overview - formContext.ui.process
    • Overview - formContext.data.process
  • 28
    Module 27: Working with iFrames
    • Source code for this module
    • Overview
    • Exercise: Working with iFrames
    • Show Me How: Working with iFrames
    • Show Me How: Working with the OnReadyStateComplete Event
  • 29
    Module 28: Working with the Ribbon and Command Bar
    • Overview
  • 30
    Module 29: Additional Objects and Methods
    • Sample code for this module
    • Xrm.Encoding Overview
    • Show Me How: Using Xrm.Encoding
    • Xrm.Device Overview
    • Xrm.Device.getPosition
    • Show Me How: Using Xrm.Device.getPosition
    • Show Me How: Using Xrm.Device.getBarcode
    • Show Me How: Adding the entityimage field to the Sample Entity - Part 1
    • Show Me How: Using Xrm.Device.captureImage
    • Working with the Form Selector Methods
    • Form Selector Part 1 - Creating a new form
    • Form Selector Part 2 - Switching forms using JavaScript
    • Working with formContext.ui.navigation Methods
    • Xrm.Panel Overview
  • 31
    Meetup Recordings
    • This is where recordings of our monthly meetings will be stored

Investment Options

Choose one of the following investment options:


  • Do I have to know JavaScript or be a developer?

    No, I have a free Introduction to JavaScript course, on this site that you may review to get you jump started.

  • Will there be any "classroom activities" or i.e live classes that I have to attend to in order to complete the course? Or is it all prerecorded and in text format so I can complete it in my own pace?

    Most of the content is pre-recorded and new content will be made available every Saturday. Some modules will be face-to-face, because of the nature of the content.

  • Do I have to complete each lesson as it is delivered?

    No. You can complete the work at your own pace, in any time-frame you wish.

  • What if I have questions?

    The course has a built-in discussion forum should questions arise.

  • Is there any live training?

    We will have one live meeting per month to catch up and discuss what questions people may have in a live environment.

    In addition, some of the lessons are taught live because of their complexity, it is just better to review the topics in person.

    Recordings of live-lessons or meet-ups will be available for those who can't attend in person.

  • What if I fall behind?

    There is no behind. Since you set your own pace, you are in total control of your education.

  • How much time do need to devote to each week's new content?

    That will totally depend on the week. I would say to dedicate two hours per week to review the material and perform the exercises. You may require less, but you may also require more.

    Additionally, if you feel that one of the modules is not something you would need at the present time, you can always skip it and come back to it later, when it is more relevant to the projects you are working on.

  • What is the end-result of the course?

    Well, for one, you have strenghened your knowledge of the customizations aspects of Dynamics 365.

    You will also recieve a certificate that you can print and put on your all or share on LinkedIn.

So what are you waiting for?

Join the ranks of the other Dynamics 365 developers who are using JavaScript to extend their environments and their careers

Get started now

Your Instructor:

Hi Everyone,

My name is Mitch Milam and I want to personally thank you for taking a look at my course.

The main goal of this course is to teach you what I know about Dynamics 365 JavaScript and to enhance your knowledge of the product and the skillsets required  to do your job.

I started working with Dynamics CRM in November of 2005 when version 3.0 was still in pre-release and I turned knowledge of that product into an entirely new career for myself.

I am very active in the Dynamics community, have written a few books on the topic, and can be found hanging out at most of the Dynamics-related conferences either teaching or presenting. For my community efforts, Microsoft awarded me the Microsoft  MVP title for Dynamics CRM, for eleven years and it was an honor to be listed among the ranks of such a group of talented and generous people.

Thanks again for stopping by and please let me know if I missed anything.

Your Instructor: