與製造主文檔和iframe小提琴。
從主文檔發送帶有窗柱消息主題
從iframe中監聽消息並設置背景主題顏色
主文檔:
(function($){
$.fn.lightOrDark = function(){
var r,b,g,hsp
, a = this.css('background-color');
if (a.match(/^rgb/)) {
a = a.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/);
r = a[1];
b = a[2];
g = a[3];
} else {
a = +("0x" + a.slice(1).replace(// thanks to jed : http://gist.github.com/983661
a.length < 5 && /./g, '$&$&'
)
);
r = a >> 16;
b = a >> 8 & 255;
g = a & 255;
}
hsp = Math.sqrt(// HSP equation from http://alienryderflex.com/hsp.html
0.299 * (r * r) +
0.587 * (g * g) +
0.114 * (b * b)
);
if (hsp>127.5) {
return 'light';
} else {
return 'dark';
}
}
})(jQuery);
var iframe = document.getElementById('my-iframe');
// Set here light/dark depending on container or whatever color
var theme = $('.container').lightOrDark();
var jsonMessage = {
'action' : 'set-theme',
'theme' : theme
};
iframe.contentWindow.postMessage(JSON.stringify(jsonMessage), '*');
I幀: https://jsfiddle.net/kristapsv/zLL9db1c/11/
var messageHandler = function (event) {
var message;
try {
message = JSON.parse(event.data);
} catch (e) {
return;
}
switch (message.action) {
case 'set-theme':
setTheme(message.theme);
break;
}
};
var setTheme = function(theme) {
$('.text-container')
.removeClass('dark')
.removeClass('light')
.addClass(theme);
}
window.addEventListener('message', messageHandler, false);
可以使用的postMessage API的2個窗口之間進行通信,或者設置裏面'IFRAME document.domain'以匹配外窗,並且可以與腳本訪問的iframe那方式 – charlietfl