无法读取未定义的属性“值”?

时间:2011-05-14 00:28:58

标签: javascript

要学习JavaScript我正在编写一个小型文本编辑器Google Chrome扩展程序。但我一直收到这个错误:Cannot read property 'value' of undefined。每当调用tranquility.save();时就会发生这种情况,但是当tranquility.open();奇怪时会发生这种情况,因为它们基本相同,只是切换了两侧。 paper只是<textarea>

var tranquility = {
 paper: document.getElementById("paper"),
 lastOpenedPaper: localStorage.getItem("lastOpenedPaper"),

 listen: function() {
    this.paper.addEventListener("keyup", this.save, false);
 },

 save: function() {
    localStorage.setItem(this.lastOpenedPaper, this.paper.value);
 },

 open: function() {
    this.paper.value = localStorage.getItem(this.lastOpenedPaper);
 }
}

修改

在创建<textarea>之后调用它(除非它必须是整个DOM)

<body>
    <textarea id="paper"></textarea>
    <script src="../js/application.js"></script>
    <script>
        tranquility.listen();
    </script>
</body>

2 个答案:

答案 0 :(得分:3)

我使用了两个修复程序

1。)在加载纸张textarea后写入脚本。这是通过将脚本放在正文的末尾来完成的。

2.)我发现localStorage.setItemlocalStorage.getItem应该像http://hacks.mozilla.org/2009/06/localstorage/一样引用变量名称。在你的代码中,lastOpenedPaper将在开始时引用null值,因此它不会在该名称中存储值,所以我尝试用just替换它。您也可以使用其他var名称或直接使用varname作为localStorage.setItem('anyvarname', this.paper.value);

代码:

<script>
    var tranquility = {
     paper: document.getElementById("paper"),
     lastOpenedPaper: 'just',

     listen: function() {
        this.paper.addEventListener("keyup", this.save, false);
     },

     save: function() {
        localStorage.setItem(this.lastOpenedPaper, this.value);
     },

     open: function() {
        this.paper.value = localStorage.getItem(this.lastOpenedPaper);
     }
    }
</script>

答案 1 :(得分:1)

  

随时都会发生   tranquility.save();被称为,但不是   当tranquility.open();是的   奇怪,因为他们基本上是   同样,只是换了两边。

但是他们不一样,因为:

save: function() {
    localStorage.setItem(this.lastOpenedPaper, this.paper.value);
},

这可能不合适,因为无法定义this.paper.value

open: function() {
    this.paper.value = localStorage.getItem(this.lastOpenedPaper);
}

这是将值设置为this.paper.value,因此定义与否无关紧要。

此外:

document.getElementById("paper")

如果此代码未声明onload或创建<textarea>之后,这将无效。因为DOM树尚未构建。