与 HTML5 中的 Web 应用程序进行离线和在线同步?

发布于 2025-01-03 21:18:20 字数 3516 浏览 1 评论 0原文

我下面有一个基本的 Web 应用程序,其中实现了 sqlite 存储措施。

我希望它能够在连接时随时更新我的​​ mysql 服务器,并在失去连接后存储值以推送到数据库。我希望它能够 使用时间戳比较作为安全措施,以防万一服务器上的值不同,我们可以进行时间戳检查以查看它试图更改的内容是否是最新值。 (这将在多台计算机上运行,​​因此需要某种故障保护)。

我相信这个事务只需要一种方式,值只需要更新服务器,值不需要传递回应用程序,所以我们可以在技术上销毁数据库在真正完成时,或者可能执行如果某处损坏则回滚。这是可行的事情,还是我在这里要求太多?

这是一个非常基本的应用程序,我想用作模型。

<!DOCTYPE html> 
<html>  
  <head>
    <title>Golf score keeper</title>
    <script src="http://www.google.com/jsapi"></script>
    <script>
      google.load("jquery", "1.4.1");
    </script>
    <script>
      var db = window.openDatabase("scores", "", "Previous Scores", 1024*1000);

      function insertScore(hole_num, num_strokes, course_id, email) {
       db.transaction(function(tx) {
      tx.executeSql('INSERT INTO Strokes (course_id, hole_num, num_strokes, email) VALUES (?, ?, ?, ?)', [course_id, hole_num, num_strokes, email]);
       });
      }

      function renderResults(tx, rs) {
    e = $('#previous_scores');
    e.html("");
    for(var i=0; i < rs.rows.length; i++) {
      r = rs.rows.item(i);
      e.html(e.html() + 'id: ' + r['id'] + ', hole_num: ' + r['hole_num'] + ', num_strokes: ' + r['num_strokes'] + ', email: ' + r['email'] + '<br />');
    }
      }

      function renderScores(email) {
    db.transaction(function(tx) {
      if (!(email === undefined)) {
        tx.executeSql('SELECT * FROM Strokes WHERE email = ?', [email], renderResults);
      } else {
        tx.executeSql('SELECT * FROM Strokes', [], renderResults);
      }
    });
      }

      $(document).ready(function() {
    db.transaction(function(tx) {
      tx.executeSql('CREATE TABLE IF NOT EXISTS Courses(id INTEGER PRIMARY KEY, name TEXT, latitude FLOAT, longitude FLOAT)', []);
      tx.executeSql('CREATE TABLE IF NOT EXISTS Strokes(id INTEGER PRIMARY KEY, course_id INTEGER, hole_num INTEGER, num_strokes INTEGER, email TEXT)', []);
    });

    $('#score_form').submit(function() {
     strokes = { 1: $('#hole1').val(), 2: $('#hole2').val() };
      for (var hole_num in strokes) {
        insertScore(hole_num, strokes[hole_num], 1, $('#email').val());
      }

      renderScores();
      return false;
    });

    $('#filter_previous_scores_form').submit(function() {
      e = $('#filter_by_email').val();
      renderScores(e);
      return false;
    });

    renderScores();
      });
    </script>
  </head>
  <body>
    <form method="get" id="score_form">
      <div>
    <label for="1">Hole 1</label>
    <input type="number" min="1" value="4" id="hole1" name="hole1" size="2" step="1" />
      </div>
      <div>
    <label for="2">Hole 2</label>
    <input type="number" min="1" value="4" id="hole1" name="hole2" size="2" step="1" />
      </div>
      <div>
    <input type="email" id="email" placeholder="Enter your email address" size="40"/>
      </div>
      <div>
    <input type="submit" value="Upload Score" />
      </div>
    </form>
    <div>
      <h2>Previous Scores</h2>
      <form id="filter_previous_scores_form">
    <input type="email" placeholder="Filter scores by email" size="40" id="filter_by_email" /><br />
    <input type="submit" value="Filter" />
      </form>
    </div>
    <div id="previous_scores">

    </div>
  </body>
</html> 

I have a basic web application below that has a sqlite storage measure implemented into it.

I would like it to be able to update my mysql server anytime it is connected, and store values to push to the database after it has lost connection. I would like it to be able to
use a timestamp comparison as a safety measure, just in case values on the server differ, we can to a stamp check to see if what it is trying to alter IS the most current values.
(this will be run from multiple computers, so will need SOME kind of failsafe).

I believe that this transaction WILL only need to be one way though, the values just need to update the server, values will not need to be passed back to the application, so we could technically destroy the database upon a real completion, or possibly perform a rollback if it breaks somewhere. Is this a doable thing, or am I really asking to much here?

Here's a very basic app I'd like to use as a model.

<!DOCTYPE html> 
<html>  
  <head>
    <title>Golf score keeper</title>
    <script src="http://www.google.com/jsapi"></script>
    <script>
      google.load("jquery", "1.4.1");
    </script>
    <script>
      var db = window.openDatabase("scores", "", "Previous Scores", 1024*1000);

      function insertScore(hole_num, num_strokes, course_id, email) {
       db.transaction(function(tx) {
      tx.executeSql('INSERT INTO Strokes (course_id, hole_num, num_strokes, email) VALUES (?, ?, ?, ?)', [course_id, hole_num, num_strokes, email]);
       });
      }

      function renderResults(tx, rs) {
    e = $('#previous_scores');
    e.html("");
    for(var i=0; i < rs.rows.length; i++) {
      r = rs.rows.item(i);
      e.html(e.html() + 'id: ' + r['id'] + ', hole_num: ' + r['hole_num'] + ', num_strokes: ' + r['num_strokes'] + ', email: ' + r['email'] + '<br />');
    }
      }

      function renderScores(email) {
    db.transaction(function(tx) {
      if (!(email === undefined)) {
        tx.executeSql('SELECT * FROM Strokes WHERE email = ?', [email], renderResults);
      } else {
        tx.executeSql('SELECT * FROM Strokes', [], renderResults);
      }
    });
      }

      $(document).ready(function() {
    db.transaction(function(tx) {
      tx.executeSql('CREATE TABLE IF NOT EXISTS Courses(id INTEGER PRIMARY KEY, name TEXT, latitude FLOAT, longitude FLOAT)', []);
      tx.executeSql('CREATE TABLE IF NOT EXISTS Strokes(id INTEGER PRIMARY KEY, course_id INTEGER, hole_num INTEGER, num_strokes INTEGER, email TEXT)', []);
    });

    $('#score_form').submit(function() {
     strokes = { 1: $('#hole1').val(), 2: $('#hole2').val() };
      for (var hole_num in strokes) {
        insertScore(hole_num, strokes[hole_num], 1, $('#email').val());
      }

      renderScores();
      return false;
    });

    $('#filter_previous_scores_form').submit(function() {
      e = $('#filter_by_email').val();
      renderScores(e);
      return false;
    });

    renderScores();
      });
    </script>
  </head>
  <body>
    <form method="get" id="score_form">
      <div>
    <label for="1">Hole 1</label>
    <input type="number" min="1" value="4" id="hole1" name="hole1" size="2" step="1" />
      </div>
      <div>
    <label for="2">Hole 2</label>
    <input type="number" min="1" value="4" id="hole1" name="hole2" size="2" step="1" />
      </div>
      <div>
    <input type="email" id="email" placeholder="Enter your email address" size="40"/>
      </div>
      <div>
    <input type="submit" value="Upload Score" />
      </div>
    </form>
    <div>
      <h2>Previous Scores</h2>
      <form id="filter_previous_scores_form">
    <input type="email" placeholder="Filter scores by email" size="40" id="filter_by_email" /><br />
    <input type="submit" value="Filter" />
      </form>
    </div>
    <div id="previous_scores">

    </div>
  </body>
</html> 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

秋日私语 2025-01-10 21:18:20

您应该在 setInterval 循环中查看 Ajax

You shoulg take a look at Ajax in a setInterval loop.

站稳脚跟 2025-01-10 21:18:20

当您发现 navigator.online=true 时,您可以应用设置间隔的逻辑,然后您可以调用ajax。

you can apply the logic of set interval when you found navigator.online=true then you can call ajax.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文