# Customize Hosted Fields
source: https://developer.mastercard.com/mastercard-gateway/documentation/integrations-types/hosted-session/integrate-hosted-session/customize-hosted-fields/index.md

If you are using the Hosted Session integration method, you have various ways of customizing the hosted payment fields on your payment page. The customizations can help you match the look and feel of your payment page and improve your web site accessibility.

## Styling hosted fields {#styling-hosted-fields}

You can style hosted payment fields to match the look and feel of your overall payment page.
You can invoke the following functions in the Session JavaScript library(session.js) for styling payment fields:

* `setFocus( )`: Sets focus on the specified hosted field.
* `setFocusStyle( )`: Sets the styling attributes for the specified hosted fields when they gain focus.
* `setHoverStyle( )`: Sets the styling attributes for the specified hosted fields when a mouse hover occurs over them.
* `setPlaceholderStyle( )`: Sets the styling attributes for the placeholder text displayed on the specified hosted fields before the payer replaces it with their own entry.
* `setPlaceholderShownStyle( )`: Sets the styling attributes for the specified hosted fields when the placeholder text is visible.

### Payment field styling example {#payment-field-styling-example}

```javascript
PaymentSession.setFocus('card.number');
    
PaymentSession.setFocusStyle(["card.number","card.securityCode"], {
  borderColor: 'red',
  borderWidth: '3px'
});

PaymentSession.setHoverStyle(["card.number","card.securityCode"], {
  borderColor: 'red',
  borderWidth: '3px'
});

PaymentSession.setPlaceholderStyle(["card.number", "card.nameOnCard"], {
  color: 'blue',
  fontWeight: 'bold',
  textDecoration: 'underline'
});
PaymentSession.setPlaceholderShownStyle(["card.number", "card.nameOnCard"], {
  color: 'green',
  fontWeight: 'bold',
  textDecoration: 'underline'
});
```

## Using drop-down fields {#using-drop-down-fields}

If you are supporting credit card payments, you can use drop-down values for the hosted fields defining the card expiry month and year.

The following sample code shows how to define the drop-down fields within your payment page's hosted fields for a credit card payment.

### Drop-Down Field Example {#drop-down-field-example}

```html
<html>
<head>
<!-- INCLUDE SESSION.JS JAVASCRIPT LIBRARY -->
<script src="{{host}}/form/version/72/merchant/<MERCHANTID>/session.js"></script>
<!-- APPLY CLICK-JACKING STYLING AND HIDE CONTENTS OF THE PAGE -->
<style id="antiClickjack">body{display:none !important;}</style>
</head>
<body>

<!-- CREATE THE HTML FOR THE PAYMENT PAGE -->

<div>Enter your payment details:</div>

<div>Card Number: <input type="text" id="card-number" class="input-field" title="card number" aria-label="enter your card number" value="" tabindex="1" readonly></div>

<div>Expiry Month: 
<select id="expiry-month" class="form-control input-md" required="" readonly>
	<option value="">Select Month</option>
	<option value="01">January</option>
	<option value="02">February</option>
	<option value="03">March</option>
	<option value="04">April</option>
	<option value="05">May</option>
	<option value="06">June</option>
	<option value="07">July</option>
	<option value="08">August</option>
	<option value="09">September</option>
	<option value="10">October</option>
	<option value="11">November</option>
	<option value="12">December</option>
</select>
</div>
<div>Expiry Year: 
<select id="expiry-year" class="form-control input-md" required="" readonly>
	<option value="">Select Year</option>
	<option>21</option>
	<option>22</option>
	<option>23</option>
	<option>24</option>
	<option>25</option>
	<option>26</option>
	<option>27</option>
	<option>28</option>
	<option>29</option>
	<option>30</option>
	<option>31</option>
	<option>32</option>
	<option>33</option>
	<option>34</option>
	<option>35</option>
	<option>36</option>
	<option>37</option>
	<option>38</option>
	<option>39</option>
</select>
</div>
<div>Security Code:<input type="text" id="security-code" class="input-field" title="security code" aria-label="three digit CCV security code" value="" tabindex="4" readonly></div>

<div>Cardholder Name:<input type="text" id="cardholder-name" class="input-field" title="cardholder name" aria-label="enter name on card" value="" tabindex="3" readonly></div>

<div><button id="payButton" onclick="pay();">Pay Now</button></div>


</body>
</html>
```

## Configure accessibility {#configure-accessibility}

The Hosted Session provides functionality to improve the accessibility of your web site. For more information on web site accessibility, see the [WCAG 2 Overview](https://www.w3.org/WAI/standards-guidelines/wcag/).

### Setting the payment page language {#setting-the-payment-page-language}

To set the language of your overall payment page, add the lang attribute to the `<html>` element. Defining the page language helps assistive technologies render the text more accurately.

```html
<html lang="en">
    <head></head>
    <body></body>
</html>
```

### Setting the hosted field locale {#setting-the-hosted-field-locale}

To define the locale (language and region) of your hosted fields, add the locale argument to the PaymentSession.configure() function used to configure your session.

When you define the hosted field locale, the Session JavaScript library provides applicable translations for all the textual elements related to the hosted fields, including hidden labels and error messages. If the locale is not set, it defaults to English (en_US).

The supported locale values are de_DE, el_GR, en_US, es_MX, es_ES, fr_CA, fr_FR, it_IT, ja_JA, pl_PL, pt_BR, ro_RO, and zh_CN.
Warning: To avoid confusing your payers, make sure that the language of the payment page (lang attribute) matches the locale of the hosted fields.

```javascript
PaymentSession.configure({
  fields: {
    card: {
      nameOnCard: cardHolderNameField ? "#card-holder-name" : null,
      number: "#card-number",
      securityCode: "#security-code",
      expiryMonth: "#expiry-month",
      expiryYear: "#expiry-year"
    }
  },
  frameEmbeddingMitigation: ["javascript"],
  locale: "en_US",
  callbacks: {
    // Define your callback functions here
  }
});
```

### Improving the user experience for hosted fields {#improving-the-user-experience-for-hosted-fields}

The following options allow you to better control the user experience for payers with accessibility needs:

* Setting the iFrame title
  The hosted field's iFrame title attribute can be controlled using the title attribute on the field. The title represents advisory information for the field, such as a tooltip.

* Setting ARIA (Accessibility Rich Internet Application) attributes
  The Hosted Session supports various aria-\* attributes, which you can use to allow assistive technologies to help the payer. For example, the aria-label attribute provides a label that assistive technology can read to identify the hosted field for the payer.

* Setting the display parameter for invalid characters
  Consider accepting all characters in hosted fields for a better user experience when using assistive technology. To do this, set `interaction.displayControl.invalidFieldCharacters=ALLOW` within the configuration object argument of the [PaymentSession.configure()](https://developer.mastercard.com/mastercard-gateway/documentation/api-reference/js-libraries/session/index.md) function.

* Setting hidden label and error messages
  All hosted fields contain a hidden label and all mandatory hosted fields contain a hidden error message. Any errors resulting from invoking the [PaymentSession.updateSessionFromForm()](https://developer.mastercard.com/mastercard-gateway/documentation/api-reference/js-libraries/session/index.md) function raise an error message label. You can additionally raise your own errors using the [PaymentSession.setMessage()](https://developer.mastercard.com/mastercard-gateway/documentation/api-reference/js-libraries/session/index.md) function.

For example, the hidden label for the card number field is **card number** . The hidden error message for missing card number is **card number is missing, enter the value** . The hidden error message for invalid card number is **card number is invalid, enter the correct value**. While tabbing between the hosted fields, the screen reader reads only the hidden label and hidden error message, not the actual label or error message displayed on the page.

### Hosted Field Accessibility Example {#hosted-field-accessibility-example}

```html
<!-- CREATE THE HTML FOR THE PAYMENT PAGE -->
<div>Enter your payment details:</div> 

<div>Cardholder Name: <input type="text" id="cardholder-name" class="input-field" title="cardholder name" aria-label="enter name on card" value="" tabindex="1" readonly></div>

<div>Card Number: <input type="text" id="card-number" class="input-field" title="card number" aria-label="enter your card number" value="" tabindex="2" readonly></div>

<div>Expiry Month:<input type="text" id="expiry-month" class="input-field" title="expiry month" aria-label="two digit expiry month" value="" tabindex="3" readonly></div>

<div>Expiry Year:<input type="text" id="expiry-year" class="input-field" title="expiry year" aria-label="two digit expiry year" value="" tabindex="4" readonly></div>

<div>Security Code:<input type="text" id="security-code" class="input-field" title="security code" aria-label="card security code" value="" tabindex="5" readonly></div>

<div><button id="payButton" onclick="pay();">Pay Now</button></div> 
```

## Handling field focus {#handling-field-focus}

The default HTML5 auto-focus behavior does not work with hosted fields: when the payer clicks the label, the focus is not automatically moved to the corresponding input element.

To ensure correct focus functionality on your page, use the `setFocus()` function of the Session JavaScript library.

Warning: Hosted fields are not web accessible when using Internet Explorer 11 in combination with the SuperNova screen reader.

<br />

