Исправление AlphaImageLoader для PNG работает онлайн, но не локально

Я использую исправление AlphaImageLoader под названием supersleight со следующим кодом:

   var supersleight = function() {

 var root = false;
 var applyPositioning = true;

 // Path to a transparent GIF image
 var shim   = 'images/empty.gif';

 // RegExp to match above GIF image name
 //var shim_pattern = /x\.gif$/i;



 var fnLoadPngs = function() { 
  if (root) {
   root = document.getElementById(root);
  }else{
   root = document;
  }
  for (var i = root.all.length - 1, obj = null; (obj = root.all[i]); i--) {
   // background pngs
   if (obj.currentStyle.backgroundImage.match(/\_.png/i) !== null) {
    bg_fnFixPng(obj);
   }
   // image elements
   if (obj.tagName=='IMG' && obj.src.match(/\_.png$/i) !== null){
    el_fnFixPng(obj);
   }
   // apply position to 'active' elements
   if (applyPositioning && (obj.tagName=='A' || obj.tagName=='INPUT') && obj.style.position === ''){
    obj.style.position = 'relative';
   }
  }
 };

 var bg_fnFixPng = function(obj) {
  var mode = 'scale';
  var bg = obj.currentStyle.backgroundImage;
  var src = bg.substring(5,bg.length-2);
  if (obj.currentStyle.backgroundRepeat == 'no-repeat') {
   mode = 'crop';
  }
  obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='" + mode + "')";
  obj.style.backgroundImage = 'url('+shim+')';
  obj.style.visibility= 'visible';
 };

 var el_fnFixPng = function(img) {
  var src = img.src;
  img.style.width = img.width + "px";
  img.style.height = img.height + "px";
  img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')";
  img.src = shim;
  img.style.visibility= 'visible';
 };

 var addLoadEvent = function(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
   window.onload = func;
  } else {
   window.onload = function() {
    if (oldonload) {
     oldonload();
    }
    func();
   };
  }
 };

 return {
  init: function() { 
   addLoadEvent(fnLoadPngs);
  },

  limitTo: function(el) {
   root = el;
  },

  run: function() {
   fnLoadPngs();
  }
     };
    }();

    // limit to part of the page ... pass an ID to limitTo:
    // supersleight.limitTo('header');
    supersleight.init();
    //Från början är opacity'n 100 eftersom jag inte vet om Javascript är påsatt eller inte och därmed inte vet om PNG'arna kommer att
    //bli genomskinliga eller ej. Är Javascript på så gör jag också bakgrunden genomskinlig så att PNG'arnas genomskinlighet inte blir i onödan
    //If-satsen eftersom transparency ej existerar på första-sidan och därigenom ger fel där

    if(document.getElementById('transparency') != null){
     document.getElementById('transparency').style.filter= "alpha(opacity=60)";
     document.getElementById('transparency').style.background = "#cccccc";
     }

Я вызываю его через тег отсрочки SCRIPT в начале файла HTML. Когда я загружаю сценарий и страницу на сервер, они отлично работают, но когда я пробую их локально, изображение вообще не отображается. По сути, сценарий устанавливает фон как бывшее изображение PNG с помощью AlphaImageLoader, а затем вместо этого устанавливает пустой пиксель как IMG src.

Если я прокомментирую:

//img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')";
//img.src = shim;

изображение отображается в нормальном состоянии, то есть в формате PNG с удаленной прозрачностью. Почему-то фильтр не устанавливает фон должным образом, когда это делается локально, и оставляет его пустым. Пробуя это в Browsershots и IE Netrenderer (ipinfo.info), я получаю тот же результат в Netrenderer, хотя Browsershots, Microsoft Expression Web Superpreview 3, тестирование с множественными IE и IETester показывает все так, как они должны ...

У кого-нибудь есть идея?


Оказывается, это потому, что я получил к нему доступ через file: //, и все это лежало в папке с большим количеством пробелов и странными символами в его имени ... не то чтобы я думал, что это будет иметь значение, но, очевидно, чтобы этот эффект работал в моем случае у меня не может быть его в папке, которая не следует простому синтаксису без пробелов и прочего ... возможно, это скорее общая проблема проводника, чем конкретно AlphaImageLoader ... любой, кто хочет немного просветить меня подробности в этом вопросе приветствуются! :)


Еще одно обновление ... Я могу получить к нему доступ как через Интернет, локальный сервер (localhost), так и напрямую через файл (file: // или C: //) без проблем. Проблема возникает, когда происходит следующее:

У меня была папка со следующим названием:

Sirocco v. 1.2 (загружено 100908) PNGfix + bakgrundsfärger_IE5.5-6

При использовании других имен папок проблема никогда не возникала, поэтому я попытался сузить ее ... похоже,

)

символ - это тот, который вызывает проблему ... с ним AlphaImageLoader не заполняет фон так, как должен, но без него фон заполняется нормально ... кто-нибудь понял, почему?


person fast-reflexes    schedule 08.09.2010    source источник
comment
Что конкретно означает локально: file:// URL или localhost?   -  person Pekka    schedule 08.09.2010
comment
пробовали ли вы исправить Unit PNG - ›labs.unitinteractive.com/unitpngfix.php   -  person Moin Zaman    schedule 08.09.2010
comment
@Pekka файл: // ... хм. есть разница?   -  person fast-reflexes    schedule 08.09.2010
comment
@Moin Zaman Да, это кажется приятным (чем больше я смотрю, тем больше понимаю, что существует множество хорошо работающих скриптов, когда дело доходит до этого ... Все они, похоже, используют AlphaImageFilter более или менее но точно так же, что заставляет меня поверить, что это не решит мою проблему ....   -  person fast-reflexes    schedule 08.09.2010
comment
Новая информация в вопросе   -  person fast-reflexes    schedule 08.09.2010


Ответы (3)


AlphaImageLoader использует пути относительно документа, а не файла CSS. Может, это как-то связано с твоей проблемой?

person Bundyo    schedule 08.09.2010
comment
Нет, я установил фильтр через Javascript obj.style.filter, а не через CSS, все равно спасибо! :) - person fast-reflexes; 08.09.2010
comment
AlphaImageLoader применяется через ActiveX, поэтому, возможно, это вопрос настроек безопасности, позволяющих использовать локальные файлы. - person Bundyo; 08.09.2010

Это не работает, потому что вы используете file: //, а не http: //, а настройки безопасности браузера не позволяют запускать javascript из file: //

Если на вашем ПК еще не настроен сервер, я могу порекомендовать XAMPP.

person Dawn    schedule 08.09.2010
comment
Я изолировал проблему ... посмотреть вопрос - person fast-reflexes; 08.09.2010

РЕШЕНИЕ: я чувствую себя глупо, это связано с параметрами, полученными эффектом фильтра.

Использование фильтра выглядит следующим образом:

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader('source','sizingMethod')

Конечно, когда я продолжу поиски источника:

Sirocco v. 1.2 (загружено 100908) PNGfix + bakgrundsfärger_IE5.5-6

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

РЕШЕНО! Спасибо вам всем!

person fast-reflexes    schedule 08.09.2010