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浏览器植入脚本导致网页报错的更多相关文章

  1. 利用扩展双屏技术及Chrome浏览器,高速剖析优秀网页Div及CSS构成,并高效实现原型创作

    作为一个Web前台设计人员,应该充分利用可利用的硬件条件及专业的软件工具,迅速进入到高效氛围其中.实践中,我们能够利用扩展桌面双屏技术及Chrome浏览器高速剖析优秀网页Div及CSS构成,并高速实现 ...

  2. Canvas引入跨域的图片导致toDataURL()报错的问题的解决

    本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: [场景] 用户打开网页,则请求腾讯COS(图片服务器)上的图片js代码.使用canvas绘图. ...

  3. 使用PHP + Apache访问有错误的php脚本时不报错

    遇到一个问题: 在命令行编辑php脚本后,直接使用php命令行执行该php脚本,如果脚本出现错误,在命令行的情况下会报错,显示错误信息,比如下面的情况. [root@localhost wwwroot ...

  4. LR调试脚本的时候报错Error -27796:(已解决)

    LR调试bbs脚本的时候报错: 1.Error -27796: Failed to connect to server "192.168.211.128:80": [10060] ...

  5. 两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错

    遇到了两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错 首先第一个: 在做一个用ajax图片上传的功能中,php报了这样一个错误:File upload error - u ...

  6. MyEclipse中“擅自乱改”项目名导致项目报错的处理

    最近几天培训的过程中,经常有同学手一抖,默默的修改了本来配置部署好的项目名,导致项目报错…… 遇到这种事情,我一般会做的处理就是重新新建项目,然后把包和各种文件ctrl+c ctrl+v,遇到项目小还 ...

  7. import提升导致Fundebug报错:“请配置apikey”

    摘要: 解释一下"请配置apikey"报错的原因. 部分Fundebug用户使用import来导入js文件时,出现了"请配置apikey"的报错,这是由于imp ...

  8. android手机访问app网页报错:net::ERR_PROXY_CONNECTION_FAILED

    手机访问网页报错:net::ERR_PROXY_CONNECTION_FAILED 手机访问app中嵌入的html网页报错: net::ERR_PROXY_CONNECTION_FAILED 原来是手 ...

  9. 解决在Vue项目中时常因为代码缩进导致页面报错的问题

    前言 如果我们初次使用vue-cli来构建单页SPA应用,在撸代码的过程中有可能会遇到这种因为代码缩进导致 页面报错的问题,导致我们烦不胜烦.接下来我们就来看一看如何解决这个小问题... erro原因 ...

随机推荐

  1. Centos7更新firefox

    1.用你本地的旧版 firefox,访问http://www.firefox.com.cn,下载Linux版本的Firefox. 2.进入存放下载文件(Firefox-latest-x86_64.ta ...

  2. AngularJs $rootScope.Scope 作用域操作

    这里讲的是一些scope的操作,如创建/注销/各种监听及scope间的通信等等. $rootScope.Scope 可以使用$injector通过$rootScope关键字检索的一个根作用域. 可以通 ...

  3. python dict.get()和dict['key']的区别

    先看代码: In [1]: a = {'name': 'wang'} In [2]: a.get('age') In [3]: a['age'] --------------------------- ...

  4. 旅图——UI测试

    测试目标 保证代码质量,确保基础功能的实现,可以有效地保证代码的可靠性,让模块在与别的模块整合时出现更少的错误,减少最终测试时查找困难无方向. UI测试 登录过程 模拟登录过程,密码正确与密码错误的情 ...

  5. 先贴上代码:Random快排,快排的非递归实现

    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为主元,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是, ...

  6. restClient访问SSL

    IRestClient client = new RestClient("https://xxx.com/aa/bb"); "; ); ServicePointManag ...

  7. windows7-PowerDesigner 15.1 的安装图解

    下载 PowerDesigner 15.1 的安装文件和破解文件 破解文件下载地址:http://pan.baidu.com/share/link?shareid=177873&uk=3626 ...

  8. JavaWeb学习笔记——XML和SAX解析区别

  9. JavaScript排序算法——冒泡排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Object Graph Serialization

    http://coding-time.blogspot.com/2008/03/serialize-object-graph-to-xml-in-net.html http://trycatch.me ...