JQuery "Restringir" plugin - Estranho Javascript erro

votos
1

Antecedentes: Nosso aplicativo web usa as jquery.constrain.js plugins para lidar com a entrada de dados em algumas caixas de texto, para permitir apenas caracteres válidos para ser adicionado. Este plugin permite que várias restrições sobre os dados, usando expressões regulares, personagens whitelist / blacklist, etc. Até hoje, estávamos executando a versão 1.0 deste plugin, sem modificações.

Notei alguns dias atrás, que algumas das caixas de texto ainda permitia a entrada de dados inválidos. Por exemplo, um numérico-only caixa de texto permitido caracteres alfabéticos, etc. Ele também exibido um erro de javascript objecto não suporta esta propriedade ou método. Eu segui-lo para a seguinte função no plugin jquery.constrain.

    function match(item, input, e) {
        var arr = item.chars.split();
        for (var i in arr) {
            var token = arr[i];
            if (token.charCodeAt(0) == e.which) {
                return true;
            }
        }
        if (item.regex) {
            var re = new RegExp(item.regex);
            if (re.test(String.fromCharCode(e.which))) {
                return true;
            }
        }

        return false;
    };

Depuração através deste bloco de código, eu determinei o seguinte:

  • artigo é um objeto com duas propriedades de cadeia: caracteres e regex
  • item.chars é uma seqüência vazia ( ) no momento da falha.
  • arr , o resultado de item.chars.split ( ) é, como esperado, uma matriz vazia.

Aqui é onde é estranho. Mesmo que arr é uma matriz vazia, o loop for atribui um valor válido para i . O valor é remover. Então, nós cair no loop. símbolo é, obviamente, nulo, porque arr [ remover] é nulo. Então token.charCodeAt (0) lança.

Eu corrigiu o erro adicionando uma declaração se ao redor do loop for, como segue:

        if (arr.length > 0) {
            for (var i in arr) {
                var token = arr[i];
                if (token.charCodeAt(0) == e.which) {
                    return true;
                }
            }
        }

No entanto, estou completamente confuso a respeito de porque este foi ainda necessário - isso é um bug do IE, um bug no plugin, ou estou apenas prendendo a respiração errada quando eu compilar o aplicativo?

Publicado 19/05/2009 em 16:43
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Você nunca deve usar para (i em arr) para loop sobre Arrays. Se scripts de adicionar métodos para o protótipo matriz estes também vai ser repetido usando o loop for (i em arr). Este é provavelmente o que está causando seus erros. Você provavelmente já adicionou um script que modifica a cadeia Array.prototype.

Leia também aqui sob "Por que você deve parar de usar for ... in para iterar (ou nunca levá-la para cima)"
http://www.prototypejs.org/api/array

Respondeu 19/05/2009 em 16:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more