оператор переключения JavaScript не работает - PullRequest
1 голос
/ 10 марта 2011

Привет, у меня есть оператор switch, и он работает нормально, когда это случай 9 или меньше, как показано ниже

    function checkBoxes(obj) {
            var indx = obj.id.substring(obj.id.length-1, obj.id.length);
            switch ( indx ) {
                case '1':

                    if (document.sportsInfo.Info_1.checked) {

                        document.sportsInfo.Info_2.disabled = true;
                        document.sportsInfo.Info_2.checked = false;                     
                        document.sportsInfo.Info_3.disabled = true;
                        document.sportsInfo.Info_3.checked = false;
                        document.sportsInfo.Info_4.disabled = true;
                        document.sportsInfo.Info_4.checked = false;
                        document.sportsInfo.Info_5.disabled = true;
                        document.sportsInfo.Info_5.checked = false;
                        document.sportsInfo.Info_6.disabled = true;
                        document.sportsInfo.Info_6.checked = false;
                        document.sportsInfo.Info_7.disabled = true;
                        document.sportsInfo.Info_7.checked = false;
                        document.sportsInfo.Info_8.disabled = true;
                        document.sportsInfo.Info_8.checked = false;
                        document.sportsInfo.Info_9.disabled = true;
                        document.sportsInfo.Info_9.checked = false;
                        document.sportsInfo.Info_10.disabled = true;
                        document.sportsInfo.Info_10.checked = false;
                        document.sportsInfo.Info_11.disabled = true;
                        document.sportsInfo.Info_11.checked = false;
                        document.sportsInfo.Info_12.disabled = true;
                        document.sportsInfo.Info_12.checked = false;
                    } 
                    else {
                        document.sportsInfo.Info_2.disabled = false;
                        document.sportsInfo.Info_3.disabled = false;    
                        document.sportsInfo.Info_4.disabled = false;
                        document.sportsInfo.Info_5.disabled = false;
                        document.sportsInfo.Info_6.disabled = false;
                        document.sportsInfo.Info_7.disabled = false;
                        document.sportsInfo.Info_8.disabled = false;    
                        document.sportsInfo.Info_9.disabled = false;
                        document.sportsInfo.Info_10.disabled = false;
                        document.sportsInfo.Info_11.disabled = false;
                        document.sportsInfo.Info_12.disabled = false;
                    }
                    break;

, но когда он достигает случая 10 или выше, он вообще не работает:

    case '10':
                    if (document.sportsInfo.Info_10.checked) {
                        document.sportsInfo.Info_1.disabled = true;
                        document.sportsInfo.Info_1.checked = false;
                        document.sportsInfo.Info_2.disabled = true;
                        document.sportsInfo.Info_2.checked = false;                     
                        document.sportsInfo.Info_3.disabled = true;
                        document.sportsInfo.Info_3.checked = false;
                        document.sportsInfo.Info_4.disabled = true;
                        document.sportsInfo.Info_4.checked = false;
                        document.sportsInfo.Info_5.disabled = true;
                        document.sportsInfo.Info_5.checked = false;
                        document.sportsInfo.Info_6.disabled = true;
                        document.sportsInfo.Info_6.checked = false;
                        document.sportsInfo.Info_7.disabled = true;
                        document.sportsInfo.Info_7.checked = false;

                        document.sportsInfo.Info_8.disabled = true;
                        document.sportsInfo.Info_8.checked = false;
                        document.sportsInfo.Info_9.disabled = true;
                        document.sportsInfo.Info_9.checked = false;

                    } 
                    else {
                        document.sportsInfo.Info_1.disabled = false;
                        document.sportsInfo.Info_2.disabled = false;
                        document.sportsInfo.Info_3.disabled = false;    
                        document.sportsInfo.Info_4.disabled = false;
                        document.sportsInfo.Info_5.disabled = false;
                        document.sportsInfo.Info_6.disabled = false;
                        document.sportsInfo.Info_7.disabled = false;

                        document.sportsInfo.Info_8.disabled = false;
                        document.sportsInfo.Info_9.disabled = false;

                    }
                    break;

как заставить дела работать больше или равно 10?

Ответы [ 7 ]

7 голосов
/ 10 марта 2011

Ваша подстрока всегда имеет длину всего один символ:

substring(obj.id.length-1, obj.id.length)

Кстати: если вы хотите отключить все другие флажки, кроме отмеченного, вы можете сделать это:

function checkBoxes(elem) {
    if (elem.checked) {
        for (var i=1; i<=12; i++) {
            if ("Info_"+i == elem.id) continue;
            document.sportsInfo["Info_"+i].disabled = true;
            document.sportsInfo["Info_"+i].checked = false;
        }
    } else {
        for (var i=1; i<=12; i++) {
            if ("Info_"+i == elem.id) continue;
            document.sportsInfo["Info_"+i].disabled = false;
        }
    }
}
1 голос
/ 10 марта 2011

obj.id.substring(obj.id.length-1, obj.id.length);

Этот код извлекает только последний 1 символ подстроки, поэтому он не будет работать для двухзначных чисел.Самый простой способ исправить это - взять последние два символа и изменить параметры <10 так, чтобы они были «Info_01», «Info_02», «Info_03» и т. Д. </p>

0 голосов
/ 19 мая 2011

Я знаю, что это отличается от того, что было сказано выше для исходной задачи, которая использует вариант строкового типа для аргумента оператора switch, но я хотел опубликовать здесь "gotcha", так как он находится в том же духеиз «Оператор переключения javascript не работает».

Сценарий, который я хочу охватить, - это когда вы пытаетесь использовать вариант числового типа для аргумента оператора переключения.Вы можете столкнуться со странной ситуацией, когда, даже если вы преобразовали вариант в число, он все равно не будет зарегистрирован как число.

Посмотрите на этот сценарий:

var intCase = document.getElementById("somePageElementWithANumericValue").value;

intCase = new Number(intCase); //This is supposed to be a number now...

switch(intCase)
{
    case 0:
        alert("Case 0");
        break;

    case 1:
        alert("Case 1");
        break;

    case 2:
        alert("Case 2");
        break;

    default:
                          //But this is what will execute
        alert("Unexpected case? --> [" + intCase + "]");
        break;
}

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

intCase = new Number(intCase) + 0; //This is like type casting

Это ситуация, с которой я недавно столкнулся, и пока я не выполнил свой трюк "приведения типов", я не мог заставить этот скрипт работатьвсе.Я не понимаю, почему класс Number не справился со своей задачей, но, по крайней мере, есть обходной путь.

Теперь я уверен, что есть люди, у которых никогда не было такой проблемы.Все, что я могу сказать об этом, это не может быть проблемой для всех, но я знаю, что такие странные проблемы случаются.Поскольку JavaScript является языком сценариев и не является строго типизированным, я ожидаю, что такого рода проблемы могут возникнуть.VBScript не лучше, я видел, что он делает действительно невероятно плохие вещи, такие как оценка оператора if, который был явно верным ложному.

0 голосов
/ 10 марта 2011

использование:

var indx = obj.id.match( /\d+$/ )[0];

чтобы найти ваш индекс. Регулярное выражение соответствует одной или нескольким цифрам в конце строки.

0 голосов
/ 10 марта 2011

Попробуйте это регулярное выражение; он извлечет всю серию цифровых символов в конце идентификатора объекта:

var indx = obj.id.match( /([0-9]+)$/ )[ 0 ];

Более подробно, вы можете бросить чек, чтобы убедиться, что было совпадение:

var m = obj.id.match( /([0-9]+)$/ );

if ( m.length == 0 )
    return;

var indx = m[ 0 ];
0 голосов
/ 10 марта 2011

Проблема связана с использованием вами подстроки ().

0 голосов
/ 10 марта 2011

У вас есть подстрока, гарантирующая возвращение 1 и только 1 символа. Всегда.

var s = "sample";
s.substring(s.length-1,s.length);

всегда будет возвращать «е».

Исправьте подстроку, и вы будете в порядке.

...