hasNodePNG - выборка DOM элементов с фоновым PNG

Воскресенье, 05 Декабрь 2010

 

Оптимизируя верстку с использованием фоновых изображений PNG формата под IE6, я часто использую скрипт DD_belatedPNG_0.0.8a.js, который позволяет корректно отобразить элементы с фоновыми PNG (данный скрипт использует VML).

 

Скрипт работает отлично и его просто подключить и использовать для IE6:

 

 
<!--[if IE 6]>
<script type="text/javascript" src="DD_belatedPNG_0.0.8a.js"></script>
<script type="text/javascript">
DD_belatedPNG.fix('.pngFix');
</script>
<![endif]-->
 

 

 

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

 

Обдумывая такой случай задался вопросом, а как же получить все DOM элементы имеющие в CSS свойстве background-image PNG? Все оказалось достаточно просто в том случае если используется Javascript Framework Mootools или jQuery. В Mootools это функция getStyle();, а в jQuery css();, которые возвращают значения свойства переданного в качестве параметра:

 

 
#exemple{background:url('img/bg.png');}
 

 

Получаем значение свойства background-image, элемента с ID exemple

 

 
//mootools
$('exemple').getStyle('background-image'); //return 'background: url('/img/bg.png');'
//jQuery
$('#exemple').css('background-image'); //return 'background: url('/img/bg.png');'
 

 

Имея в наличии такие полезные функции можно пройтись по всему дереву DOM элементов и отобрать только те, у которых в параметре background-image используется PNG, занести эти элементы в массив, и далее обрабатывать эти элементы.

 

Данная идея реализовалась в виде такой функции :

 

 
//mootools
function hasNodePNG(elements){
  var array = [];
  var e = 0;
  elements.each(function(el, i){
    var bg = el.getStyle('background-image').toString();
    if(bg!='none' &amp;&amp; bg.test('.png') + 1){
      array[e]=el;
      e++;
    }
  });
  return array;
}
 

 

Которая в качестве входного параметра принимает массив элементов, проходится по ним в цикле, проверяя существует ли у элемента свойство background и есть ли в нем подстрока '.png', и если условие выполняется то данный элемент добавляется в массив. Функция отбирает из переданного ей массива элементов DOM те у которых есть свойство background содержащее ссылку на файл с расширением png.

 

Это вызов функции:

 

 
//mootools
var arr = hasNodePNG($$('body *'));
 

 

А это обработка возвращенных функцией элементов в массиве:

 

 
if(arr.length>0){
  for(var i=0;i<arr.length;i++){
    $(arr[i]).addClass('pngFix');
  }
  DD_belatedPNG.fix('.pngFix');
}
 

 

Здесь осуществляется проверка на то что массив не пустой, и если условие выполняется, в цикле каждому элементу массива (DOM) присваиваем класс pngFix, после чего вызываем функцию обработки PNG для IE6 DD_belatedPNG.fix(), передавая ей имя присвоенного класса - pngFix.

 

Не обязательно проверять все элементы документа, вы можете проверить лишь дочерние элементы у определенного родителя, передав функции массив элементов вот так:

 

 
//mootools
var arr = hasNodePNG($$('#parent *'));
 

 

Полный код:

 

 
//mootools
window.addEvent('domready',function(){
 
  function hasNodePNG(elements){
    var array = [];
    var e = 0;
    elements.each(function(el, i){
      var bg = el.getStyle('background-image').toString();
      if(bg!='none' &amp;&amp; bg.test('.png') + 1){
        array[e]=el;
        e++;
      }
    });
    return array;
  }
 
  var arr = hasNodePNG($$('body *'));
 
  if(arr.length>0){
    for(var i=0;i<arr.length;i++){
      $(arr[i]).addClass('pngFix');
    }
    DD_belatedPNG.fix('.pngFix');
  }
 
});
 

 

Это был пример с использованием javascript библиотеки mootools, ниже пример для jQuery:

 

 
//jQuery
$(document).ready(function(){
 
  function hasNodePNG(elements){
    var array = [];
    var i = 0;
    elements.each(function(n,element){
      var bg = $(element).css('background-image').toString();
      if(bg!='none' &amp;&amp; bg.indexOf('.png') + 1){
        array[i]=$(element);
        i++;
      }
    });
    return array;
  }
 
  var arr = hasNodePNG($('#main *'));
 
  if(arr.length>0){
    for(var i=0;i<arr.length;i++){
      $(arr[i]).addClass('pngFix');
    }
    DD_belatedPNG.fix('.pngFix');
  }
 
});
 

 

Download

 

PS. И не забудьте подписаться на ленту новостей RSS

Метки:

Похожие статьи:

Добавить комментарий