正则表达式匹配 JQM 路由器插件中的“项目”但不匹配“项目”

Regex to match "Item" but not "Items" in JQM Router Plugin

本文关键字:项目 不匹配 JQM 路由器 插件 正则表达式      更新时间:2023-09-26

我很确定这个问题都是关于正则表达式的。

我正在使用此处找到的 JQM 路由器插件。 它使用正则表达式来匹配页面并绑定事件处理程序。在文档中,它指出:

一个典型的错误是忘记了 $ 运算符。如果你有两个页面, 如 #product 和 #productList,假设的路线"#product" 将匹配两个页面,从而导致意外行为

还行。 所以我有一个 #item 页面和一个 #items 页面,所以我在 #item 前面加上了一个$。 但现在它根本不绑定事件处理程序。 如果我不使用美元,则项目的绑定将应用于两个页面。 这是实际的实现:

var router = new $.mobile.Router([
    {"#items": {events:"i", handler: items.controller.init}},
    {"#items(?:[?/](.*))?": {events:"bs", handler: items.controller.onPageBeforeShow}},
    {"#item": {events:"i", handler: item.controller.init}},
    {"#item(?:[?/](.*))?": {events:"bs", handler: item.controller.onPageBeforeShow}},
]);

$匹配正则表达式中字符串的末尾。你不想把它放在开头,你想把它放在最后。

例如:

#product
  matches
#product
#productList
#product$
  matches
#product

试试这个代码:

var router = new $.mobile.Router([
    {"#items$": {events:"i", handler: items.controller.init}},
    {"#items(?:[?/](.*))?$": {events:"bs", handler: items.controller.onPageBeforeShow}},
    {"#item$": {events:"i", handler: item.controller.init}},
    {"#item(?:[?/](.*))?$": {events:"bs", handler: item.controller.onPageBeforeShow}},
]);

你必须后缀,而不是前缀,

#items$
#items(?:[?/](.*))?$
#item$
#item(?:[?/](.*))?$