Как удалить eval () из динамических вызовов свойств и Uncaught ReferanceError - PullRequest
0 голосов
/ 26 февраля 2011

Я пытаюсь вызвать свойства объекта динамически.Я решил проблему с eval (), но я знаю, что eval - это зло, и я хочу сделать это лучше и безопаснее.Мой электронный код:

            // onfocus
            var classes = this.getAttribute('class').split(' ');
            for(var i = 0; i < classes.length; ++i) {
                if(classes[i].match(/val\- */) !== null) {
                    var rule = classes[i].substr(4);
                    var instruction = eval('validate.instructionTexts.'+ rule +'()');

                    tooltip.appendChild( document.createTextNode(instruction) );
                }
            } 

И у меня также есть этот код:

       // onblur
        var classes = this.getAttribute('class').split(' ');
        for( var i = 0; i < classes.length; ++i ){
            if(classes[i].match(/val\- */) !== null) {
                var rule = classes[ i ].substr( 4 );
                var tooltip = document.getElementsByClassName( 'tooltip' );
                for( i = 0; i < tooltip.length; ++i){
                    tooltip[ i ].style.display = 'none';
                }

                eval('validate.rules.'+ rule +'(' + (this.value) + ')');
            }

проблема со вторым кодом заключается в том, что я хочу отправить строку в свою собственность.this.value = текст, который я печатаю в своем текстовом поле, поэтому я получаю правильную строку из this.value, но я получил эту ошибку.

, если я ввожу foo.Uncaught ReferenceError: foo не определено.Javascript думает, что я пытаюсь отправить переменную, но я хочу, чтобы она отправила строку.Как я могу решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2011

чтобы получить свойство foo из объекта obj, вы можете использовать либо

obj.foo

или

OBJ [ "Foo"]

Первый не разрешает зарезервированные слова или если свойство содержит пробелы.

Так что ваш первый пример может измениться на

validate.instructionTexts[rule]()
0 голосов
/ 26 февраля 2011
  1. Доступ к классу CSS элемента HTML можно получить непосредственно из JS через свойство className .
  2. Свойства объекта JS могут быть доступны через точечную нотацию object.property или через квадратную скобку-нотацию object['property'].
  3. Регулярное выражение /val\- */ соответствует символам v, a, l, a '-' дефису и нулю или более пробелов в любом месте строки.
    • Пробелы не имеют никакого значения, так как вы тестируете результат строки, которая была разбита на пробелы (и поэтому она больше не будет содержать пробелов).
    • Кроме того, вы не привязываете регулярное выражение, поэтому класс 'eval-test' также будет сопоставлен. Я сомневаюсь, что это то, что вы ищете.
    • Если вы только что тестировали классы, начинающиеся с val-, то метод indexOf гораздо проще для чтения и, возможно, также намного эффективнее.

Я скорректировал ваши биты кода соответственно. Я предполагаю, что имена классов для ваших правил проверки начинаются с val-, а остальная часть имени класса - это имя для правила:

// onfocus
var classes = this.className.split(' ');
for(var i = 0; i < classes.length; ++i) {
    if(classes[i].indexOf('val-') === 0) { // the class name starts with 'val-'
        var rule = classes[i].substr(4);
        var instruction = validate.instructionTexts[rule]();

        tooltip.appendChild(document.createTextNode(instruction));
    }
}


// onblur
var classes = this.className.split(' ');
for (var i = 0; i < classes.length; ++i ){
    if(classes[i].indexOf('val-') === 0) { // the class name starts with 'val-'
        var rule = classes[i].substr(4);
        var tooltip = document.getElementsByClassName('tooltip');
        for (i = 0; i < tooltip.length; ++i){
            tooltip[i].style.display = 'none';
        }

        validate.rules[rule](this.value);
    }
}
0 голосов
/ 26 февраля 2011

Вам не нужно использовать eval, вы можете получить к нему доступ как:

validate.rules[rule](this.value);

Что решит и вашу другую проблему, а именно: вы передаете значение this.value, которое, когда eval () 'd не заключен в кавычки как строка (то есть' foo '), поэтому интерпретируется как переменная.

...