Простой Javascript "неопределенный" вопрос - PullRequest
0 голосов
/ 29 сентября 2010

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

if(child.offsetWidth == 0 || child.offsetHeight == 0 || child.style.visibility == 'hidden'     || child.style.display == 'none'){

child определен в цикле, так что это не проблема.

Проблема в том, что элементы могут не иметь определенного атрибута стиля, и поэтому javascript возвращает «child.style» не определенным.

Как мне сделать, казалось бы, простой оператор if безон остановился, потому что что-то не определено?

Я пытался сделать это:

if(undefined !== child.style){ var addquery = "child.style.visibility == 'hidden' ||     child.style.display == 'none'"; }
if(child.offsetWidth == 0 || child.offsetHeight == 0 || addquery){
console.debug(child);
}

Но я думаю, что addquery просто оценивается как true и не работает.

Ответы [ 5 ]

7 голосов
/ 29 сентября 2010
if(child.offsetWidth == 0 || child.offsetHeight == 0 || (child.style && (child.style.visibility == 'hidden' || child.style.display == 'none')))

Поскольку && является оператором короткого замыкания , он будет оценивать child.style.visibility == 'hidden' || child.style.display == 'none', только если child.style оценивается как true, то есть child.style существует и, следовательно, могут быть доступны. Если child.style оценивается как false, остальные будут просто игнорироваться; child.style не будет доступен, и поэтому никаких ошибок не будет.

4 голосов
/ 29 сентября 2010

Если this.child равно undefined, следующая часть от && ( до ) не будет оцениваться.

if(child.offsetWidth == 0 || child.offsetHeight == 0 || typeof child.style != 'undefined' && (child.style.visibility == 'hidden' || child.style.display == 'none')){
2 голосов
/ 29 сентября 2010

Не используйте undefined в качестве ключевого слова, потому что оно не существует в JavaScript.

Однако, поскольку каждая переменная изначально не определена, тестирование несуществующей переменной undefined часто работает. Тем не менее:

var undefined = 5; // this could be anywhere in the code

// [...]

if(foo === undefined) // *not* the test you want to be checking

Вместо этого используйте typeof foo == "undefined". Только фактически неопределенная переменная вернет строку "undefined" из оператора typeof

1 голос
/ 29 сентября 2010

Проверьте свойство nodeType каждого ребенка. Если дочерний элемент является элементом, он гарантированно имеет свойство style, и нет необходимости проверять, является ли оно неопределенным. Ваш код дает понять, что вас интересуют только элементы, поэтому вы должны убедиться, что имеете дело только с элементами.

if ((child.nodeTye == 1) && [...all the other conditions...]) {...}

Кроме того, проверка свойств display и visibility свойства style элемента не скажет вам, действительно ли элемент виден на странице или нет, поскольку объект style содержит только значения, заданные явно на элемент через атрибут style или свойство style. Вместо этого вам нужно проверить вычисленное значение display и visibility, что можно сделать с помощью window.getComputedStyle (или свойства элемента currentStyle в IE).

0 голосов
/ 29 сентября 2010

Если вы не хотите, чтобы ваш код был остановлен из-за ошибки (например, x.style.display с x.style undefined вызовет исключение), но ваш код может продолжаться, просто используйте try catch

   try {
        ...child.style.visibility...
   } catch(e) {
        // do either nothing or set child.style for instance
   }

таким образом, код не останавливается, у вас есть способ поймать проблему, а также способ ее исправить.

...