212 lines
9.4 KiB
JavaScript
212 lines
9.4 KiB
JavaScript
// mediatypechecker.js
|
|
// CSS media types checking/detection script ver. 15-apr-2009 by Marcin Wiazowski (marcinwiazowski AT poczta DOT onet DOT pl)
|
|
// http://cssmedia.pemor.pl/
|
|
//
|
|
// You may freely use this script for any purposes (incl. commercial) or distribute it if only you want.
|
|
//
|
|
// Usage examples:
|
|
// IsMediaType('screen') - check if the current CSS medium is 'screen'
|
|
// IsMediaType('screen, print') - check if the current CSS medium is 'screen' or 'print'
|
|
//
|
|
// This script does NOT disable the Opera's Small-Screen Rendering technology when asking about
|
|
// the 'handheld' media type in the Opera's mobile browsers.
|
|
//
|
|
// Return values:
|
|
// -1 - error (browser too old, IE having 30 or more style sheets)
|
|
// 0 - tested media type(s) not active
|
|
// 1 - tested media type(s) active
|
|
//
|
|
//
|
|
// Tested both with HTML 4.01 Strict and XHTML 1.1 (with an "application/xhtml+xml" MIME type HTTP
|
|
// header for all capable browsers - i.e. for all tested browsers except Internet Explorer and
|
|
// Opera 7.2x):
|
|
//
|
|
// Tested and works (during page loading and when page is loaded) with:
|
|
//
|
|
// Internet Explorer (Trident): 5.01, 5.55, 6.0, 7.0, 8.0
|
|
// Opera (Presto): 7.2, 7.22, 7.23, 7.5, 8.0, 8.5, 8.53, 9.0, 9.23, 9.24, 9.25, 9.26, 9.27, 9.5, 9.51, 9.52, 9.6, 9.61, 9.62, 9.63, 9.64, 10.0 alpha 1
|
|
// Opera Mini (Presto): basic/advanced: 1.2.2960, 1.2.3214, 2.0.4062, 2.0.4509, 3.1.7196, 3.1.10423, advanced: 4.0.9751, 4.0.10406, 4.1.11313, 4.1.11355, 4.2.13212
|
|
// Safari (AppleWebKit): 3.0, 3.0.4, 3.1, 3.1.1, 3.1.2, 3.2, 3.2.1, 4.0 public beta
|
|
// Chrome (AppleWebKit/V8): 0.2.149.30, 0.3.154.9, 0.4.154.33, 1.0.154.36, 1.0.154.53, 2.0.169.1 beta
|
|
// Konqueror (KHTML): 3.5.8, 3.5.9, 4.0.80, 4.1.0, 4.1.1, 4.1.2, 4.1.3, 4.1.80, 4.2.0, 4.2.1, 4.2.2
|
|
// Firefox/IceWeasel (Gecko): 0.8, 0.9, 1.0, 1.0.4, 1.5, 1.5.0.12, 2.0.0.4, 2.0.0.14, 2.0.0.15, 2.0.0.18, 2.0.0.19, 2.0.0.20, 3.0, 3.0.4, 3.0.5, 3.0.8, 3.1 beta 3, 3.2 alpha 1 pre
|
|
// Fennec (Gecko): 1.0 alpha 1
|
|
// Camino (Gecko): 1.6.1, 1.6.5
|
|
// Epiphany (Gecko): 2.14, 2.18, 2.2, 2.22
|
|
// Flock (Gecko): 1.0.9, 1.1, 1.1.2, 1.2.1, 1.2.6, 2.0, 2.0.2
|
|
// Galeon (Gecko): 1.3.20, 2.0.2, 2.0.4, 2.0.5, 2.0.6
|
|
// K-Meleon (Gecko): 0.8, 0.8.2, 0.9, 1.0, 1.0.1, 1.0.2, 1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.5.0, 1.5.1
|
|
// Kazehakase (Gecko): 0.2.7, 0.4.2, 0.4.3, 0.5.4
|
|
// Mozilla (Gecko): 1.7.8, 1.7.13
|
|
// Netscape Navigator (Gecko): 7.1, 7.2, 8.0.2, 9.0.0.5, 9.0.0.6
|
|
// SeaMonkey/IceApe (Gecko): 1.0.9, 1.1.5, 1.1.8, 1.1.9, 1.1.13, 2.0 alpha 2
|
|
//
|
|
// Tested and does NOT work (neither during page loading nor when page is loaded) with:
|
|
//
|
|
// Internet Explorer (Trident): 4.01-
|
|
// Opera (Presto): 7.11 b-
|
|
// Safari (AppleWebKit): 2.0.4-
|
|
// K-Meleon (Gecko): 0.7 sp 1-
|
|
// Netscape Navigator (Gecko): 7.0-
|
|
|
|
function IsMediaType(mediatypes) {
|
|
|
|
function createEl(name)
|
|
{
|
|
var element = null;
|
|
if(document.createElementNS)
|
|
element = document.createElementNS('http://www.w3.org/1999/xhtml', name);
|
|
else
|
|
element = document.createElement(name);
|
|
return element;
|
|
}
|
|
|
|
function addCSSRule(id, selectorText, declarations, mediatypes)
|
|
{
|
|
// Dodajemy nowy arkusz styli
|
|
var styleElement = createEl('style');
|
|
if(!styleElement)
|
|
return;
|
|
styleElement.id = id;
|
|
styleElement.type = 'text/css';
|
|
styleElement.rel = 'stylesheet';
|
|
if(mediatypes)
|
|
styleElement.media = mediatypes;
|
|
document.getElementsByTagName('head')[0].appendChild(styleElement);
|
|
|
|
// Najpierw probujemy "appendChild", bo Safari i Konqueror obsluguje takze "document.styleSheets",
|
|
// ale wtedy zle dziala
|
|
var node = null;
|
|
try { // Opera, Safari, Konqueror
|
|
node = document.createTextNode(selectorText+' { '+declarations+' }');
|
|
styleElement.appendChild(node);
|
|
|
|
// Workaround dla Opery < 7.5
|
|
if((window.opera) && (!window.opera.version)) { // "window.opera.version" wprowadzono w Operze 7.6
|
|
styleElement.removeChild(node);
|
|
styleElement.appendChild(node);
|
|
}
|
|
} catch(err) { // IE, Firefox
|
|
if(node)
|
|
delete node;
|
|
if(document.styleSheets) {
|
|
var styleSheet = document.styleSheets[document.styleSheets.length-1]; // Ostatnio dodany arkusz styli (za pomoca styleElement)
|
|
if(styleSheet)
|
|
if(styleSheet.insertRule)
|
|
styleSheet.insertRule(selectorText+' { '+declarations+' }', styleSheet.cssRules.length);
|
|
else if(styleSheet.addRule)
|
|
styleSheet.addRule(selectorText, declarations);
|
|
}
|
|
}
|
|
}
|
|
|
|
function removeCSSRule(id)
|
|
{
|
|
var node = document.getElementById(id);
|
|
document.getElementsByTagName('head')[0].removeChild(node);
|
|
delete node;
|
|
}
|
|
|
|
function updateCSSRulesForKHTML()
|
|
{
|
|
// var ignoreMe = document.documentElement.offsetWidth; // Unstable in Konqueror 4.0.8
|
|
try {
|
|
var linkList = document.getElementsByTagName('link');
|
|
var i;
|
|
|
|
for(i = 0; i < linkList.length; i++) {
|
|
linkList[i].orig_disabled = linkList[i].disabled;
|
|
linkList[i].disabled = true;
|
|
}
|
|
|
|
for(i = 0; i < linkList.length; i++)
|
|
linkList[i].disabled = linkList[i].orig_disabled;
|
|
} catch(err) {}
|
|
}
|
|
|
|
try {
|
|
// KB262161 - dotyczy IE 4.0 .. IE 8.0
|
|
if(document.createStyleSheet) // IE
|
|
if(document.styleSheets.length >= 30)
|
|
return -1;
|
|
|
|
addCSSRule('mediaInspector_rule1', '#mediaInspector', 'visibility: hidden; color: #000000;');
|
|
addCSSRule('mediaInspector_rule2', '#mediaInspector', 'visibility: hidden; color: #FFFFFF;', mediatypes);
|
|
|
|
// Element z id=mediaInspector musi byc widoczny (on ani zaden element nadrzedny nie moze
|
|
// miec stylu "display: none" ani nie moze znajdowac sie w sekcji "head"), inaczej ustawianie
|
|
// koloru nie bedzie zgodne ze standardem (i nie bedzie dzialac pod Safari ani Konquerorem);
|
|
// wyjatek czynimy dla Opery < 9.5 ze wzgledu na wystepujacy w niej blad: jesli plik zostal
|
|
// zaladowany przez protokol HTTP (ale nie FILE), to:
|
|
//
|
|
// (1) W Operze < 9.0 w przypadku uzycia podczas ladowania strony (ale nie po jej zaladowaniu)
|
|
// wlasciwosci "currentStyle" na elemencie zawartym w sekcji "body" (ale nie "head"), po
|
|
// odswiezeniu strony (F5) styl dla "body" z pliku CSS jest czasem losowo ignorowany
|
|
// (inny workaround: zadeklarowac styl dla "body" w naglowku pliku HTML w tagu "style")
|
|
// (2) W Operze < 9.5 w przypadku uzycia podczas ladowania strony (ale nie po jej zaladowaniu)
|
|
// wlasciwosci "currentStyle" na elemencie zawartym w sekcji "body" (ale nie "head"), po
|
|
// odswiezeniu strony (F5) styl dla "body" z pliku CSS jest czasem losowo ignorowany,
|
|
// jesli w pliku CSS wystepuje rownoczesnie styl dla "*" (inny workaround: zamiast stylu
|
|
// dla "*" uzywac stylu dla "body *")
|
|
var node = null;
|
|
var place = null;
|
|
|
|
var buggy_opera = false;
|
|
if(window.opera) {
|
|
buggy_opera = true;
|
|
if((window.opera.version) && (parseFloat(window.opera.version()) >= 9.5))
|
|
buggy_opera = false;
|
|
}
|
|
|
|
if(buggy_opera) {
|
|
place = document.getElementsByTagName('head')[0];
|
|
if(place)
|
|
node = createEl('link');
|
|
} else {
|
|
place = document.getElementsByTagName('body')[0]; // document.body nie dziala dla XHTML w Safari 3.0.4-
|
|
if(place)
|
|
node = createEl('div');
|
|
}
|
|
if(node) {
|
|
node.id = 'mediaInspector';
|
|
place.appendChild(node);
|
|
}
|
|
|
|
if(node) {
|
|
// Dla Konquerora - umozliwia prawidlowe dzialanie getComputedStyle, zanim zaaplikowane
|
|
// zostana wszystkie arkusze styli
|
|
updateCSSRulesForKHTML();
|
|
|
|
var color = null;
|
|
try {
|
|
var mediaInspector = node;
|
|
|
|
color = mediaInspector.style['color'];
|
|
if(!color) {
|
|
if(mediaInspector.currentStyle)
|
|
color = mediaInspector.currentStyle['color'];
|
|
else if(window.getComputedStyle)
|
|
color = window.getComputedStyle(mediaInspector, null).getPropertyValue('color');
|
|
}
|
|
} catch(err) {}
|
|
|
|
place.removeChild(node);
|
|
delete node;
|
|
}
|
|
|
|
removeCSSRule('mediaInspector_rule1');
|
|
removeCSSRule('mediaInspector_rule2');
|
|
|
|
if(!color)
|
|
return -1;
|
|
|
|
color = color.replace(/[\s\t ]/gi, '').toUpperCase(); // \s does not work in Konqueror 4.1.1 and 4.1.2,
|
|
// so an additional space is needed
|
|
if((color == '#FFFFFF') || (color == 'RGB(255,255,255)'))
|
|
return 1;
|
|
else if((color == '#000000') || (color == 'RGB(0,0,0)'))
|
|
return 0;
|
|
else
|
|
return -1;
|
|
} catch(err) { return -1; }
|
|
} |