金山毒霸和Chrome浏览器植入脚本导致网页报错
1 (function(win, undefined) {
var SELECTORS = transformSelector; function insertTemplate(callback) {
getTemplate('views/price-alert-messager.html', function(template) {
$(document.body).append(template).attr('data-ruyitao-price-mind-inserted', 1)
callback && callback()
})
} function getItemTemplate(item) {
var currentPrice = parseFloat(item.original_price) - parseFloat(item.reduction_price)
var html = '<li class="' + SELECTORS('pamb-message') + '" data-id=' + item.id +'>'
html += '<div class="' + SELECTORS('pamb-product-img') + '"><img src="' + item.small_image +'" /></div>'
html += '<div class="' + SELECTORS('pamb-product-info') + '">'
html += '<div class="' + SELECTORS('pamb-product-title') + '">' + item.title + '</div>'
html += '<div class="' + SELECTORS('pamb-current-price-wrap') + '"><span>已经降到了</span>'
html += '<span class="' + SELECTORS('pamb-current-price') + '">¥' + currentPrice.toFixed(2) + '</span></div>'
html += '<div class="' + SELECTORS('pamb-price-reduction-wrap') + '">降了¥' + item.reduction_price + '</div></div></li>'
return html
} function bindEvents() {
$('#' + SELECTORS('pamb-messages')).delegate('.' + SELECTORS('pamb-message') , 'click', function() {
var itemId = $(this).attr('data-id')
var url = 'http://ruyi.taobao.com/item/' + encodeURIComponent(itemId) + '?utm_medium=ext&utm_source=ruyi'
openTab(url, true)
}) $('#' + SELECTORS('pamb-close')).click(function() {
hide()
})
} function show() {
var $wrapper = $('#' + SELECTORS('pamb-wrapper'))
$wrapper.css('bottom', 0)
} function hide() {
var $wrapper = $('#' + SELECTORS('pamb-wrapper'))
var outerHeight = $wrapper.outerHeight()
$wrapper.css('bottom', -outerHeight + 'px')
} function clearUnreadPriceMindMessages() {
chrome.runtime.sendMessage({
topic: 'clear_unread_price_mind_messages'
})
} function render(messages) {
if (messages && messages.length > 0) {
var templateInserted = $(document.body).attr('data-ruyitao-price-mind-inserted') == 1
if (templateInserted) {
callback()
} else {
insertTemplate(callback)
}
} function callback() {
var html = ''
var i = 0
var len = messages.length
len = len < 3 ? len : 3
for (; i < len; i++) {
html += getItemTemplate(messages[i])
} $('#' + SELECTORS('pamb-messages')).html(html)
!templateInserted && bindEvents()
show()
clearUnreadPriceMindMessages()
}
} function replaceTemplateSelectors(html) {
return html.replace(/ruyitao-selector-prefix-([\w_-]+)/g, function() {
return transformSelector(arguments[1]);
});
} function getTemplate(pageName, callback) {
var self = this;
chrome.runtime.sendMessage({
topic: "get_template",
page: pageName
}, function (res) {
var template = replaceTemplateSelectors(res.template);
sanitizeHTML(template, function(sanitizedTemplate) {
callback(sanitizedTemplate);
})
});
} function sanitizeHTML (htmlString, callback) {
var rScript = /<script\b[\s\S]*?<\/script\s*>/g;
var rOnEvent = /\bon[A-z]+\s*=\s*['"]?[^>"]+['"]?/g;
var rHref = /href\s*=\s*['"]?\s*javascript:/g;
var result = htmlString.replace(rScript, '').replace(rOnEvent, ' ').replace(rHref, ' ');
callback(result)
} function openTab(url, select) {
select = select || false;
chrome.runtime.sendMessage({
topic: 'tab_open',
url: url,
selected: select
});
} var _selectors = {};
var _selectors_seen = {};
function generateRandomString() {
var rand_str = String.fromCharCode(Math.floor(Math.random() * 25 + 97)) +
Math.floor(Math.random() * 134217728).toString(36);
if ( typeof _selectors_seen[rand_str] != "undefined" ) {
return generateRandomString();
} else {
_selectors_seen[rand_str] = true;
return rand_str;
}
} function transformSelector(selector) {
// return 'ruyitao-' + selector;
if ( typeof _selectors[selector] != "undefined" ) {
return _selectors[selector];
}
// @if firefox
var prefix = 'ryt-';
// @else
var prefix = '';
// @endif
return _selectors[selector] = prefix + generateRandomString();
} chrome.runtime.onMessage.addListener(function(req, sender) {
Uncaught TypeError: Cannot read property 'onMessage' of undefined
switch (req.topic) {
case 'show_price_mind_messages':
render(req.messages)
break;
}
});
})(window);
近来做javascript开发,应该是做javascript平台维护,遇到很多莫名其妙的问题,脚本报错,刚开始以为是浏览器兼容性问题,后来试了很多方法,自身代码没问题,就是找不到原因,利用浏览器自带的调试工具,发现是软件在偷偷的干事情, 以上就是证据。
报错内容:Uncaught TypeError: Cannot read property 'onMessage' of undefined
类似的还有金山毒霸在网页中内嵌脚本,嵌入脚本都没关系,你不要导致别人的应用程序报错啊。因为毒霸植入的脚本导致ie浏览器下有兼容性问题而报错,对于开发和客户来说根本不知道是什么原因报错啊。找到原因之后,我亲自联系过毒霸开发人员交流,最后毒霸开发人员更新他们的内库后解决问题。通过此事还认识了一位c++高手,可惜他不懂网页,好几次问我javascript方面的东西,瞬间变成x牛了。
以下是毒霸内嵌脚本,留个记号:
<script defer="" type="text/javascript">
function getOffsetLeft(o)
{
var left=0;
while (o!=null && o!=document.body)
{
left+=o.offsetLeft;
o=o.offsetParent;
}
return left;
} function getOffsetTop(o)
{
var top=0;
while(o!=null && o!= document.body)
{
top+=o.offsetTop;
o=o.offsetParent;
}
return top;
} function GetUrlFromPos(x, y, dep, doc)
{
var xVarTemp = 0;
var yVarTemp = 0;
if (!doc) doc = document;
if (!dep) dep = 1;
if (dep == 4)
{
return "";
}
var ele = doc.elementFromPoint(x, y);
if (ele)
{
if (ele.nodeName == "A")
{
return ele.href;
}
if (ele.nodeName == "AREA")
{
return ele.href;
} if (ele.nodeName == "IFRAME" || ele.nodeName == "FRAME")
{
xVarTemp = x - getOffsetLeft(ele) + doc.body.scrollLeft + document.documentElement.scrollLeft;
yVarTemp = y - getOffsetTop(ele) + doc.body.scrollTop + document.documentElement.scrollTop;
if (x == xVarTemp && yVarTemp == y)
{
return "";
}
x = xVarTemp;
y = yVarTemp;
//alert(x + ' ' + getOffsetLeft(ele) + ' ' + doc.body.scrollLeft + document.documentElement.scrollLeft + ' ' + y + ' ' + getOffsetTop(ele) + ' ' + doc.body.scrollTop + document.documentElement.scrollTop)
return GetUrlFromPos(x, y, dep+1, ele.contentDocument || ele.contentWindow.document);
}
else
{
var p = ele.parentElement;
for (var i=0; i < 4; i++)
{
if (p && p.nodeName == "A")
{
return p.href;
}
if (p && p.nodeName == "AREA")
{
return p.href;
}
if ((p && p.parentElement))
{
p = p.parentElement;
}
else
{
break;
}
}
}
}
return "";
}
</script>
金山毒霸和Chrome浏览器植入脚本导致网页报错的更多相关文章
- 利用扩展双屏技术及Chrome浏览器,高速剖析优秀网页Div及CSS构成,并高效实现原型创作
作为一个Web前台设计人员,应该充分利用可利用的硬件条件及专业的软件工具,迅速进入到高效氛围其中.实践中,我们能够利用扩展桌面双屏技术及Chrome浏览器高速剖析优秀网页Div及CSS构成,并高速实现 ...
- Canvas引入跨域的图片导致toDataURL()报错的问题的解决
本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: [场景] 用户打开网页,则请求腾讯COS(图片服务器)上的图片js代码.使用canvas绘图. ...
- 使用PHP + Apache访问有错误的php脚本时不报错
遇到一个问题: 在命令行编辑php脚本后,直接使用php命令行执行该php脚本,如果脚本出现错误,在命令行的情况下会报错,显示错误信息,比如下面的情况. [root@localhost wwwroot ...
- LR调试脚本的时候报错Error -27796:(已解决)
LR调试bbs脚本的时候报错: 1.Error -27796: Failed to connect to server "192.168.211.128:80": [10060] ...
- 两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错
遇到了两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错 首先第一个: 在做一个用ajax图片上传的功能中,php报了这样一个错误:File upload error - u ...
- MyEclipse中“擅自乱改”项目名导致项目报错的处理
最近几天培训的过程中,经常有同学手一抖,默默的修改了本来配置部署好的项目名,导致项目报错…… 遇到这种事情,我一般会做的处理就是重新新建项目,然后把包和各种文件ctrl+c ctrl+v,遇到项目小还 ...
- import提升导致Fundebug报错:“请配置apikey”
摘要: 解释一下"请配置apikey"报错的原因. 部分Fundebug用户使用import来导入js文件时,出现了"请配置apikey"的报错,这是由于imp ...
- android手机访问app网页报错:net::ERR_PROXY_CONNECTION_FAILED
手机访问网页报错:net::ERR_PROXY_CONNECTION_FAILED 手机访问app中嵌入的html网页报错: net::ERR_PROXY_CONNECTION_FAILED 原来是手 ...
- 解决在Vue项目中时常因为代码缩进导致页面报错的问题
前言 如果我们初次使用vue-cli来构建单页SPA应用,在撸代码的过程中有可能会遇到这种因为代码缩进导致 页面报错的问题,导致我们烦不胜烦.接下来我们就来看一看如何解决这个小问题... erro原因 ...
随机推荐
- easyui使用datagrid时列名包含特殊字符导致表头与数据错位的问题
做一个用easyui的datagrid显示数据的功能时发现表格的列头与数据错位了,而且这个现象不总是能重现,一直没搞清楚原因.后来偶然在控制台看出了一点端倪: 推测表头或者单元格的class名应该是用 ...
- POJ 2492 A Bug's Life
传送门:A Bug's Life Description Background Professor Hopper is researching the sexual behavior of a rar ...
- AngularJs Angular数据类型判断
angular.isArray 判断括号内的值是否为数组. 格式:angular.isArray(value); value: 被判断是否为数组的值. ------------------------ ...
- PhyLab2.0需求与功能分析改进文档(NABCD)
PhyLab1.0需求规格说明文档 1. 概述 1.1 项目概述 软剑攻城队小组于2015学年开发了PhyLab物理实验网站,一经发布好评如潮.网站的核心功能是提供预习报告和自动数据处理,而后加入了论 ...
- python 培训之 装饰器
1. 高阶函数 接收 函数作为参数,返回函数. 2. 函数闭包 3. 接收一个函数为参数,对其进行包装,然后返回一个包装函数(tip:包装函数中调用并返回参数函数. #! /usr/env/pytho ...
- CSS3-box盒布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 面向服务架构(SOA)和企业服务总线(ESB)
http://www.cnblogs.com/shanyou/archive/2008/04/19/1161452.html 学习和研究在企业中实施面向服务架构(SOA),简单回顾SOA和ESB,重点 ...
- Spring 通过maven pom文件配置初始化
spring对bean的生命周期管理的比较精细,并不是单纯的new()实例化. 1,找到class配置信息并将其实例化 2,受用依赖注入,按照配置信息,配置bean的所有属性; 在一个开始使用前可以用 ...
- 10月16日上午MySQL数据库作业设计表解析
作业设计表:多张表存储学生成绩及各种信息 需要从表里面体现: 关于学生的:代号 姓名 性别 年龄 班级 关于课程的:代号 名称 关于老师的:代号 姓名 关于成绩的:例如:闫超--网页--90 要能查看 ...
- linq按条件sum
var result = fruit.GroupBy(i => i.date) .Select(i => new { date = i.Key, no_of_apple = i.Where ...