首先请原谅我的英语...:)
我将 XMLNS
用于 HTML
标记,并使用 getElementsByTagNameNS
在 JS
中定位它们并使用 CSS
选择器 xmlns\:tagName
用于 CSS
文档,在服务器端我使用 DOM
和 PHP
对象DOMDocument::getElementsByTagNameNS
...
我想知道我做的好不好,或者有没有有效的方法?这种逻辑将来会给我带来麻烦吗?我不知道 ex: DRUPAL
或 JOOMLA
是如何管理的?
或者您认为我应该在 PHP 中使用正则表达式和 preg_match_replace
在任何 HTML 属性中添加前缀,并在 JS 文件和 CSS 文件中执行相同的操作?
结构
actor
|
|
v
+--------------+ +--------------------------------+
| NPresenter | | NNamespace |
+-------+|--------------|+------->|--------------------------------|
| |--------------| |--------------------------------|
| | -display(); | | +full_qualified_js_name(); |
| +--------------+ | +full_qualified_less_name(); |
| | +full_qualified_layout_name(); |
| +--------------------------------+
v
+------------------+ (assets)
| NModel | +------------+
|------------------| | js |
|------------------|------------------------->| less |
| +file_content(); | | layout |
+----------------- + +------------+
fully_qualified_*_name() 返回目标文件的输出,使用正则表达式和 preg_match_all,我在布局文件中添加 XMLNS,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:aa='zz' xmlns:ee='rr'>
<head>
<title></title>
<script src="/assets/js/appended_js.js"></script>
<LINK rel="stylesheet" type="text/css" href="/assets/js/appended_css.css"">
</head>
<body>
<aa:span id="span1">
<aa:p>aaa</aa:p>
</aa:span>
<ee:span id="span1">
<ee:p>aaa</ee:p>
</ee:span>
</body>
</html>
我喜欢下面的 less 文件:
/*less*/
aa\:span{background: #00ff00;}
在 js 文件中,我喜欢下面的内容:
/*js*/
var Namespace = {
methode1: function() {
var target = document.getElementsByTagNameNS("aa","zz");
return target.length;
}
};
最佳答案
在 Javacript 方面,您可以使用 jQuery Xmlns plugin .它允许您使用命名空间感知的 css 选择器。
var feedTitle = $().xmlns(
{
atom : 'http://www.w3.org/2005/Atom'
},
function () {
return this.find("atom|channel > atom|title");
}
).text();
$('#feedTitle').text(feedTitle);
在 PHP 中,您可以使用 Xpath 查询 DOM。
$dom = new DOMDocument();
$dom->loadXml($file);
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
$feedTitle = $xpath->evaluate('string(//atom:channel/atom:title)', NULL, FALSE));
要在命名空间内创建元素,请使用 DOMDocument::createElementNS()。
三个要点:
- 如果您定义自己的 namespace ,结果将不再是 HTML。浏览器将不会识别/呈现这些元素。
- 不要将命名空间前缀与实际命名空间混淆。命名空间是 xmlns:* 属性中的字符串。它应该是一个全局唯一的字符串。 (这就是这里经常使用 url 的原因。) namespace 前缀是 namespace 字符串的短别名,但在重新定义之前仅对当前文档的当前分支有效。
- 您始终为查询(css 选择器或 xpath)定义自己的前缀到 namespace 映射。这样您的查询就会明确无误。
关于php - 管理多个 HTML 片段的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17245733/