我正在使用最新版本的 Opera。它支持 Microdata API,但是当我键入以下代码时,它不起作用。
<head>
<script type="text/javascript">
var user = document.getItems('http://schema.org/Person')[0];
alert('Hi there ' + user.properties['name'][0].textContent + '!');
function supports_microdata_api() {
return !!document.getItems;
}
alert(supports_microdata_api());
</script>
</head>
<body>
<div itemscope itemtype="http://schema.org/Person">
<span itemprop="name">Fatima Zohra</span>
<img src="" itemprop="image" />
</div>
谁能告诉我我做错了什么?
最佳答案
您需要等待页面加载;你在呼唤一些东西:
document.getItems('http://schema.org/Person')[0]
那还不是 DOM 的一部分;您的代码在 DOM 意识到“尚未见过”的元素之前运行。
使用window.onload
等待页面onload
事件触发,该事件发生在元素被解析之后。
window.onload = function(){
var user = document.getItems('http://schema.org/Person')[0];
console.log(user);
console.log('user.properties Name: ' + user.properties['name'][0].textContent);
function supports_microdata_api() {
return !!document.getItems;
}
console.log(supports_microdata_api());
};
或者,也可以将代码按页面顺序放在 DOM 元素之后。
一种更现代的方法是使用事件委托(delegate):
window.addEventListener('load', function(){
var user = document.getItems('http://schema.org/Person')[0];
console.log(user);
console.log('user.properties Name: ' + user.properties['name'][0].textContent);
function supports_microdata_api() {
return !!document.getItems;
}
console.log(supports_microdata_api());
});
尽管至少早期版本的 IE 支持 element.attachEvent
,IE9 or later浏览器支持/将支持 element.addEventListener
。
这是一种更安全的检查和调用方法的方法:
window.addEventListener('load', function(){
var user;
function supports_microdata_api() {
return !!document.getItems;
}
console.log('Microdata support: ' + supports_microdata_api());
if (supports_microdata_api()) {
user = document.getItems('http://schema.org/Person')[0];
console.log(user);
console.log('user.properties Name: ' + user.properties['name'][0].textContent);
}
});
注意在匿名函数中使用 var user
,它创建一个闭包并防止 user
转义到全局范围。这是一种“更好”的变量处理方式,有助于防止它们因全局共享而被意外覆盖。另一方面,您将无法从该范围之外调用 user
。抵制将其推向全局范围的冲动,虽然这可能更容易,但却是一个坏习惯,有时容易发现错误。
关于javascript - 为什么这个 Javascript 会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816652/