当前位置: 首页 > 面试题库 >

默认情况下,JSF生成不可用的ID,这些ID与Web标准的CSS部分不兼容

厍和颂
2023-03-14
问题内容

活跃的JSF(或Primefaces)用户是否可以解释为什么默认情况下会发生这种情况,为什么没人对此做任何事情:

<p:commandLink id="baz" update=":foo:boop" value="Example" />

会产生标记,如果没有黑客攻击,这些标记就无法在JavaScript或CSS中使用,通常应视为无效:

<a href="javascript:void(0);" id=":foo:bar:baz">Example</a>

id=":bar:baz:foo"此处的属性包含冒号,至少从CSS角度来看,冒号不是此属性的有效字符。

尽管该属性根据规范可能是有效的,但它无法与实际的JavaScript和CSS实现一起使用。

简而言之,idJSF中的默认属性生成不可用于前端开发。


问题答案:

:是被选择,因为这是对于可以被保证的是,终端用户将不会意外地在JSF组件ID使用它(这是被唯一明智的分隔符[验证 ,它可能通过用逸出它使用它在CSS选择\

需要注意的是,HTML4规范说,结肠是一个 有效的价值idname属性。因此,您对它与“ Web标准”不兼容的抱怨无济于事。

IDNAME 令牌必须以字母([A-Za-z])开头,然后可以跟任意数量的字母,数字([0-9]),连字符(“-”),下划线(“
_”) ,冒号(“:”)和句点(“。”)。

因此,唯一的问题是:CSS是CSS选择器中的特殊字符,需要转义。JS本身对冒号没有任何问题。该document.getElementById("foo:bar")工作完全正常。唯一可能的问题是在jQuery中,因为它使用CSS选择器语法。

如果确实需要,则始终可以:通过将javax.faces.SEPARATOR_CHAR上下文参数设置为eg
-_如下来更改默认的分隔符。你只需要保证你不使用JSF组件ID的角色的任何地方 你自己 (它没有得到验证!)。

<context-param>
    <param-name>javax.faces.SEPARATOR_CHAR</param-name>
    <param-value>-</param-value>
</context-param>

_由另外的缺点,它在JSF出现自动生成的ID喜欢的方式有j_id1,因此你也应该确保 所有
NamingContainer在整个JSF页面组件都有一个固定的ID而不是自动生成一个。否则,JSF将很难找到命名容器子代的名称。

我只会不推荐它。从长远来看,这令人困惑和脆弱。再想一想,普通JSF
Web应用程序中的独特元素本身通常已经不在表格或表中。它们通常仅代表主要布局方面。我要说,否则从一般的HTML /
CSS角度来看这是一个糟糕的设计。只需通过可重复使用的CSS类名而不是ID来选择它们。如果确实需要,可以始终将其包装为纯HTML格式,<div>否则<span>JSF不会在其ID之前添加ID。



 类似资料:
  • 问题内容: 我正在制作一个嵌套菜单和子菜单,到目前为止,所有操作都已完成。.现在,我需要使此可折叠菜单默认根据给定的ID打开。 您还可以查看下面的完整工作代码段, 需求: 我有一个ID值存储在父组件中(您可以在数组变量下面查看此变量)。 即使有多个子菜单,此ID也将仅属于上一级子ID,因此肯定会有一个复选框,以便需要选中此复选框,并且需要打开父级菜单。 例如.., 正如openMenuId一样,因

  • 问题内容: 我知道有时将标签与复选框相关联是一件好事: ..但是我 必须 使用一个ID来关联它吗? 我什至关心的主要原因是因为我喜欢能够单击标签来切换复选框的值,但不喜欢将id用作如此简单的东西的想法。 我想我可以使用jQuery切换单击标签的前一个元素(复选框),但是也许我缺少一些更简单的东西。看起来像一个解决方案,但用户说它在IE中不起作用。 问题答案: 是的,将输入内容放置在标签内。

  • 问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用

  • 问题内容: 在SQL(SQL Server)中,是否可以从表的标识列中检索下一个ID(整数),而实际上无需插入行?如果删除了最近的行,则不一定是最高ID加1。 我之所以这样问,是因为我们有时不得不用新行更新活动数据库。该行的ID在我们的代码中使用(例如,Switch(ID){Case ID:},并且必须相同。如果我们的开发数据库和实时数据库不同步,最好预先预测一个行ID部署之前。 我当然可以 SE

  • 在MySQL Ver 14.14 Distrib 5.7.25上,对于Linux(x86_64),默认设置似乎不起作用,因为我试图一行,其中包含父表键中不存在的值,而成功了。 为什么我必须,即使在默认情况下设置了? ...我将中,得到了这个... 因此,为了弄清楚为什么不应该成功,但却成功了,我阅读了以下网页... null 外键必须为。是。 默认存储引擎必须为。是的。 对每个外键声明使用。是。

  • 问题内容: 我正在评估JOOQ是否可在仍在开发中的新系统中使用。我想避免在与应用程序一起开发数据库时生成代码,而只是为该应用程序起持久存储的作用。因此,预计数据库模式定义将由Java代码(java中的表定义)驱动。 JOOQ是否适合上述用例?是否有用于模式定义的Java DSL? 问题答案: JOOQ是否适合上述用例? 是的,许多jOOQ用户仅使用运行时库,而没有代码生成器。入门指南中提供了示例。