Сохранить несколько флажков [] проверить состояние при обновлении страницы, используя локальное хранилище в php - PullRequest
0 голосов
/ 22 февраля 2019

У меня проблема с отображением состояния флажка пользователя после обновления страницы.Я пытался использовать локальное хранилище, но он проверяет все флажки, пожалуйста, помогите!Я использую ajax для загрузки разных страниц, чтобы выбрать строку с помощью флажка. Это входное значение

<input type="checkbox" id="checkselect" data-name="checkselect[]" class="get_value" value="<?php echo $row['car_booking_id'];?>">

А это мой javascript

   <script>
$('.get_value').on('click', function() {
  var fav, favs = [];
  $('.get_value').each(function() { // run through each of the checkboxes
    fav = {id: $(this).attr('name'), value: $(this).prop('checked')};
    favs.push(fav);
  });
  localStorage.setItem("favorites", JSON.stringify(favs));
  alert(fav);

});

$(document).ready(function() {
  var favorites = JSON.parse(localStorage.getItem('favorites'));
  //alert(favorites);
  if (!favorites.length) {return};
  console.debug(favorites);

  for (var i=0; i<favorites.length; i++) {
    console.debug(favorites[i].value == 'on');
    $('#' + favorites[i].id ).prop('checked', favorites[i].value);
  }
});

</script>

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Я думаю, что в вашем html вы должны добавить уникальный атрибут для каждого флажка, как этот

<input type="checkbox" id="checkselect" data-name="checkselect[]" 
data-unique="<?php echo $row['car_booking_id'];?>" 
class="get_value" 
value="<?php echo $row['car_booking_id'];?>">

Теперь сохраните проверенный статус с помощью unique_id, и $('.get_value[data-unique="' + favorites[i].unique_id + '"]').prop('checked', favorites[i].value); получит ввод с этим атрибутом и установитВключено или выключено в зависимости от сохраненного состояния

$('.get_value').on('click', function() {
  var fav, favs = [];
  $('.get_value').each(function() { // run through each of the checkboxes
    fav = {unique_id: $(this).attr('data-unique'), value: $(this).value};
    favs.push(fav);
  });
  localStorage.setItem("favorites", JSON.stringify(favs));
  alert(fav);

});

$(document).ready(function() {
  var favorites = JSON.parse(localStorage.getItem('favorites'));
  //alert(favorites);
  if (!favorites.length) {return};
  console.debug(favorites);

  for (var i=0; i<favorites.length; i++) {
    console.debug(favorites[i].value == 'on');
    $('.get_value[data-unique="' + favorites[i].unique_id + '"]').prop('checked', favorites[i].value);

  }
});

. Должно быть ясно, что использование атрибута id для группировки элементов является плохой практикой.Это для уникальности и должно использоваться как таковое.Группировка элемента может быть выполнена с использованием атрибута class или data-[anything].

Надеюсь, это поможет

0 голосов
/ 22 февраля 2019

Простая демонстрация использования объекта хранилища для отслеживания отмеченных флажков.

Здесь есть полезная фабричная функция StoreFactory Я написал, чтобы упростить дальнейшую работу с объектами хранилища - она ​​имеет толькоочень мало методов и очень прост в использовании.

Демонстрация генерирует несколько флажков, похожих на те, которые вы показываете в вопросе - хотя я сделал жизнь проще, добавив уникальный атрибут dataset.id - этовместо этого может быть просто фактический идентификатор, но в этом вопросе может показаться, что несколько флажков будут иметь один и тот же идентификатор, который недействителен.

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <script>
            const StoreFactory=function( name, type ){
                'use strict';
                const engine = type.toLowerCase() === 'local' ? localStorage : sessionStorage;
                const set=function( data ){
                    engine.setItem( name, JSON.stringify( data ) );
                };
                const get=function(){
                    return exists( name ) ? JSON.parse( engine.getItem( name ) ) : false;
                };
                const remove=function(){
                    engine.removeItem( name );
                };
                const exists=function(){
                    return engine.getItem( name )==null ? false : true;
                };
                const create=function(o={}){
                    set(o);
                };
                return Object.freeze({
                    set,
                    get,
                    exists,
                    create,
                    remove
                });
            }



            document.addEventListener('DOMContentLoaded', e=>{
                /* create a new storefactory object */
                let store=new StoreFactory('favourites','local');

                /* if the actual store does not exist, create it */
                if( !store.exists() )store.create();

                /* get the data stored in the local storage object */
                let data = store.get();


                /* assign event listeners to all the checkboxes */
                Array.prototype.slice.call( document.querySelectorAll('input[type="checkbox"]') ).forEach( chk=>{
                    chk.addEventListener('click', e=>{

                        /* add checked state to store */
                        data[ e.target.dataset.id ]=e.target.checked;

                        /* save the data */
                        store.set( data );
                    })
                });

                /* reload stored checkboxes */
                Object.keys( data ).map( k =>{
                    if( data[ k ]==true )document.querySelector( 'input[ type="checkbox" ][ data-id="'+k+'" ]' ).checked=true;
                    else {
                        delete data[ k ];
                        store.set( data );
                    }
                })
            })
        </script>
        <style>
            form{ margin:auto; display:flex; flex-diection:row;flex-wrap:wrap; align-items:center;align-content:center;justify:content:center;font-family:cursive }
            label{min-width:4rem;padding:0.5rem;margin:0.25rem;border:1px solid rgba(133,133,133,0.1);box-sizing:border-box;background:whitesmoke}
            label:before{content:attr(data-value);color:blue}
        </style>
    </head>
    <body>
        <form method='post' name='checkboxes'>
        <?php
            /* some checkboxes - note the use of the dataset id attribute! */
            for( $i=1; $i <= 50; $i++ ){
                printf('<label data-value=%d><input data-id="chk_%d" type="checkbox" name="checkselect[]" value="%d" class="get_value" /></label>', $i, $i, $i );
            }
        ?>
        </form>
    </body>
</html>

Насколько я могу судить, возникло несколько небольших проблем.с вашим кодом.Не будучи пользователем jQuery, я могу ошибаться, но похоже, что вы получаете ссылку на ВСЕ флажки и, независимо от отмеченного состояния, добавляете их в массив favs, который затем сохраняется в локальном объекте хранения.Само по себе это хорошо, проблема вращается вокруг fav = {id: $(this).attr('name'), value: $(this).prop('checked')}; ~, не было бы никакого способа сказать, какой флажок есть, который, если есть несколько проверенных.Каждый флажок должен иметь уникальный идентификатор (как всегда истинно ~ атрибуты идентификатора ДОЛЖНЫ быть уникальными !!)

Также кажется, что обработчик click должен быть определен после вызова $(document).ready, а затем я думаю, что удалитьвстроенный onchange="CheckedChange(this)" от каждого флажка.

Немного переписанная версия вашего кода, которая работает ... хотя я не знаю синтаксис для использования метода jQuery data ... Я думаю, что 'м близко, но это было неправильно, поэтому вместо этого использовали vanilla js.

<script>
    $(document).ready(function() {
        var favorites = JSON.parse( localStorage.getItem( 'favorites' ) );

        $('.get_value').on('click', function() {
            var favs = [];
            $('.get_value').each(function(){
                favs.push( {
                    id:$(this).attr('data-id'), 
                    value:$(this).prop('checked')
                } );
            });
            localStorage.setItem( 'favorites', JSON.stringify( favs ) );
        });

        if( favorites!==null ){
            for( var i=0; i < favorites.length; i++ ) {
                //$('input').data( 'id', favorites[i].id ).prop( 'checked', favorites[i].value );
                if( favorites[i].value ) document.querySelector( 'input[ type="checkbox" ][ data-id="'+favorites[i].id+'" ]' ).checked=true;
            }
        }
    });
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...