$ .parseJSON - uncaught SyntaxError - 如何检查undefined

时间:2014-04-02 18:40:56

标签: javascript jquery json cookies

我有以下jQuery函数,当cookie Uncaught SyntaxError: Unexpected token u未定义时,它会抛出$.cookie('chk_ar')

function checkBgNoise() {
// check background noise option state,
// if true, click 'on' to activate
// then add classes and check checkboxes

if( $.cookie('bg-noise-state') === 'true' ) {
  $('#bg-noise-on').trigger('click');

  // check for bg-noise array cookie
  var chk_ar = $.cookie('chk_ar');

  // convert string to object
  chk_ar = $.parseJSON(chk_ar);

  // loop through and apply checks to matching sets
  $.each(chk_ar, function(index, value) {
    // add bg-noise class for activated areas
    $('.' + value).addClass('bg-noise');
    // check those areas
    $('input').filter('[data-at="'+value+'"]').prop('checked', true);
  });

} else if ( $.cookie('bg-noise-state') === 'false' ) {

  // remove classes when selecting 'off'
  var chk_ar = $.cookie('chk_ar');
  chk_ar = $.parseJSON(chk_ar);
  $.each(chk_ar, function(index, value) {
    // remove bg-noise added on toggling off noise
    $('.' + value).removeClass('bg-noise');
    // uncheck the boxes
    $('input').filter('[data-at="'+value+'"]').prop('checked', false);
  });      
};

}; // end function checkBgNoise

我还在学习javascript绳索,所以我的方法中有一些相当明显的错误是完全可能的。代码通常正常运行,但如果可能的话,我想摆脱错误。

在Stack Exchange和Google上搜索错误代码表明问题出在$.parseJSON(chk_ar)的调用中,有时未定义。关于如何解决这个问题的任何想法?一个简单的if声明?

1 个答案:

答案 0 :(得分:1)

我做了一些修改,因此您在函数顶部获得chk_ar,然后在未定义的情况下退出。既然两个州都要求它,那么在顶部进行检查是有意义的......

function checkBgNoise() {
    // get this here since both states need the value - exit if it's undefined
    var chk_ar = $.cookie('chk_ar');
    if (chk_ar == undefined) return;

    // check background noise option state,
    // if true, click 'on' to activate
    // then add classes and check checkboxes

    if( $.cookie('bg-noise-state') === 'true' ) {
        $('#bg-noise-on').trigger('click');

        // convert string to object
        chk_ar = $.parseJSON(chk_ar);

        // loop through and apply checks to matching sets
        $.each(chk_ar, function(index, value) {
            // add bg-noise class for activated areas
            $('.' + value).addClass('bg-noise');
            // check those areas
            $('input').filter('[data-at="'+value+'"]').prop('checked', true);
        });
    }
    else if ( $.cookie('bg-noise-state') === 'false' ) {
        // remove classes when selecting 'off'
        chk_ar = $.parseJSON(chk_ar);
        $.each(chk_ar, function(index, value) {
            // remove bg-noise added on toggling off noise
            $('.' + value).removeClass('bg-noise');
            // uncheck the boxes
            $('input').filter('[data-at="'+value+'"]').prop('checked', false);
        });      
    };
} // end function checkBgNoise