Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2015, 11:39
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Вызов click() на radio не изменяет его checked
Добрый день!
Столкнулся с непонятной логикой поведения в FF.
На странице средствами javascript создается и настраивается форма. Сначала производится ее создание и настройка, а потом она append'ится в состав страницы.
В состав этой формы входит radio-группа. На каждый элемент группы через JQuery подвешен обработчик click(). В конце настройки формы, но до ее append'a на страницу, на первом radio принудительно вызывается его click().
В IE, Chrome, Safari все нормально. В FF проблема... обработчик по click вызывается нормально, а вот checked самого radio-элемента остается неизменным...
С checkbox'ами такая же картина... Замена click на change тоже эффекта не дало...
Что за ерунда? Мне что, писать собственную реализацию метода click?
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2015, 12:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Можно погадать почему, но может все-таки код свой покажите?
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2015, 13:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от demoniqus
Что за ерунда?
Чую, что те инпуты находятся внутри label!
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2015, 13:12
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

(function(){
    var elemContainer = $('<div></div>');
    elemContainer.addClass('elem-container');
    formContainer.append(elemContainer);
    var image = $('<img class="grid-icon" src="styles/images/pivot/pivot-columns.png" />');
    elemContainer.append(image);
    var inputRadio = $('<input type="radio" class="elem-container-switcher" elemtype="cap" name="table-radio-group" id="table-radio-group-capElements" />');
    elemContainer.append(inputRadio);
    image.click(function(){inputRadio.click();});
    inputRadio.click(function(){
        if (this.checked) {
            elemContainer.parents('.table-headers-type-form:first').find('.active').removeClass('active');
            elemContainer.addClass('active');
        }
        console.log(this.checked)
    });
    elemContainer.append('<label for="table-radio-group-capElements" class="block-header">Заголовки</label>');
    var options = [
        //......
    ];
    var optionsList = $('<ul class="no-marked-list no-margin-list no-padding-list" id="options-list"></ul>');
    for (var i = 0; i < options.length; ++i) {
        //......
    }
    elemContainer.append(optionsList);
    elemContainer.append('<div class="selection-information"></div>');
    inputRadio.click();
    console.log(inputRadio.get(0).checked)
})();

click в предпоследней строчке кода


Первым делом я предположил, что что-то в составе страницы создает такую непонятку, но это оказалось не так.
Я написал вот так в чистой странице:
function(){
            var df = document.createDocumentFragment();
            var input = $('<input type="checkbox" id="checkbox1"></input>');
            input.click(function(){
                console.log('click => ' + (this.checked ? 'true' : 'false'))
            });
            input.change(function(){
                console.log('change => ' + (this.checked ? 'true' : 'false'))
            });
            input.click()
            $('#result').append(input);
        }

Во всех браузерах кроме FF input меняет свое состояние и в консоль пишется true. В FF при вызове input.click()в консоль пишется false и сам checkbox не меняет своего состояния.
Я сделал еще одну кнопку и повесил на нее функцию:
$('#do1').click(function(){
            var checkbox = $('#checkbox1');
            var df = document.createDocumentFragment();
            df.appendChild(checkbox.get(0));
            checkbox.click();
            $('#result').append(checkbox);
        });

Результат оказался таким, как я и предполагал: как только checkbox выпал из основного DOM-дерева, он перестал меняться. Использование вместо documentFragment обычного тега (document.createElement('div')) с таким же результатом подтвердило мои догадки.

И еще любопытный момент: физический click порождает также событие change, а программный click этого не делает. Это во всех браузерах.

Последний раз редактировалось demoniqus, 06.04.2015 в 13:18.
Ответить с цитированием
  #5 (permalink)  
Старый 06.04.2015, 13:13
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Сообщение от ksa Посмотреть сообщение
Чую, что те инпуты находятся внутри label!
Увы и ах, вынужден разочаровать - котлеты и мухи отдельно...

Кстати, ни разу так не пробовал... Любопытный эффект что ли? Или просто click зацикливается?

Последний раз редактировалось demoniqus, 06.04.2015 в 13:16.
Ответить с цитированием
  #6 (permalink)  
Старый 06.04.2015, 13:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

demoniqus, ты нормальный хтмл пример в состоянии сделать? Или так на твой говнокод смотреть и дальше медитировать?
Ответить с цитированием
  #7 (permalink)  
Старый 06.04.2015, 13:21
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Сообщение от ksa Посмотреть сообщение
demoniqus, ты нормальный хтмл пример в состоянии сделать? Или так на твой говнокод смотреть и дальше медитировать?
Выложить проект весом 700 метров?
Ответить с цитированием
  #8 (permalink)  
Старый 06.04.2015, 13:21
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Вот модель происходящего
<html>
<head>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" >
    
    $(function(){
        $('#do').click(function(){
            var df = document.createDocumentFragment();
            var input1 = $('<input type="checkbox" id="checkbox1"></input>');
            input1.click(function(){
                console.log('click => ' + (this.checked ? 'true' : 'false'))
            });
            input1.change(function(){
                console.log('change => ' + (this.checked ? 'true' : 'false'))
            });
            input1.click()
            $('#result').append(input1);
        });
    });
</script>
</head>
<body>
    <button id="do">CYCLE</button>
    <div id="result"></div>
    
</body>
</html>
Ответить с цитированием
  #9 (permalink)  
Старый 06.04.2015, 13:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от demoniqus
Выложить проект весом 700 метров?
Очередная дурь...

Ты понимаешь термин "тестовый пример"?
Ответить с цитированием
  #10 (permalink)  
Старый 06.04.2015, 13:23
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Устанавливайте обработчик элементам при их добавлении на страницу, или делегируйте их обработку ближайшему родителю гарантировано присутствующему на странице.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов документа из и его отображение cemper_nv Общие вопросы Javascript 2 26.07.2014 12:51
в getElement удаётся получить тэг через getElemetsByTagName Терехов Станислав Общие вопросы Javascript 19 19.06.2014 06:35
Помогите пожалуйста с radio проверить на checked Solonik Общие вопросы Javascript 1 23.07.2013 22:35
Двойной вызов события click Tmin10 jQuery 3 13.07.2012 22:15
Checked Radio CTPECC jQuery 6 13.11.2009 19:07