【发布时间】:2016-02-16 20:26:47
【问题描述】:
假设您有一个 HTML 页面,其中包含不同语言的部分,如下所示:
<html lang=en>
<div lang="th">
<p id="test1">ไทย</p>
</div>
<p id="test2">Implicitly English</p>
<div lang="en-CA">
<p id="test3">As Canadian as possible under the circumstances</p>
</div>
<p lang="en-AU"id="test4">Explictly Aussie</p>
</html>
是否有直接的方法来发现特定的语言代码适用于给定的 HTML 元素?比如:
// pseudo-code
var lang = myElement.getLang()
这似乎是一个非常迂回的解决方案:
function getLang(element) {
var lang = element.getAttribute("lang")
if (!lang) {
var elements
, languages
, language
, ii
, selector
// Find all elements with an explicit lang attribute
elements = [].slice.call(document.querySelectorAll("*[lang]"))
// Determine which languages are present
languages = []
for (ii in elements) {
lang = elements[ii].getAttribute("lang")
if (languages.indexOf(lang) < 0) {
languages.push(lang)
}
}
lang = "" // reset
for (ii in languages) {
language = languages[ii]
selector = ":lang(" + language + ")"
elements = [].slice.call(document.querySelectorAll(selector))
if (elements.indexOf(element) > -1) {
if (lang.length < language.length) {
lang = language
}
}
}
}
return lang
}
还有更明显的方法吗? jsFiddle
【问题讨论】:
-
element.lang会给你lang属性值,看起来很直接。或者如果子元素没有,你的意思是得到一个父母语言? -
您可以使用选择器(如您所用)来获取具有 lang 属性的元素。对于任何特定节点,您可以使用contains 方法来查看它是否是任何特定节点的后代。您的代码看起来很复杂,可以大大简化。请注意,
[].slice.call(hostObject)在 IE 8 中将失败。 -
在最新的 Chrome 和 Firefox 中,整个功能将只是
element.closest('[lang]').lang
标签: javascript iso lang