【问题标题】:checkbox value from webstorage performing function来自 webstorage 执行功能的复选框值
【发布时间】:2017-03-18 16:22:01
【问题描述】:

我有多个复选框,单击这些复选框时,会将 eventSource 添加到我的 jquery fullcalendar。刷新页面时,我可以从存储中检索复选框值,但未添加事件源。我必须取消选中然后重新选中复选框。

这是单击单个复选框执行的功能。

$("#checkbox1").change(function() {
    if (this.checked) {
        $('#calendar').fullCalendar('addEventSource', 'EventListRed.php');
    } else {
        $('#calendar').fullCalendar('removeEventSource', 'EventListRed.php');
    }
});

这是我如何使用网络存储来保留复选框值

$(document).ready(function() {
    var boxes = document.querySelectorAll("input[type='checkbox']");
    for (var i = 0; i < boxes.length; i++) {
        var box = boxes[i];
        if (box.hasAttribute("store")) {
            setupBox(box);
        }
    }

    function setupBox(box) {
        var storageId = box.getAttribute("store");
        var oldVal = localStorage.getItem(storageId);
        box.checked = oldVal === "true" ? true : false;
        box.addEventListener("change", function() {
            localStorage.setItem(storageId, this.checked);
        });
    }
});

编辑:

我已按要求添加了JSFiddle demo。 如您所见,复选框值已保存,但我的事件未从 EventsListRed.php 加载。

请注意,我不确定如何在 jsfiddle 中链接 .php 文件。

我认为我的问题是我将复选框标记为已选中,但它没有触发更改功能。

【问题讨论】:

标签: javascript jquery fullcalendar web-storage


【解决方案1】:

您需要先调用 .fullCalendar( 'refetchEvents' ),然后再选中该框。

请查看refetchEvents的官方文档

  function setupBox(box) {
    var storageId = box.getAttribute("store");
    var oldVal = localStorage.getItem(storageId);
    $(box).on("change", function() {
      localStorage.setItem(storageId, this.checked);
    });
    box.checked = oldVal === "true" ? true : false;
    $('#calendar').fullCalendar( 'refetchEvents' ); 
    if (box.checked) {   
      $(box).trigger('change');

    }

  }

【讨论】:

    【解决方案2】:

    我能够获得您想要实现的目标,但这似乎是一个 hack。 见JsFiddle Demo

    HTML

    <input type="checkbox" id="cbRed" store="checkbox3" class="chk" />
    <label for="cbRed">Red</label>
    <div id='calendar'></div>
    

    CSS

    body {
      margin-top: 40px;
      text-align: center;
      font-size: 14px;
      font-family: "Lucida Grande", Helvetica, Arial, Verdana, sans-serif;
    }
    
    #calendar {
      width: 600px;
      margin: 0 auto;
    }
    

    JS

    $(document).ready(function() {
    
      var calendar = $('#calendar').fullCalendar({
        header: {
          left: 'prev,next today',
          center: 'title',
          right: 'month,agendaWeek,agendaDay'
        },
    
    
      });
    
      //Checkbox removing/adding red events
      $("#cbRed").change(function() {
        if (this.checked) {
          $('#calendar').fullCalendar('addEventSource', 'EventListRed.php');
        } else {
          $('#calendar').fullCalendar('removeEventSource', 'EventListRed.php');
        }
    
      });
    
    });
    
    $(document).ready(function() {
      var boxes = document.querySelectorAll("input[type='checkbox']");
    
      for (var i = 0; i < boxes.length; i++) {
        var box = boxes[i];
        if (box.hasAttribute("store")) {
          setupBox(box);
        }
      }
    
      function setupBox(box) {
        var storageId = box.getAttribute("store");
        var oldVal = localStorage.getItem(storageId);
        $(box).on("change", function() {
          localStorage.setItem(storageId, this.checked);
        });
        box.checked = oldVal === "true" ? true : false;
        if (box.checked) {
          $(box).trigger('change');
        }
      }
    
    });
    

    【讨论】:

    • 在控制台可以看到触发了php调用。无法将服务器端语言代码加载到 JsFiddle 中。
    • 感谢您的帮助。奇怪的是,它仍然没有在刷新时为我显示事件,但是当我移动到前一天或第二天时,它们会加载。就像重新访问页面时我需要刷新日历一样。我尝试在触发更改后添加 .fullCalendar( 'rerenderEvents' ) 和 .fullCalendar( 'refetchEvents' ) 但在页面刷新后仍不立即可见。
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2016-07-20
    • 2018-06-05
    • 2010-11-17
    • 2023-03-19
    相关资源
    最近更新 更多