分类 默认分类 下的文章

遇到的问题,作个笔记!

bootstrap model 关闭的时候控制台提示报错信息:

 Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. Avoid using aria-hidden on a focused element or its ancestor. Consider using the inert attribute instead, which will also prevent focus.

是 aria-hidden 的属性产生的:

查看页面代码 model 模态框 把 aria-hidden=true 加到了 .modal 这个节点上了,将这个属性去掉就解决了

关于 aria-hidden 属性的详解:
aria-hidden 是一个与可访问性(accessibility)相关的 HTML 属性,它用于告知屏幕阅读器和其他辅助技术是否应该忽略某个元素,从而不将该元素呈现给使用这些技术的用户。

ARIA(Accessible Rich Internet Applications)

ARIA 是一组专门用于提高 Web 内容可访问性的属性,尤其针对使用屏幕阅读器等辅助工具的用户。aria-hidden 是其中一个属性,它与语义 HTML 标签的作用不同,而是帮助向辅助技术表明某些元素是否对残障人士可见或可访问。

aria-hidden 的作用

  • aria-hidden="true":该属性的值为 true 时,表示该元素和它的所有子元素会被屏幕阅读器忽略。这样,这些元素将不被读取或呈现给使用屏幕阅读器的用户。即使元素的样式使其可见,屏幕阅读器也不会将其读取。
  • aria-hidden="false":这个值表示该元素对屏幕阅读器是可见的,允许它作为正常内容被屏幕阅读器读取。如果没有显式设置 aria-hidden,默认情况下元素对屏幕阅读器是可访问的。

应用场景

  1. 隐藏装饰性元素

    • 你可能希望屏幕阅读器忽略一些纯粹用于装饰或视觉效果的元素(例如图标、背景图片等),因为这些元素并不为内容提供有意义的信息。
    • 例如,假设你有一个图标元素,它只用于视觉展示,而不包含任何有用信息,可以设置 aria-hidden="true" 来让屏幕阅读器忽略它。
    <div aria-hidden="true">
      <i class="icon">xxxxxx</i>  <!-- 这是装饰性图标,屏幕阅读器会忽略它 -->
    </div>
  2. 隐藏不必要的内容

    • 有时你可能希望动态地隐藏一些内容,这些内容可能不适合当前的用户(例如,某些信息只适用于特定条件下的用户)。可以使用 aria-hidden 来隐藏这些内容。
    <div aria-hidden="true">
      <p>这个内容在当前情况下对屏幕阅读器用户不可见。</p>
    </div>
  3. 动态控制可见性

    • aria-hidden 还可以用于动态控制元素的可访问性。例如,当某个弹出窗口(如模态框)被打开时,可以使用 aria-hidden="true" 来隐藏背景内容,从而让用户集中注意力在弹出窗口上。
    <div aria-hidden="true">这是被隐藏的背景内容,屏幕阅读器不会读取它。</div>
    <div>这是可见的前景内容,屏幕阅读器将读取它。</div>
  4. 改善用户体验

    • aria-hidden 可以帮助优化用户体验,尤其是在设计复杂的用户界面时。通过正确使用它,可以减少不必要的干扰,使用户能够专注于他们需要关注的内容。

注意事项

  • 影响范围aria-hidden="true" 不仅会影响当前元素,还会递归地影响该元素的所有子元素。如果父元素被设置为 aria-hidden="true",它的所有子元素都会被屏幕阅读器忽略。

    <div aria-hidden="true">
      <p>这个段落和其内部的所有内容都会被屏幕阅读器忽略。</p>
    </div>
  • 使用时机aria-hidden 应该小心使用。误用可能导致有意义的内容被错误地隐藏,影响用户的访问体验。最好只在元素确实是纯粹装饰性,或在某些条件下不需要被读取时使用。
  • 对可视化的影响aria-hidden 仅影响屏幕阅读器和其他辅助技术的行为,它不会改变元素的可视化显示。即使一个元素被设置为 aria-hidden="true",它仍然会在屏幕上显示。要完全隐藏该元素,可以使用 CSS 设置 display: nonevisibility: hidden

总结

  • aria-hidden="true":使元素和其子元素对屏幕阅读器隐藏,忽略该元素。
  • aria-hidden="false":明确表示该元素对屏幕阅读器可见(如果没有显式设置,则默认为 false)。
  • aria-hidden 是帮助提高网页可访问性的重要工具,特别是在有复杂界面时。
  • 使用时要小心,确保不会误隐藏那些有意义的内容,从而影响用户体验。

示例:
# 如果 url 含有 . , 并且 不以 do 或 action 结尾,则匹配成功。

location ~ .*\.(?!(do|action)$) {
        root /demo/code/webroot;
    }
^~    标识符匹配后面跟-一个字符串。匹配字符串后将停止对后续的正则表达式进行匹配,如location ^~ /images/ , 在匹配了/images/这个字符串后就停止对后续的正则匹配
=   精准匹配,如location=/,只会匹配url为/的请求。
~   区分大小写的匹配。
~*    不区分大小写的匹配。
!~     对区分大小写的匹配取非。
!~*    对不区分大小写的匹配取非。
/     通用匹配,如果没有其它匹配,任何请求都会被匹配到

匹配顺序优先级:

(location =)> (location 完整路径)> (location ^~ 路径) > (location ~,~*正则顺序) >(location 部分起始位置) > (/)

2、正则表达式

*:重复前面的字符0次或多次
?:重复前面的字符0次或1次
+:重复前面的字符1次或多次
.:匹配除换行符以外的任意一个字符
(a|b):匹配a或b
^:以...开头
$:以...结尾
{n}:重复前面的字符n次
{n,}:重复前面的字符n次或更多次
{n,m}:重复前面的字符n-m次
*?:重复前面的字符0次或多次,但尽可能少重复
+?:重复前面的字符1次或多次,但尽可能少重复
??:重复前面的字符0次或1次,但尽可能少重复
{n,m}?:重复前面的字符n-m次,但尽可能少重复
{n}?:重复前面的字符n次以上,但尽可能少重复

3、正则表达式补充

\W:匹配任意不是字母,数字,下划线,汉字的字符(特殊符号)
\S:匹配任意不是空白符的字符
\D:匹配任意非数字的字符
\B:匹配任意不是单词开头或结尾的位置
[a]:匹配单个字符a
[a-z]:匹配a-z小写字符的任意一个
[^a]:匹配除了a以外的任意字符
[^abc]:匹配除了abc这几个字母以外的任意字符

要在一串数字中使用正则匹配一个11位的电话号码?要求数字是11位,且后面不能再有继续的数字,这个正则应该怎么写?

如果你希望 11位的电话号码 后面紧跟着可以跟其他字符(但不能是数字),可以调整正则表达式,确保电话号码后面没有数字。可以使用类似下面的正则:

/^\d{11}(?!\d).*$/

解释:

  • ^:表示字符串的开始。
  • \d{11}:表示精确匹配 11 位数字。
  • (?!\d):这是一个 负向前瞻(negative lookahead)。它的意思是:如果后面跟着数字,匹配会失败。确保在 11 位数字之后不会有数字。
  • .*:表示后面可以跟任意字符(除了换行符),但不会包括数字。
  • $:表示字符串的结束。

使用示例:

$pattern = '/^\d{11}(?!\d).*$/';
$phone_number = '13812345678abc';  // 示例电话

if (preg_match($pattern, $phone_number)) {
    echo "电话号码匹配成功!";
} else {
    echo "电话号码无效!";
}

说明:

  • 这个正则表达式会匹配 恰好 11 位数字,并且在 11 位数字之后,可以跟任意字符,但不能跟数字
  • 如果后面是数字,它就不会匹配。

举例:

  • 有效: 13812345678abc13812345678xyz12313812345678#@!
  • 无效: 13812345678123abc123(后面跟着数字),1381234567(不足 11 位)

在 JavaScript 中,?. 是一种可选链操作符(Optional chaining operator),它可以简化访问可能为null或undefined的属性或方法的代码书写,避免因为对象链中某个属性或方法不存在而导致的错误。?. 的使用方式如下:

1. 访问属性

// 普通访问方式
const name = user.profile.name; // 如果 user 或 profile 为 null 或 undefined,将会导致错误

// 使用可选链操作符
const name = user?.profile?.name; // 如果 user 或 profile 为 null 或 undefined,name 将会取到 undefined

2. 调用方法

// 普通调用方法方式
const result = app.getData(); // 如果 app 为 null 或 undefined,将会导致错误

// 使用可选链操作符
const result = app?.getData(); // 如果 app 为 null 或 undefined,result 将会取到 undefined

3. 数组访问

const arr = [1, 2, 3];
const value = arr?.[0]; // 如果 arr 为 null 或 undefined,value 将会取到 undefined

4. 函数调用

function sayHello() {
  console.log('Hello, world!')
}

const func = sayHello?.(); // 如果 sayHello 为 null 或 undefined,调用将会被忽略

可选链操作符 ?. 使得我们可以更加安全和简洁地访问对象的属性和方法,避免代码中大量的空值检查,提高代码的可读性和健壮性。需要注意的是,?. 操作符在一些较老版本的 JavaScript 环境可能不被支持,因此在使用时需要注意环境的兼容性。

兼容性情况

可选链操作符 ?. 在 JavaScript 中的兼容性随着不同 JavaScript 引擎和浏览器的更新而有所变化。以下是可选链操作符的兼容性情况:

1. Node.js

  • 可选链操作符从 Node.js 14 版本开始得到支持,但需要在 JavaScript 文件中指定 ECMASCript版本 支持。
  • 可以通过在项目中的 .eslintrc 文件中设置 ecmaVersion: 2020 来指定支持 ECMAScript 2020。

2. 现代浏览器

  • Chrome、Firefox、Edge 等现代浏览器在较新的版本中已经支持可选链操作符。
  • 可以在 Can I Use 网站上查看各个浏览器对可选链操作符的支持情况。

3. Babel 转译

  • 如果项目需要兼容性,可以使用 Babel 将项目中的可选链操作符转译为普通的 JavaScript 代码,以确保在旧版 JavaScript 引擎中的兼容性。
  • 可以在 Babel 的官方文档中找到相关的插件和配置信息。

4. Polyfill

  • 也可以使用相应的 Polyfill 库来实现可选链操作符在旧版 JavaScript 环境下的同等效果。
  • 一些流行的 JavaScript Polyfill 库(如 core-js)提供了可选链操作符的支持。

总的来说,随着 JavaScript 标准的不断发展和现代浏览器的更新,可选链操作符在很多环境中都得到了良好的支持。但在项目中应根据实际情况考虑目标用户群体的环境兼容性,选择合适的方案来处理可选链操作符的兼容性问题。

在 MySQL 中,DATETIME 类型用于存储日期和时间的组合值。DATETIME 类型支持各种日期和时间计算,可以进行日期加减、时间比较、格式转换等操作。以下是 DATETIME 类型支持的一些常见计算:

1. 日期加减

  • 加法操作:可以通过 DATE_ADD() 函数将指定的天数、月数、年数等加到 DATETIME 值上。

    SELECT DATE_ADD('2022-12-31 12:00:00', INTERVAL 1 DAY); -- 加一天
  • 减法操作:可以通过 DATE_SUB() 函数将指定的天数、月数、年数等从 DATETIME 值中减去。

    SELECT DATE_SUB('2022-12-31 12:00:00', INTERVAL 1 MONTH); -- 减一个月

2. 日期比较

  • 可以使用比较操作符(如 <, >, =)对 DATETIME 值进行比较,以判断它们之间的顺序关系。

    SELECT * FROM table WHERE date_column > '2022-01-01 00:00:00';

3. 日期格式转换

  • 可以使用 DATE_FORMAT() 函数将 DATETIME 值转换为指定格式的字符串,便于显示或比较。

    SELECT DATE_FORMAT('2022-12-31 12:00:00', '%Y-%m-%d'); -- 格式化日期

4. 日期函数

  • 可以使用各种日期函数(如 YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() 等)提取 DATETIME 值的部分内容。

    SELECT YEAR('2022-12-31 12:00:00'); -- 提取年份

5. 日期范围查询

  • 可以使用 BETWEEN 操作符来查询某个日期范围内的数据。

    SELECT * FROM table WHERE date_column BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59';

6. 日期加减操作

  • 可以通过将日期字段加减相应的天数、月数、年数,来实现日期的调整。

    UPDATE table SET date_column = date_column + INTERVAL 1 HOUR;

总结:

DATETIME 类型支持丰富的日期和时间计算操作,包括日期加减、日期比较、日期格式转换、日期函数、日期范围查询等,为处理日期和时间数据提供了便利和灵活性。通过合理运用这些计算能力,可以满足各种对日期和时间数据的需求。