-
Notifications
You must be signed in to change notification settings - Fork 27.4k
docs(input): better accessibility in examples #11079
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -113,12 +113,12 @@ | |
* | ||
* The buggy way to write it: | ||
* ```html | ||
* <img src="http://www.gravatar.com/avatar/{{hash}}"/> | ||
* <img src="http://www.gravatar.com/avatar/{{hash}}" alt="Description"/> | ||
* ``` | ||
* | ||
* The correct way to write it: | ||
* ```html | ||
* <img ng-src="http://www.gravatar.com/avatar/{{hash}}"/> | ||
* <img ng-src="http://www.gravatar.com/avatar/{{hash}}" alt="Description" /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
* ``` | ||
* | ||
* @element IMG | ||
|
@@ -139,12 +139,12 @@ | |
* | ||
* The buggy way to write it: | ||
* ```html | ||
* <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/> | ||
* <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x" alt="Description"/> | ||
* ``` | ||
* | ||
* The correct way to write it: | ||
* ```html | ||
* <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/> | ||
* <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x" alt="Description" /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I suggest the same change is made to the buggy way above. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gotcha. That makes sense to me. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @gkalpak @marcysutton why not add the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! Great suggestion. |
||
* ``` | ||
* | ||
* @element IMG | ||
|
@@ -181,7 +181,7 @@ | |
* @example | ||
<example> | ||
<file name="index.html"> | ||
Click me to toggle: <input type="checkbox" ng-model="checked"><br/> | ||
<label>Click me to toggle: <input type="checkbox" ng-model="checked"></label><br/> | ||
<button ng-model="button" ng-disabled="checked">Button</button> | ||
</file> | ||
<file name="protractor.js" type="protractor"> | ||
|
@@ -216,8 +216,8 @@ | |
* @example | ||
<example> | ||
<file name="index.html"> | ||
Check me to check both: <input type="checkbox" ng-model="master"><br/> | ||
<input id="checkSlave" type="checkbox" ng-checked="master"> | ||
<label>Check me to check both: <input type="checkbox" ng-model="master"></label><br/> | ||
<input id="checkSlave" type="checkbox" ng-checked="master" aria-label="Slave input"> | ||
</file> | ||
<file name="protractor.js" type="protractor"> | ||
it('should check both checkBoxes', function() { | ||
|
@@ -251,8 +251,8 @@ | |
* @example | ||
<example> | ||
<file name="index.html"> | ||
Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/> | ||
<input type="text" ng-readonly="checked" value="I'm Angular"/> | ||
<label>Check me to make text readonly: <input type="checkbox" ng-model="checked"></label><br/> | ||
<input type="text" ng-readonly="checked" value="I'm Angular" aria-label="Readonly field" /> | ||
</file> | ||
<file name="protractor.js" type="protractor"> | ||
it('should toggle readonly attr', function() { | ||
|
@@ -287,8 +287,8 @@ | |
* @example | ||
<example> | ||
<file name="index.html"> | ||
Check me to select: <input type="checkbox" ng-model="selected"><br/> | ||
<select> | ||
<label>Check me to select: <input type="checkbox" ng-model="selected"></label><br/> | ||
<select aria-label="ngSelected demo"> | ||
<option>Hello!</option> | ||
<option id="greet" ng-selected="selected">Greetings!</option> | ||
</select> | ||
|
@@ -324,7 +324,7 @@ | |
* @example | ||
<example> | ||
<file name="index.html"> | ||
Check me check multiple: <input type="checkbox" ng-model="open"><br/> | ||
<label>Check me check multiple: <input type="checkbox" ng-model="open"></label><br/> | ||
<details id="details" ng-open="open"> | ||
<summary>Show/Hide me</summary> | ||
</details> | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -68,13 +68,16 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="ExampleController"> | ||
Single word: <input type="text" name="input" ng-model="example.text" | ||
ng-pattern="example.word" required ng-trim="false"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.pattern"> | ||
Single word only!</span> | ||
|
||
<label>Single word: | ||
<input type="text" name="input" ng-model="example.text" | ||
ng-pattern="example.word" required ng-trim="false"> | ||
</label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.pattern"> | ||
Single word only!</span> | ||
</div> | ||
<tt>text = {{example.text}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -153,13 +156,15 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="DateController as dateCtrl"> | ||
Pick a date in 2013: | ||
<label for="exampleInput">Pick a date in 2013:</label> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It normally would, but it's isolated to this one demo: https://docs.angularjs.org/api/ng/input/input%5Bdate%5D. They show up on different pages (date and datetime-local). |
||
<input type="date" id="exampleInput" name="input" ng-model="example.value" | ||
placeholder="yyyy-MM-dd" min="2013-01-01" max="2013-12-31" required /> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.date"> | ||
Not a valid date!</span> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.date"> | ||
Not a valid date!</span> | ||
</div> | ||
<tt>value = {{example.value | date: "yyyy-MM-dd"}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -246,13 +251,15 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="DateController as dateCtrl"> | ||
Pick a date between in 2013: | ||
<label for="exampleInput">Pick a date between in 2013:</label> | ||
<input type="datetime-local" id="exampleInput" name="input" ng-model="example.value" | ||
placeholder="yyyy-MM-ddTHH:mm:ss" min="2001-01-01T00:00:00" max="2013-12-31T00:00:00" required /> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.datetimelocal"> | ||
Not a valid date!</span> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.datetimelocal"> | ||
Not a valid date!</span> | ||
</div> | ||
<tt>value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -340,13 +347,15 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="DateController as dateCtrl"> | ||
Pick a between 8am and 5pm: | ||
<label for="exampleInput">Pick a between 8am and 5pm:</label> | ||
<input type="time" id="exampleInput" name="input" ng-model="example.value" | ||
placeholder="HH:mm:ss" min="08:00:00" max="17:00:00" required /> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.time"> | ||
Not a valid date!</span> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.time"> | ||
Not a valid date!</span> | ||
</div> | ||
<tt>value = {{example.value | date: "HH:mm:ss"}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -433,13 +442,17 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="DateController as dateCtrl"> | ||
Pick a date between in 2013: | ||
<input id="exampleInput" type="week" name="input" ng-model="example.value" | ||
placeholder="YYYY-W##" min="2012-W32" max="2013-W52" required /> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.week"> | ||
Not a valid date!</span> | ||
<label>Pick a date between in 2013: | ||
<input type="week" name="input" ng-model="example.value" | ||
placeholder="YYYY-W##" min="2012-W32" | ||
max="2013-W52" required /> | ||
</label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.week"> | ||
Not a valid date!</span> | ||
</div> | ||
<tt>value = {{example.value | date: "yyyy-Www"}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -526,13 +539,15 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="DateController as dateCtrl"> | ||
Pick a month in 2013: | ||
<label for="exampleInput">Pick a month in 2013:</label> | ||
<input id="exampleInput" type="month" name="input" ng-model="example.value" | ||
placeholder="yyyy-MM" min="2013-01" max="2013-12" required /> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.month"> | ||
Not a valid month!</span> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.month"> | ||
Not a valid month!</span> | ||
</div> | ||
<tt>value = {{example.value | date: "yyyy-MM"}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -629,12 +644,16 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="ExampleController"> | ||
Number: <input type="number" name="input" ng-model="example.value" | ||
min="0" max="99" required> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.number"> | ||
Not valid number!</span> | ||
<label>Number: | ||
<input type="number" name="input" ng-model="example.value" | ||
min="0" max="99" required> | ||
</label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.number"> | ||
Not valid number!</span> | ||
</div> | ||
<tt>value = {{example.value}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -719,11 +738,15 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="ExampleController"> | ||
URL: <input type="url" name="input" ng-model="url.text" required> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.url"> | ||
Not valid url!</span> | ||
<label>URL: | ||
<input type="url" name="input" ng-model="url.text" required> | ||
<label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.url"> | ||
Not valid url!</span> | ||
</div> | ||
<tt>text = {{url.text}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -810,11 +833,15 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="ExampleController"> | ||
Email: <input type="email" name="input" ng-model="email.text" required> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.email"> | ||
Not valid email!</span> | ||
<label>Email: | ||
<input type="email" name="input" ng-model="email.text" required> | ||
</label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.input.$error.required"> | ||
Required!</span> | ||
<span class="error" ng-show="myForm.input.$error.email"> | ||
Not valid email!</span> | ||
</div> | ||
<tt>text = {{email.text}}</tt><br/> | ||
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/> | ||
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/> | ||
|
@@ -883,9 +910,18 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="ExampleController"> | ||
<input type="radio" ng-model="color.name" value="red"> Red <br/> | ||
<input type="radio" ng-model="color.name" ng-value="specialValue"> Green <br/> | ||
<input type="radio" ng-model="color.name" value="blue"> Blue <br/> | ||
<label> | ||
<input type="radio" ng-model="color.name" value="red"> | ||
Red | ||
</label><br/> | ||
<label> | ||
<input type="radio" ng-model="color.name" ng-value="specialValue"> | ||
Green | ||
</label><br/> | ||
<label> | ||
<input type="radio" ng-model="color.name" value="blue"> | ||
Blue | ||
</label><br/> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why add ids, if are nesting them into labels ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good question, that was leftover from my first pass on the code. They are no longer necessary! |
||
<tt>color = {{color.name | json}}</tt><br/> | ||
</form> | ||
Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. | ||
|
@@ -933,9 +969,13 @@ var inputType = { | |
}]); | ||
</script> | ||
<form name="myForm" ng-controller="ExampleController"> | ||
Value1: <input type="checkbox" ng-model="checkboxModel.value1"> <br/> | ||
Value2: <input type="checkbox" ng-model="checkboxModel.value2" | ||
ng-true-value="'YES'" ng-false-value="'NO'"> <br/> | ||
<label>Value1: | ||
<input type="checkbox" ng-model="checkboxModel.value1"> | ||
</label><br/> | ||
<label>Value2: | ||
<input type="checkbox" ng-model="checkboxModel.value2" | ||
ng-true-value="'YES'" ng-false-value="'NO'"> | ||
</label><br/> | ||
<tt>value1 = {{checkboxModel.value1}}</tt><br/> | ||
<tt>value2 = {{checkboxModel.value2}}</tt><br/> | ||
</form> | ||
|
@@ -1452,26 +1492,36 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt | |
</script> | ||
<div ng-controller="ExampleController"> | ||
<form name="myForm"> | ||
User name: <input type="text" name="userName" ng-model="user.name" required> | ||
<span class="error" ng-show="myForm.userName.$error.required"> | ||
Required!</span><br> | ||
Last name: <input type="text" name="lastName" ng-model="user.last" | ||
ng-minlength="3" ng-maxlength="10"> | ||
<span class="error" ng-show="myForm.lastName.$error.minlength"> | ||
Too short!</span> | ||
<span class="error" ng-show="myForm.lastName.$error.maxlength"> | ||
Too long!</span><br> | ||
<label> | ||
User name: | ||
<input type="text" name="userName" ng-model="user.name" required> | ||
</label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.userName.$error.required"> | ||
Required!</span> | ||
</div> | ||
<label> | ||
Last name: | ||
<input type="text" name="lastName" ng-model="user.last" | ||
ng-minlength="3" ng-maxlength="10"> | ||
</label> | ||
<div role="alert"> | ||
<span class="error" ng-show="myForm.lastName.$error.minlength"> | ||
Too short!</span> | ||
<span class="error" ng-show="myForm.lastName.$error.maxlength"> | ||
Too long!</span> | ||
</div> | ||
</form> | ||
<hr> | ||
<tt>user = {{user}}</tt><br/> | ||
<tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br> | ||
<tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br> | ||
<tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br> | ||
<tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br> | ||
<tt>myForm.$valid = {{myForm.$valid}}</tt><br> | ||
<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br> | ||
<tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br> | ||
<tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br> | ||
<tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br/> | ||
<tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br/> | ||
<tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br/> | ||
<tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br/> | ||
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/> | ||
<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/> | ||
<tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br/> | ||
<tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br/> | ||
</div> | ||
</file> | ||
<file name="protractor.js" type="protractor"> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These should have labels too. Oops! I'll fix them up later.