forked from Shopify/Timber
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request Shopify#127 from Shopify/respond-js
Added media query support to oldIE with respond.js
- Loading branch information
Showing
8 changed files
with
305 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
<!-- Respond.js: min/max-width media query polyfill. Remote proxy (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs --> | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<title>Respond JS Proxy</title> | ||
</head> | ||
<body> | ||
<script> | ||
(function () { | ||
var domain, css, query, getQueryString, ajax, xmlHttp; | ||
|
||
/* | ||
http://stackoverflow.com/questions/4963673/get-url-array-variables-in-javascript-jquery/4963817#4963817 | ||
*/ | ||
getQueryString = function() { | ||
var ret = {}, parts, i, p; | ||
|
||
parts = (document.location.toString().split("?")[1]).split("&"); | ||
|
||
for (i = 0; i < parts.length; i++) { | ||
|
||
p = parts[i].split("="); | ||
// so strings will be correctly parsed: | ||
p[1] = decodeURIComponent(p[1].replace(/\+/g, " ")); | ||
|
||
if (p[0].search(/\[\]/) >= 0) { // then it"s an array | ||
p[0] = p[0].replace("[]", ""); | ||
|
||
if (typeof ret[p[0]] != "object") { | ||
ret[p[0]] = []; | ||
} | ||
ret[p[0]].push(p[1]); | ||
} else { | ||
ret[p[0]] = p[1]; | ||
} | ||
} | ||
return ret; | ||
}; | ||
|
||
ajax = function( url, callback ) { | ||
var req = xmlHttp(); | ||
if (!req){ | ||
return; | ||
} | ||
req.open( "GET", url, true ); | ||
req.onreadystatechange = function () { | ||
if ( req.readyState != 4 || req.status != 200 && req.status != 304 ){ | ||
return; | ||
} | ||
callback( req.responseText ); | ||
}; | ||
if ( req.readyState == 4 ){ | ||
return; | ||
} | ||
req.send(); | ||
}; | ||
|
||
//define ajax obj | ||
xmlHttp = (function() { | ||
var xmlhttpmethod = false, | ||
attempts = [ | ||
function(){ return new XMLHttpRequest(); }, | ||
function(){ return new ActiveXObject("Microsoft.XMLHTTP"); }, | ||
function(){ return new ActiveXObject("MSXML2.XMLHTTP.3.0"); } | ||
], | ||
al = attempts.length; | ||
|
||
while( al-- ){ | ||
try { | ||
xmlhttpmethod = attempts[ al ](); | ||
} | ||
catch(e) { | ||
continue; | ||
} | ||
break; | ||
} | ||
return function(){ | ||
return xmlhttpmethod; | ||
}; | ||
})(); | ||
|
||
query = getQueryString(); | ||
css = query["css"]; | ||
domain = query["url"]; | ||
|
||
if (css && domain) { | ||
ajax(css, function (response) { | ||
window.name = response; | ||
window.location.href = domain; | ||
}); | ||
} | ||
}()); | ||
</script> | ||
</body> | ||
</html> |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/*! Respond.js: min/max-width media query polyfill. Remote proxy (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ | ||
(function(win, doc, undefined){ | ||
var docElem = doc.documentElement, | ||
proxyURL = doc.getElementById("respond-proxy").href, | ||
redirectURL = (doc.getElementById("respond-redirect") || location).href, | ||
baseElem = doc.getElementsByTagName("base")[0], | ||
urls = [], | ||
refNode; | ||
|
||
function encode(url){ | ||
return win.encodeURIComponent(url); | ||
} | ||
|
||
function fakejax( url, callback ){ | ||
|
||
var iframe, | ||
AXO; | ||
|
||
// All hail Google http://j.mp/iKMI19 | ||
// Behold, an iframe proxy without annoying clicky noises. | ||
if ( "ActiveXObject" in win ) { | ||
AXO = new ActiveXObject( "htmlfile" ); | ||
AXO.open(); | ||
AXO.write( '<iframe id="x"></iframe>' ); | ||
AXO.close(); | ||
iframe = AXO.getElementById( "x" ); | ||
} else { | ||
iframe = doc.createElement( "iframe" ); | ||
iframe.style.cssText = "position:absolute;top:-99em"; | ||
docElem.insertBefore(iframe, docElem.firstElementChild || docElem.firstChild ); | ||
} | ||
|
||
iframe.src = checkBaseURL(proxyURL) + "?url=" + encode(redirectURL) + "&css=" + encode(checkBaseURL(url)); | ||
|
||
function checkFrameName() { | ||
var cssText; | ||
|
||
try { | ||
cssText = iframe.contentWindow.name; | ||
} | ||
catch (e) { } | ||
|
||
if (cssText) { | ||
// We've got what we need. Stop the iframe from loading further content. | ||
iframe.src = "about:blank"; | ||
iframe.parentNode.removeChild(iframe); | ||
iframe = null; | ||
|
||
|
||
// Per http://j.mp/kn9EPh, not taking any chances. Flushing the ActiveXObject | ||
if (AXO) { | ||
AXO = null; | ||
|
||
if (win.CollectGarbage) { | ||
win.CollectGarbage(); | ||
} | ||
} | ||
|
||
callback(cssText); | ||
} | ||
else{ | ||
win.setTimeout(checkFrameName, 100); | ||
} | ||
} | ||
|
||
win.setTimeout(checkFrameName, 500); | ||
} | ||
|
||
// http://stackoverflow.com/a/472729 | ||
function checkBaseURL(href) { | ||
var el = document.createElement('div'), | ||
escapedURL = href.split('&').join('&'). | ||
split('<').join('<'). | ||
split('"').join('"'); | ||
|
||
el.innerHTML = '<a href="' + escapedURL + '">x</a>'; | ||
return el.firstChild.href; | ||
} | ||
|
||
function checkRedirectURL() { | ||
// IE6 & IE7 don't build out absolute urls in <link /> attributes. | ||
// So respond.proxy.gif remains relative instead of http://example.com/respond.proxy.gif. | ||
// This trickery resolves that issue. | ||
if (~ !redirectURL.indexOf(location.host)) { | ||
|
||
var fakeLink = doc.createElement("div"); | ||
|
||
fakeLink.innerHTML = '<a href="' + redirectURL + '"></a>'; | ||
docElem.insertBefore(fakeLink, docElem.firstElementChild || docElem.firstChild ); | ||
|
||
// Grab the parsed URL from that dummy object | ||
redirectURL = fakeLink.firstChild.href; | ||
|
||
// Clean up | ||
fakeLink.parentNode.removeChild(fakeLink); | ||
fakeLink = null; | ||
} | ||
} | ||
|
||
function buildUrls(){ | ||
var links = doc.getElementsByTagName( "link" ); | ||
|
||
for( var i = 0, linkl = links.length; i < linkl; i++ ){ | ||
|
||
var thislink = links[i], | ||
href = links[i].href, | ||
extreg = (/^([a-zA-Z:]*\/\/(www\.)?)/).test( href ), | ||
ext = (baseElem && !extreg) || extreg; | ||
|
||
//make sure it's an external stylesheet | ||
if( thislink.rel.indexOf( "stylesheet" ) >= 0 && ext ){ | ||
(function( link ){ | ||
fakejax( href, function( css ){ | ||
link.styleSheet.rawCssText = css; | ||
respond.update(); | ||
} ); | ||
})( thislink ); | ||
} | ||
} | ||
|
||
|
||
} | ||
|
||
if( !respond.mediaQueriesSupported ){ | ||
checkRedirectURL(); | ||
buildUrls(); | ||
} | ||
|
||
})( window, document ); |
Oops, something went wrong.