chrome-plugin-demo/demo/js/content-script.js

171 lines
5.3 KiB
JavaScript
Raw Normal View History

2017-06-02 19:40:48 +08:00
console.log('这是content script!');
2017-06-16 18:54:57 +08:00
// 注意必须设置了run_at=document_start 此段代码才会生效
2017-06-02 19:40:48 +08:00
document.addEventListener('DOMContentLoaded', function()
{
2017-06-23 21:11:15 +08:00
// 注入自定义JS
injectCustomJs();
2017-06-02 19:40:48 +08:00
// 给谷歌搜索结果的超链接增加 _target="blank"
if(location.host == 'www.google.com.tw')
{
var objs = document.querySelectorAll('h3.r a');
for(var i=0; i<objs.length; i++)
{
objs[i].setAttribute('_target', 'blank');
}
console.log('已处理谷歌超链接!');
}
2017-06-16 18:54:57 +08:00
else if(location.host == 'www.baidu.com')
{
function fuckBaiduAD()
{
2017-06-23 21:11:15 +08:00
if(document.getElementById('my_custom_css')) return;
2017-06-16 18:54:57 +08:00
var temp = document.createElement('style');
temp.id = 'my_custom_css';
(document.head || document.body).appendChild(temp);
var css = `
/* 移除百度右侧广告 */
#content_right{display:none;}
/* 覆盖整个屏幕的相关推荐 */
.rrecom-btn-parent{display:none;}'
/* 难看的按钮 */
2017-06-23 21:11:15 +08:00
.result-op.xpath-log{display:none !important;}`;
2017-06-16 18:54:57 +08:00
temp.innerHTML = css;
console.log('已注入自定义CSS');
// 屏蔽百度推广信息
2017-07-10 22:36:59 +08:00
removeAdByJs();
// 这种必须用JS移除的广告一般会有延迟干脆每隔一段时间清楚一次
interval = setInterval(removeAdByJs, 2000);
2017-06-16 18:54:57 +08:00
// 重新搜索时页面不会刷新但是被注入的style会被移除所以需要重新执行
temp.addEventListener('DOMNodeRemoved', function(e)
{
console.log('自定义CSS被移除重新注入');
2017-07-10 22:36:59 +08:00
if(interval) clearInterval(interval);
2017-06-16 18:54:57 +08:00
fuckBaiduAD();
});
}
2017-07-10 22:36:59 +08:00
let interval = 0;
function removeAdByJs()
{
$('[data-tuiguang]').parents('[data-click]').remove();
}
2017-06-16 18:54:57 +08:00
fuckBaiduAD();
2017-06-23 21:11:15 +08:00
initCustomPanel();
initCustomEventListen();
2017-06-16 18:54:57 +08:00
}
2017-06-02 19:40:48 +08:00
});
2017-06-23 21:11:15 +08:00
function initCustomPanel()
{
var panel = document.createElement('div');
panel.className = 'chrome-plugin-demo-panel';
panel.innerHTML = `
<h2>injected-script操作content-script演示区</h2>
<div class="btn-area">
<a href="javascript:sendMessageToContentScriptByPostMessage('你好,我是普通页面!')">通过postMessage发送消息给content-script</a><br>
<a href="javascript:sendMessageToContentScriptByEvent('你好啊我是通过DOM事件发送的消息')">通过DOM事件发送消息给content-script</a><br>
<a href="javascript:invokeContentScript('sendMessageToBackground()')">发送消息到后台或者popup</a><br>
</div>
<div id="my_custom_log">
</div>
`;
document.body.appendChild(panel);
}
// 向页面注入JS
function injectCustomJs(jsPath)
{
jsPath = jsPath || 'js/inject.js';
var temp = document.createElement('script');
temp.setAttribute('type', 'text/javascript');
// 获得的地址类似chrome-extension://ihcokhadfjfchaeagdoclpnjdiokfakg/js/inject.js
temp.src = chrome.extension.getURL(jsPath);
temp.onload = function()
{
// 放在页面不好看,执行完后移除掉
this.parentNode.removeChild(this);
};
2017-07-10 22:36:59 +08:00
document.body.appendChild(temp);
2017-06-23 21:11:15 +08:00
}
// 接收来自后台的消息
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{
console.log('收到来自 ' + (sender.tab ? "content-script(" + sender.tab.url + ")" : "popup或者background") + ' 的消息:', request);
if(request.cmd == 'update_font_size') {
var ele = document.createElement('style');
ele.innerHTML = `* {font-size: ${request.size}px !important;}`;
document.head.appendChild(ele);
}
else {
tip(JSON.stringify(request));
sendResponse('我收到你的消息了:'+JSON.stringify(request));
}
});
// 主动发送消息给后台
// 要演示此功能请打开控制台主动执行sendMessageToBackground()
function sendMessageToBackground(message) {
chrome.runtime.sendMessage({greeting: message || '你好我是content-script呀我主动发消息给后台'}, function(response) {
tip('收到来自后台的回复:' + response);
});
}
// 监听长连接
chrome.runtime.onConnect.addListener(function(port) {
console.log(port);
if(port.name == 'test-connect') {
port.onMessage.addListener(function(msg) {
console.log('收到长连接消息:', msg);
tip('收到长连接消息:' + JSON.stringify(msg));
if(msg.question == '你是谁啊?') port.postMessage({answer: '我是你爸!'});
});
}
});
window.addEventListener("message", function(e)
{
console.log('收到消息:', e.data);
if(e.data && e.data.cmd == 'invoke') {
eval('('+e.data.code+')');
}
else if(e.data && e.data.cmd == 'message') {
tip(e.data.data);
}
}, false);
function initCustomEventListen() {
var hiddenDiv = document.getElementById('myCustomEventDiv');
if(!hiddenDiv) {
hiddenDiv = document.createElement('div');
hiddenDiv.style.display = 'none';
hiddenDiv.id = 'myCustomEventDiv';
document.body.appendChild(hiddenDiv);
}
hiddenDiv.addEventListener('myCustomEvent', function() {
var eventData = document.getElementById('myCustomEventDiv').innerText;
tip('收到自定义事件:' + eventData);
});
}
var tipCount = 0;
// 简单的消息通知
function tip(info) {
info = info || '';
var ele = document.createElement('div');
ele.className = 'chrome-plugin-simple-tip slideInLeft';
ele.style.top = tipCount * 70 + 20 + 'px';
ele.innerHTML = `<div>${info}</div>`;
document.body.appendChild(ele);
ele.classList.add('animated');
tipCount++;
setTimeout(() => {
ele.style.top = '-100px';
setTimeout(() => {
ele.remove();
tipCount--;
}, 400);
}, 3000);
}