页面之间不共享本地存储

Baz*_*Baz 4 html javascript epub epub3

我有一本epub3书,有2页以及目录页。我正在Mac OSX上的Apple图书(内置的epub3阅读器)中查看这本书。这两个页面并排出现。第一页如下:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=500, height=600"/>
    </head>
    <body>

<p id="result"></p>

<script>
//<![CDATA[
  var current_page = "1";
  var other_page = "2";

  var t = 0;

  setInterval(function() {

    var d = new Date();
    var storage = localStorage; 

    storage.setItem("t"+ current_page, d.toLocaleString());

    document.getElementById("result").innerHTML = storage.getItem("t"+ current_page) +" "+storage.getItem("t"+ other_page);    
  }, 1000);

//]]>
</script>

    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

第二页中唯一不同的是:

  var current_page = "2";
  var other_page = "1";
Run Code Online (Sandbox Code Playgroud)

因此,第1页每秒钟将当前时间保存为Local Storage作为t1,第2页对值执行相同的操作t2。同时,这两个网页同时读取t1t2从本地存储,它们的值显示屏幕前。但是,在ibook中,页面1仅t2在重新加载页面时才显示当前值-就像我翻到目录然后再​​次回到页面1和2一样。关于第2页,发生了类似的情况t1

因此,在时间21:10:00,页面1可能显示:

08/09/19,21:09:18 08/09/19,21:08:58

和第2页:

08/09/19,21:09:22 08/09/19,21:08:01

我也尝试使用会话数据,但第1页无法读取,t2而第二页无法读取t1。因此,将改为显示:

19/08/09,21:09:18空

我可以想到几个应用程序,这对于Pages相互通信非常有用。

例如,如果视频在一页上播放,则在另一页上开始播放视频时停止它会很有用。通常可以使用会话存储来完成。这与我自己的用例以及我开始研究此问题的原因有关。

同样,如果要求用户在页面1上输入故事的主要角色的名称,则一旦输入,该条目应立即出现在页面2上。

除本地存储或会话存储外,Pages是否还有其他其他方式可以在epub3中彼此通信?

Mau*_*ino 7

我不知道epub3,也没有要测试的MAC,但是我想到了以下四种可能的解决方案:

饼干

它的性能不如localStorage该用例好,但是如果您没有太多选择,总比没有好。

创建,读取和删除Cookie的功能(提供给/sf/answers/1976159251/的信用):

function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
function eraseCookie(name) {   
    document.cookie = name+'=; Max-Age=-99999999;';  
}

Run Code Online (Sandbox Code Playgroud)

您的示例的用法:

function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
function eraseCookie(name) {   
    document.cookie = name+'=; Max-Age=-99999999;';  
}

Run Code Online (Sandbox Code Playgroud)

广播频道

BroadcastChannel是一项非常新的功能,因此“ Books”应用可能不支持它。但这是一个概念:

<script>
//<![CDATA[
  var current_page = "1";
  var other_page = "2";

  var t = 0;

  setInterval(function() {

    var d = new Date();

    setCookie("t"+ current_page, d.toLocaleString(), 100); // 100 days

    document.getElementById("result").innerHTML = getCookie("t"+ current_page) +" "+getCookie("t"+ other_page);    
  }, 1000);

//]]>
</script>
Run Code Online (Sandbox Code Playgroud)

某种后端

如果以上方法均无效,则除了使用某种后端来提供和保存数据外,您别无选择。

如果只适合您,我建议您使用Firebase或MongoDB Atlas的免费层,因为它们在它们的免费层上都提供了一定的价值。

如果您使用后端进行此操作,则可以使用以下方法完成此操作:

<script>
//<![CDATA[
  var broadcaster = new BroadcastChannel('test');
  var current_page = "1";
  var other_page = "2";

  var t = 0;

  setInterval(function() {

    var d = new Date();

    // Send message to all other tabs with BroadcastChannel('test')
    bc.postMessage({
        senderPage: "t"+ current_page,
        date: d.toLocaleString()
    });
  }, 1000);

  broadcaster.onmessage = (result) => {
      if(result.senderPage == "t"+ other_page) { // If the message is from the other page
        // Set HTML to current date + sent Date from other page
        var d = new Date();
        document.getElementById("result").innerHTML = d.toLocaleString() +" "+result.date;    
      }
  };

//]]>
</script>
Run Code Online (Sandbox Code Playgroud)

后端中的某些方法需要看起来像这样(请注意,这不是任何语言的有效代码):

@GET
function getDate(requestingPageId)
    find latest entry with page.id == requestingPageId
    return page.date

@POST
function saveDate(savingPage, savingDate)
    store new page element with 
        page.id = savingPage
        page.date = savingDate
Run Code Online (Sandbox Code Playgroud)

数据库中的集合如下所示:

[
    {
        id: 1,
        date: "date"
    },{
        id: 2,
        date: "date"
    },{
        id: 2,
        date: "date"
    },{
        id: 1,
        date: "date"
    },

    // ...
]
Run Code Online (Sandbox Code Playgroud)

窗口参考

如果“图书”应用从第一个选项卡打开第二个选项卡,则可能值得研究: