asp.net - 有没有办法绕过 ASP 的控制 ID(ctl00、ctl01 等)破坏 NVDA?
问题描述
作为序言,我是 ASP 的新手。
我正在研究我们网站的可访问性,我们有一个控件,其中包含中继器内的单选按钮列表。使用屏幕阅读器 NVDA 时,它将每个单选按钮读取为“1 of 1”而不是“1 of 3”、“2 of 3”和“3 of 3”。
我已经诊断出问题似乎来自 ASP 自动将“ctl00”、“ctl01”和“ctl02”附加到每个单选按钮的事实。我知道如果我要删除这些和/或将它们全部更改为“ctl00”,NVDA 会按预期正确读取它们。
我无法完全解释的另一个怪癖是,将 Windows 和 Chrome 与 NVDA 一起使用会导致它被正确读取,但是我在 Windows 上尝试过的任何其他浏览器和 Mac 上的所有浏览器(使用 VoiceOver,而不是 NVDA)都无法读取如预期。
有没有办法从 HTML 中的 name 属性中删除“ctl00”?
示例代码(.ascx):
<div class="css-radio-buttons">
<ul class="css-radio-buttons__ul">
<asp:Repeater
ID="shippingOptionsRepeater"
runat="server"
OnItemDataBound="OnOptionBound">
<ItemTemplate>
<li class="css-radio-buttons__radio-item">
<asp:RadioButton
ID="shippingOptionRadioButton"
runat="server"
OnCheckedChanged="OnOptionChoice"
CssClass="css-radio-buttons__input"
/>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</div>
后面的代码:
protected void OnOptionBound(object sender, RepeaterItemEventArgs eventArgs)
{
ShippingOption option = (ShippingOption)eventArgs.Item.DataItem;
RadioButton radioButton = (RadioButton)eventArgs.Item.FindControl("shippingOptionRadioButton");
// omitted
radioButton.AutoPostBack = true;
radioButton.GroupName = GROUP_NAME_PREFIX + option.FulfillerId.ToString();
//omitted
}
样本输出:
<div class="css-radio-buttons">
<ul class="css-radio-buttons__ul">
<li class="css-radio-buttons__radio-item">
<span class="css-radio-buttons__input" data-fulfiller-id="1" data-option-id="3"><input id="ctlOrderReview_shipments_ctl00_shippingOptions_shippingOptionsRepeater_ctl00_shippingOptionRadioButton" type="radio" name="ctlOrderReview$shipments$ctl00$shippingOptions$shippingOptionsRepeater$ctl00$ShippingOptions1" value="shippingOptionRadioButton" checked="checked" onclick="setUniqueRadioButton('input[name$="ShippingOptions1"]', this);"><label for="ctlOrderReview_shipments_ctl00_shippingOptions_shippingOptionsRepeater_ctl00_shippingOptionRadioButton">FREE Delivery Between Dec 25-29</label></span>
</li>
<li class="css-radio-buttons__radio-item">
<span class="css-radio-buttons__input" data-fulfiller-id="1" data-option-id="2"><input id="ctlOrderReview_shipments_ctl00_shippingOptions_shippingOptionsRepeater_ctl01_shippingOptionRadioButton" type="radio" name="ctlOrderReview$shipments$ctl00$shippingOptions$shippingOptionsRepeater$ctl01$ShippingOptions1" value="shippingOptionRadioButton" onclick="setUniqueRadioButton('input[name$="ShippingOptions1"]', this);setTimeout('__doPostBack(\'ctlOrderReview$shipments$ctl00$shippingOptions$shippingOptionsRepeater$ctl01$shippingOptionRadioButton\',\'\')', 0)"><label for="ctlOrderReview_shipments_ctl00_shippingOptions_shippingOptionsRepeater_ctl01_shippingOptionRadioButton">$29.99 Delivery by Dec 24</label></span>
</li>
<li class="css-radio-buttons__radio-item">
<span class="css-radio-buttons__input" data-fulfiller-id="1" data-option-id="1">
<input id="ctlOrderReview_shipments_ctl00_shippingOptions_shippingOptionsRepeater_ctl02_shippingOptionRadioButton" type="radio" name="ctlOrderReview$shipments$ctl00$shippingOptions$shippingOptionsRepeater$ctl02$ShippingOptions1" value="shippingOptionRadioButton" onclick="setUniqueRadioButton('input[name$="ShippingOptions1"]', this);setTimeout('__doPostBack(\'ctlOrderReview$shipments$ctl00$shippingOptions$shippingOptionsRepeater$ctl02$shippingOptionRadioButton\',\'\')', 0)"><label for="ctlOrderReview_shipments_ctl00_shippingOptions_shippingOptionsRepeater_ctl02_shippingOptionRadioButton">$39.99 Delivery by Dec 23</label></span>
</li>
</ul>
</div>
解决方案
自从我接触 ASP 以来已经很长时间了,所以如果这只是 80% 正确,那么我很抱歉。
话虽如此,您可以使用GroupName
.
因此,在我简单添加的以下调整中GroupName="shipping"
,这应该会生成所有带有 的单选按钮,name="shipping"
然后它将按预期工作(我相信,再次道歉,这是一个很长的时间!)。
<ItemTemplate>
<li class="css-radio-buttons__radio-item">
<asp:RadioButton
ID="shippingOptionRadioButton"
runat="server"
OnCheckedChanged="OnOptionChoice"
CssClass="css-radio-buttons__input"
GroupName="shipping"
/>
</li>
</ItemTemplate>
推荐阅读
- botframework - 如何从知识库中获取所有元数据过滤器
- mysql - 如何在 MySQL Workbench 8.0 中使用 LOAD DATA LOCAL INFILE 加载 AWS RDS MySQL 和 Aurora MySQL 数据库中的表,而不会出现错误代码 1148?
- css - 在 Safari 中创建更改样式表的快捷方式
- android - 我一直在尝试在 android studio 上制作钢琴应用程序,但是当我运行应用程序时它显示错误并且应用程序甚至没有打开?
- git - sh.exe is preventing windows cmd move command from working
- android - 使用 WIFI 将 android 设备屏幕截图传输到远程 PC
- c# - 将泛型与可扩展工厂一起使用?
- python-3.x - tensorflow/keras LSTM 模型抛出值错误
- angular - 如何使用 Rxjs 在 Angular 中调用多个异步方法的数组?
- vb.net - Visual Basic:带有随机数生成器的复选框