IE запускает событие изменения для флажка, когда пользователь нажимает в любом месте экрана - PullRequest
1 голос
/ 12 июля 2011

Вот самый простой код, воссоздающий проблему.(В моем примере с реальным миром я сбрасываю флажок, если при ajax-вызове возникает ошибка.)

<html>
    <script src="http://code.jquery.com/jquery-1.4.2.js"></script>
<script>
    $(document).ready( function(){
        $('#ckbx').change( function( e ){
            alert('fired.');
            this.checked = !this.checked;
        })
    });
</script>

<form>
    <input id="ckbx" type="checkbox"></input>
</form>

</html>

В IE9, когда я нажимаю флажок, отображается предупреждение.Затем, если я подожду какое-то время, затем щелкну где-нибудь еще на странице, событие снова запустится.

Если я удалю this.checked = !this.checked, проблема исчезнет.

Кто-нибудь может мне это объяснить?Или предоставить способ обойти эту проблему?

ОБНОВЛЕНИЕ: Я использую jquery 1.4.2;в jquery 1.6 это не проблема.Тем не менее, мы близки к выпуску, и мы не хотим менять версии jquery.

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Итак, проблема в том, что вы эффективно запускаете событие изменения из события изменения. Одним из вариантов может быть использование другого события, чтобы вы могли изменить значение с помощью кода.

В качестве альтернативы, вы можете рассмотреть activeFlag, похожий на этот ...

var activeFlag;
$(document).ready( function(){
    activeFlag = true;
    $('#ckbx').change( function( e ){
        if(activeFlag)
        {
            alert('fired.');
            activeFlag = false;//temp disable event to process value reset
            this.checked = !this.checked;
            activeFlag = true;
        }
    })
});

надеюсь, что помогает

RE: ДРУГОЕ ПРЕДЛОЖЕНИЕ

Это было бы то же самое, что и мое предложение использовать другое событие. Однако с помощью щелчка вы теряете свой обработчик событий, если пользователь вкладывает и использует пробел для внесения изменений. Конечно, вы можете решить, является ли это приемлемым или нет.

Извините за другого автора, я бы прокомментировал ваш, но у меня пока нет репутации. Именно поэтому я нахожусь здесь, я хочу создать это чисто, чтобы я мог набрать 15 и отметить ответ, который помог мне на днях. Глупо действительно

1 голос
/ 12 июля 2011

Похоже, идея активного флага имеет ту же проблему, хотя и работает, если реализована так:

var activeFlag = true;
$('#ckbx').change( function( e ){
    if(activeFlag)
    {
        activeFlag = false;
        alert('fired.');            
        this.checked = !this.checked;           
    }
    else
    {
        activeFlag = true;
    }
})
1 голос
/ 12 июля 2011

Это происходит потому, что событие .change() запускается снова, когда вы сбрасываете флажок и щелкаете в другом месте страницы. Вместо этого вы должны использовать событие .click().

<html>
    <script src="http://code.jquery.com/jquery-1.4.2.js"></script>
<script>
    $(document).ready( function(){
        $('#ckbx').click( function( e ){
            alert('fired.');
            this.checked = !this.checked;
        })
    });
</script>

<form>
    <input id="ckbx" type="checkbox"></input>
</form>

</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...