开发者问题收集

localStorage 为空,但仅来自一个函数,而不是另一个函数

2020-03-31
231

我有一个 PHP 页面,它在末尾加载两个 JS 文件。在第一个文件中,我有这个...

// global variables
var refineSearchStorage = {};

// function calls
window.addEventListener("load", function() {
  refineSearchStorage.get();
});

refineSearchStorage = {
  data : null, // empty storage
  get : function() {
    refineSearchStorage.data = localStorage.getItem("refineSearchStorage");
    if(refineSearchStorage.data === null) { 
      refineSearchStorage.data = { refineKeywords: '' };
      refineSearchStorage.save();
    }
    else { 
      refineSearchStorage.data = JSON.parse(refineSearchStorage.data); 
    }
  },
  add : function(x) {
    refineSearchStorage.data.refineKeywords = x;
    refineSearchStorage.save();
  },
  save : function() {
    localStorage.setItem("refineSearchStorage", JSON.stringify(refineSearchStorage.data));
  }
};

内联 javascript 从页面中间调用函数 1。它由 PHP 在搜索结果后创建...

<script>
  window.addEventListener('load', function () {
    searchActions('{$keywords_human}');
  });
</script>

函数 1 出现在第二个 JS 页面中,结果是 Uncaught TypeError: Cannot set property 'refineKeywords' of null ... 而不是添加到 localStorage。

function searchActions(x) {
  refineSearchStorage.add(x);
}

单击按钮即可调用下面的函数 2,并将其添加到 localStorage 变量中,不会出现问题。它也位于第二个 JS 页面上...

function keywordAdd(y) {
  var existingParams = refineSearchStorage.data.refineKeywords;
  var param = y.toLowerCase();
  var newParams;
  newParams = (existingParams + ' ' + param).trim();
  refineSearchStorage.add(newParams);
}

函数 1 以前可以工作,但是当我将函数拆分到不同的页面上时,我做了一些事情来破坏它。我做了什么?

2个回答

这是因为

window.addEventListener('load', function () {
    searchActions('{$keywords_human}');
  });

window.addEventListener("load", function() {
  refineSearchStorage.get();
});
之前被调用
Alex Gholamian
2020-03-31

该错误意味着您的 data 属性为 null

(屏幕截图) 看看我的意思

转换添加到

add : function(x) {
    refineSearchStorage.data = refineSearchStorage.data || {};  // this might help
    refineSearchStorage.data.refineKeywords = x;
    refineSearchStorage.save();
},
Tonoslav
2020-03-31