Автоматически установить флажок, заменяющий div на отмеченный

У меня есть функция, которая создает внутренние div для родительского div. Он получает 2 параметра: "div_id" и "visitor_entered". Функция также ставит флажок в одном из этих созданных div и заменяет его div с фоновым изображением. Когда я нажимаю на div - он меняет фоновое изображение. Вот как я это делаю:

$("#checkbox_"+div_id).each(function(){
        $(this).hide().after("<div class='class_checkbox' id='visitor_entered_"+div_id+"' />");
    });

$("#visitor_entered_"+div_id).on('click',function(){
        $(this).toggleClass('checked').prev().prop('checked',$(this).is('.checked'));
    });

Теперь я хочу, чтобы при запуске этой функции проверялось, равно ли "visitor_entered" 1, и если да, то установите для этого div "#checkbox_"+div_id значение "checked". Я пробовал так:

if(visitor_entered==1)
    {
        alert("1, true!");
        $("#visitor_entered_"+div_id).prop('checked',$(this).is('.checked'));
    }

Он делал предупреждение, когда это было необходимо, но не проверял div. Итак, как я могу это сделать?

**ИЗМЕНИТЬ**

Вся функция:

function create_inner_divs(div_id, visitor_entered){
    for(var i=0; i<6; i++){
        divs_array[i] = div_id*10+i;
        var div_width = 704/6;
        $("<div id='"+divs_array[i]+"' style='width:"+div_width+
            "px; float:right; word-wrap:normal; word-break:break-all; padding:0 2px 0 2px;'>&nbsp;</div>").appendTo("#div_visitor_"+div_id);
    }

    $("<div id='div_visitor_entered_"+div_id+"' class='div_visitor_entered'><input name='checkbox_visitor_entered' type='checkbox' id='checkbox_"+div_id+"' class='input_class_checkbox'></div>").
        appendTo("#div_visitor_"+div_id);
    $("<div id='div_print_voucher_icon' class='div_print_voucher_icon'></div>").
        appendTo("#div_visitor_"+div_id);
    $("<div id='delete_visitor' class='delete_visitor'></div>").
        appendTo("#div_visitor_"+div_id);

    $("#checkbox_"+div_id).each(function(){
        $(this).hide().after("<div class='class_checkbox' id='visitor_entered_"+div_id+"' />");
    });

    $("#visitor_entered_"+div_id).on('click',function(){
        $(this).toggleClass('checked').prev().prop('checked',$(this).is('.checked'));
    });

    if(visitor_entered==1)
    {
        alert("1, true!");
        $("#visitor_entered_"+div_id).prop('checked',$(this).is('.checked'));
    }

}

person Igal    schedule 20.06.2013    source источник
comment
Можете ли вы дать нам всю функцию, как написано? То, как вы это опубликовали, я не уверен на 100%, что понимаю, что происходит и в каком порядке.   -  person Jason M. Batchelor    schedule 20.06.2013
comment
Кроме того, вам нужно одновременно обновлять элемент управления формой скрытого флажка или у вас есть другая функция, которая занимается этим?   -  person Jason M. Batchelor    schedule 20.06.2013
comment
Обновлен исходный вопрос со всей функцией. Да, я также хочу переключить скрытый флажок при нажатии на div. И, конечно же, установите значение checked, если visitor_entered==1.   -  person Igal    schedule 20.06.2013
comment
Консоль выдает ошибки? Я бы установил точку останова в коде на строке после вашего alert() и проверил, что возвращается, если вы попытаетесь посмотреть на $("#visitor_entered_"+div_id), просто чтобы убедиться, что он обращается к объекту, который, по вашему мнению, есть.   -  person Jason M. Batchelor    schedule 20.06.2013


Ответы (2)


АХ ХА! Я думаю, что он у меня есть!

    if (visitor_entered == 1) {
        alert("1, true!");
        // in here, you're trying to set a "checked" property ... on a DIV
        // because of that, you are not getting anything, because no such
        // property belongs to the div entity.
        // the only reason the code in your click event handler appears to work
        // is that you are also toggling the class on the div at the 
        // same time that you are attempting to change the property
        $("#visitor_entered_" + div_id).prop('checked', $(this).is('.checked'));
    }

Вам нужно управлять состояниями обоих элементов... вместо этого сделайте что-то вроде этого:

    if (visitor_entered == 1) {
        alert("1, true!");
        var veDiv = $("#visitor_entered_" + div_id);
        // first, toggle the class on the related checkbox:
        veDiv.toggleClass('checked');
        // second, find the sibling checkbox
        var veChk = veDiv.prev('[type=checkbox]');
        // NOW set that checkbox's checked property... which
        // DOES NOT accept a boolean value... it must be either
        // blank (not-checked) or 'checked'
        veChk.prop('checked', (veChk.is(':checked'))? '':'checked');
    }

(Извините... копирование и вставка из вашего кода не решит проблему)

Это один из недостатков слишком большого количества цепочек... легко предположить, что вы попадаете в правильные объекты в каждой части цепочки. Когда у вас начнутся проблемы, разбейте их на части, чтобы вы могли индивидуально проверить каждое предположение на пути. Вероятно, я бы обработал ваш щелчок так:

    $("#visitor_entered_" + div_id).on('click', function () {
        // you already have a reference to the clicked div, so get its
        // immediate predecessor checkbox
        var myChk = $(this).prev('[type=checkbox]');
        // toggle the div's class
        $(this).toggleClass('checked');
        // and then toggle the checkbox's checked property
        myChk.prop('checked', (veChk.is(':checked'))? '':'checked');
    });

(пришлось применить то же исправление к вашему коду onclick, что и к коду выше...)

Удачи!

person Jason M. Batchelor    schedule 20.06.2013

Я думаю, что вы используете неправильный псевдоселектор для «проверено». Попробуйте $(this).is(':checked') вместо .checked. Точка для классов.

Если вы ищете класс, сделайте $(this).hasClass('.checked')

обновите демонстрационный код:

Вы захотите переключить флажки следующим образом:

// your click handler for the div
$("#visitor_entered_"+div_id).on('click',function(){
    $(this).toggleClass('checked').prev().prop('checked',$(this).is('.checked'));

    // get the checkbox id
    var checkbox_id = this.id.replace("visitor_entered_", "checkbox_");
    var checkbox = $('#' + checkbox_id);

    // toggle the checkbox
    if (checkbox.is(':checked')) {
        // uncheck it
        checkbox.removeAttr('checked');
    } else { 
        // check it
        checkbox.attr('checked', 'checked');
    }
});
person Lian    schedule 20.06.2013
comment
Нет, OP переключает класс, а не базовый элемент ввода флажка, если я правильно понимаю... - person Jason M. Batchelor; 20.06.2013
comment
ОП сказал, что флажок добавлен. Поэтому я предположил, что это настоящий флажок. - person Lian; 20.06.2013
comment
Да, правильно, это переключение класса. Я хотел бы также переключить флажок одновременно. - person Igal; 20.06.2013
comment
Однако код Лиана не будет переключать флажок. Вам нужно будет сделать что-то вроде $(this).nearest('[type=checkbox]').attr('checked','checked') (или снять флажок, если вы, конечно, переключаете другое направление), чтобы изменить базовый флажок. - person Jason M. Batchelor; 20.06.2013
comment
Я отредактировал свой код, чтобы показать вам, как переключать флажок. Я не знал, что вы можете использовать .is() для проверки классов, но .hasClass() работает быстрее. Как указано здесь: stackoverflow.com/questions/4901553/jquery-hasclass-vs-is - person Lian; 20.06.2013