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

171 lines
5.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

console.log('这是content script!');
// 注意必须设置了run_at=document_start 此段代码才会生效
document.addEventListener('DOMContentLoaded', function()
{
// 注入自定义JS
injectCustomJs();
// 给谷歌搜索结果的超链接增加 _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('已处理谷歌超链接!');
}
else if(location.host == 'www.baidu.com')
{
function fuckBaiduAD()
{
if(document.getElementById('my_custom_css')) return;
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;}'
/* 难看的按钮 */
.result-op.xpath-log{display:none !important;}`;
temp.innerHTML = css;
console.log('已注入自定义CSS');
// 屏蔽百度推广信息
removeAdByJs();
// 这种必须用JS移除的广告一般会有延迟干脆每隔一段时间清楚一次
interval = setInterval(removeAdByJs, 2000);
// 重新搜索时页面不会刷新但是被注入的style会被移除所以需要重新执行
temp.addEventListener('DOMNodeRemoved', function(e)
{
console.log('自定义CSS被移除重新注入');
if(interval) clearInterval(interval);
fuckBaiduAD();
});
}
let interval = 0;
function removeAdByJs()
{
$('[data-tuiguang]').parents('[data-click]').remove();
}
fuckBaiduAD();
initCustomPanel();
initCustomEventListen();
}
});
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);
};
document.body.appendChild(temp);
}
// 接收来自后台的消息
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);
}