localStorage.setItem无法存储html字符串

时间:2013-10-08 14:04:59

标签: javascript jquery string html5 local-storage

我曾经有一个脚本使用GM_setValue()来存储页面中的一大块html,并将其加载到另一个页面上。 所以:

var data = '<div id="test">testing</div>';
GM_setValue("test", data);
alert(GM_getValue("test", "failed"));

会提醒<div id="test">testing</div>

最近,我们转而使用GM API,转而使用jQuery和HTML5,并将GM_setValue GM_getValue替换为以下函数:

function $setVal(name, value){
 localStorage.setItem(name, value);
 return false;
}
function $getVal(name, notset){
 return localStorage.getItem(name) || notset;
}

现在的问题是,它不再能像GM等一样存储HTML字符串。使用新功能后,示例脚本将发出警告失败。

我尝试使用正则表达式进行转义,并使用escape()进行转义,但我没有运气。

任何人都知道该怎么做?

编辑:尴尬的是,这实际上似乎工作正常。只是不在我需要它的范围内。我有一个文本框,在提交测试时简单地用作javascript,当我从那里调用函数时,它可以工作,但是当代码调用时会发生错误。 谢谢你的帮助,但它实际上看起来并不像我想象的那样,对不起。

3 个答案:

答案 0 :(得分:1)

尝试转义HTML

var html = '<div id=\"test\">testing</div>';

localStorage.setItem("Foo", html);

\放在"

之前

编辑:

我刚试过以下内容(在Firefox中,因为它在我面前打开),它运行正常:

var html = '<div id="test">testing</div>';

localStorage.setItem("Foo", html);

console.log(localStorage.getItem("Foo"));

刚刚在Chrome中尝试过,它运行正常。

答案 1 :(得分:1)

使用encodeURI存储,然后使用decodeURI进行检索

localStorage.setItem('html',encodeURI('<div id="test">testing</div>'))
localStorage.getItem('html')
"%3Cdiv%20id=%22test%22%3Etesting%3C/div%3E"
decodeURI(localStorage.getItem('html'))
  "<div id="test">testing</div>"

答案 2 :(得分:0)

我会通过将其转换为JSON并返回来实现通用数据的存储。这适用于支持转换为 JSON(字符串,数字,大多数对象,布尔值等)的所有内容。

var Mem = (function (localStorage, JSON) {
    return {
        'set': function (key, value) {
            return localStorage.setItem(key, JSON.stringify(value));
        },
        'get': function (key) {
            return JSON.parse(localStorage.getItem(key));
        },
        'del': function () {
            for (var i = 0; i < arguments.length; ++i)
                localStorage.removeItem(arguments[i]);
        }
    };
}(window.localStorage, window.JSON)); // protect references

使用

Mem.set('foo', 0);
Mem.set('bar', '0');
Mem.set('baz', false);
Mem.get('foo'); // Number 0
Mem.get('bar'); // String "0"
Mem.get('baz'); // Bool false
Mem.del('foo', 'bar', 'baz'); // cleanup

所以对你的例子

var data = '<div id="test">testing</div>';
Mem.set('test', data);
console.log(Mem.get('test') === data); // true
Mem.del('test'); // cleanup