|
305 | 305 | if (e) { |
306 | 306 | e.stopPropagation(); |
307 | 307 | e.preventDefault(); |
308 | | - } |
| 308 | + } |
309 | 309 | return false; |
310 | 310 | } |
311 | 311 |
|
|
377 | 377 | nuget.addAjaxAntiForgeryToken = function (data) { |
378 | 378 | var $tokenKey = "__RequestVerificationToken"; |
379 | 379 | var $field = $("#AntiForgeryForm input[name=__RequestVerificationToken]"); |
380 | | - if (data instanceof FormData) |
381 | | - { |
| 380 | + if (data instanceof FormData) { |
382 | 381 | data.append($tokenKey, $field.val()); |
383 | 382 | } |
384 | | - else |
385 | | - { |
| 383 | + else { |
386 | 384 | data["__RequestVerificationToken"] = $field.val(); |
387 | 385 | } |
388 | 386 | return data; |
|
464 | 462 |
|
465 | 463 | nuget.setPopovers = function () { |
466 | 464 | var popoverElement = $(this); |
467 | | - popoverElement.popover({ trigger: 'hover focus' }); |
468 | | - popoverElement.click(function () { |
469 | | - popoverElement.popover('show'); |
470 | | - setTimeout(function () { |
471 | | - popoverElement.popover('hide'); |
472 | | - }, |
473 | | - 2000); |
474 | | - }); |
| 465 | + var popoverElementDom = popoverElement.get(0); |
| 466 | + var originalLabel = popoverElementDom.ariaLabel; |
| 467 | + var popoverHideTimeMS = 2000; |
| 468 | + var popoverFadeTimeMS = 200; |
| 469 | + |
| 470 | + popoverElement.popover({ trigger: 'hover' }); |
| 471 | + popoverElement.click(popoverShowAndHide); |
| 472 | + popoverElement.focus(popoverShowAndHide); |
475 | 473 | popoverElement.keyup(function (event) { |
476 | 474 | // normalize keycode for browser compatibility |
477 | 475 | var code = event.which || event.keyCode || event.charCode; |
|
481 | 479 | popoverElement.popover('hide'); |
482 | 480 | } |
483 | 481 | }); |
| 482 | + |
| 483 | + function popoverShowAndHide() { |
| 484 | + popoverElement.popover('show'); |
| 485 | + |
| 486 | + // Windows Narrator does not announce popovers' content. See: https://github.com/twbs/bootstrap/issues/18618 |
| 487 | + // We can force Narrator to announce the popover's content by "flashing" the element's ARIA label. |
| 488 | + popoverElementDom.ariaLabel = ""; |
| 489 | + |
| 490 | + setTimeout(function () { |
| 491 | + popoverElement.popover('hide'); |
| 492 | + |
| 493 | + // We need to restore the element's original ARIA label. |
| 494 | + // Wait 0.15 seconds for the popover to fade away first. |
| 495 | + // Otherwise, the screen reader will re-announce the popover's content. |
| 496 | + setTimeout(function () { |
| 497 | + popoverElementDom.ariaLabel = originalLabel; |
| 498 | + }, popoverFadeTimeMS); |
| 499 | + }, popoverHideTimeMS); |
| 500 | + } |
484 | 501 | }; |
485 | 502 |
|
486 | 503 | window.nuget = nuget; |
|
0 commit comments