javascript - 为什么这个 Javascript 会抛出错误?

标签 javascript html microdata

我正在使用最新版本的 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());
};

http://jsfiddle.net/eY63s/2/

或者,也可以将代码按页面顺序放在 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());
});

http://jsfiddle.net/eY63s/3/

尽管至少早期版本的 IE 支持 element.attachEventIE9 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);
    }
});

http://jsfiddle.net/eY63s/4/

注意在匿名函数中使用 var user,它创建一个闭包并防止 user 转义到全局范围。这是一种“更好”的变量处理方式,有助于防止它们因全局共享而被意外覆盖。另一方面,您将无法从该范围之外调用 user。抵制将其推向全局范围的冲动,虽然这可能更容易,但却是一个坏习惯,有时容易发现错误。

关于javascript - 为什么这个 Javascript 会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816652/

相关文章:

jquery 工具提示代码每次都必须这样做

html - 扩展架构微数据属性

javascript - Backbone.js 的 Python 后端

javascript - 调用焦点时按钮和跨度有什么区别?

python - 使用 Tkinter 文本编辑器突出显示错误

html - 第一个 child 在我的代码中不起作用

html - 我如何将嵌套在一个项目范围中的项目 Prop 实际应用于不同的项目范围?

microdata - 当页面上有多个产品时,使用微数据标记 HTML 代码

JavaScript 事件 window.onload 未触发

javascript - 自动完成显示所有值