怎么解决chrome拦截下载的 加载不安全脚本 拦截问题

前言:此文章仅是个人工作中遇到问题后的一些记录和总结,可能毫无意义。。
事件回顾:
在开发中,PM要求在一个页面中输入多个链接然后可以一键在新窗口打开,所以就想到用window.open来实现,但是测试的时候发现会被拦截
关于window.open的用户很多前辈都有写过相关文章,就不在这里介绍了,
针对不同的浏览器做了以下测试
1.用户点击事件内,触发打开一个新窗口
用户点击事件触发新窗口是例如:
obj.onclick=function(){
window.open(url);
通过用户事件触发的新窗口打开,这种形式打开新窗口浏览器会认为是用户自己需要的,大多浏览器是不会拦截的
目前测试的几个用户事件,只有click和dbclick是浏览器不会拦截的
窗口拦截不只是跟浏览器内核有关,所以对原生IE和几个常见IE内核的浏览器都有做测试
事件:click,dbclick
不拦截的浏览器有:Chrome,FF,IE 6.0-10.0,Safari,Opera,360浏览器
拦截:搜狗浏览器
事件:mouseover,mousemove,mouseout,scroll等等
不拦截:无
拦截:Chrome,FF,IE 6.0-10.0,Safari,Opera,360浏览器
2.用户点击事件内,触发打开多个新窗口
点击一次成功打开多个窗口的浏览器:FF,360浏览器,Safari
点击一次打开第一个窗口,后面的窗口拦截的浏览器:Chrome,IE 6.0-10.0,Opera
3.Javascript自动触发打开窗口
setTimeout(function(){ window.open('')},1000)
或者ajax请求成功后执行
$obj.click(function(){
sucss:function(data){
&window.open('')
拦截的浏览器:测试的几个浏览器都拦截
解决方案:
1.对于ajax返回后在打开新窗口,可以在用户点击后就打开一个空白窗口,然后再返回成功后给空白窗口一个url,这样就不会被拦截了
$obj.click(function(){
var newTab=window.open('about:blank');
sucss:function(data){
&//window.open('');
newTab.location.href="";
2.脚本自行触发打开的新窗口
看网上很多说新建a标签,模拟点击,经测试,无效,请大牛指导
前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢?分析:
浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限制),即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截。解决方法:
1、异步改为同步,即:async:false
2、将新开窗口指向为一个对象,然后修改对象的 url,比如:
$('.task').bind('click',function(){
var w = window.open();
type: 'POST',
url: '/surveyTask',
dataType: 'json',
error: function(){
w.close();
success: function(res){
w.location = res.
最后需要说明的是:网上的动态添加 form 新开窗口的方法,并不适合 ajax 请求,至少博主测试了下仍然被浏览器所拦截。
阅读(...) 评论()> 恐空控的博客详情
摘要: JS动态加载脚本及对动态脚本内方法的调用
&&&&&&&&首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在里面写一个方法functionOne,很简单,代码如下:
function&functionOne(){
&&&&alert("成功加载");
&&&&&&&&后面的html文件都创建在同一个目录下。
方法一:直接document.write
  在同一个文件夹下面创建一个function1.html,代码如下:
&&&&&title&动态加载js&/title&
&&&&&meta&http-equiv="Content-Type"&content="text/charset=UTF-8"&
&&&&&script&type="text/javascript"&
&&&&&&&&function&init()
&&&&&&&&&&&&//加载js脚本
&&&&&&&&&&&&document.write("&script&src='package.js'&&\/script&");
&&&&&&&&&&&&//加载一个按钮
&&&&&&&&&&&&document.write("&input&type=\"button\"&value=\"测试运行效果\"&onclick=\"operation()\"\/&");
&&&&&&&&&&&&//如果马上使用会找不到,因为还没有加载进来,此处会报错
&&&&&&&&&&&&functionOne();
&&&&&&&&function&operation()
&&&&&&&&&&&&//可以运行,显示“成功加载”
&&&&&&&&&&&&functionOne();
&&&&&/script&
&&&&&input&type="button"&value="初始化加载"&onclick="init()"/&
&&&&&&&&通过document.write的方式可以往页面写入脚本,如代码所示,点击按钮“初始化加载”后可以加载package.js文件,但是立即运行里面的方法functionOne会找不到此方法,报告错误,而点击第二个按钮(通过document.write动态创建的“测试运行效果”)发现可以执行,此时脚本已经加载完毕了。由于这种方式是异步加载(一边继续执行后面的代码,一边额外开一个线程执行需要加载的脚本),并且document.write会重写界面,明显不实用。
方法二:动态改变已有script的src属性
  在同一个文件夹下面创建一个function2.html,代码如下:
&&&&&title&动态加载js&/title&
&&&&&meta&http-equiv="Content-Type"&content="text/charset=UTF-8"&
&&&&&script&type="text/javascript"&id="yy"&src=""&&/script&
&&&&&script&type="text/javascript"&
&&&&&&&&function&init()
&&&&&&&&&&&&yy.src&=&"package.js";
&&&&&&&&&&&&//如果马上使用会找不到,因为还没有加载进来,此处会报错
&&&&&&&&&&&&functionOne();
&&&&&&&&function&operation()
&&&&&&&&&&&&//可以运行,显示“成功加载”
&&&&&&&&&&&&functionOne();
&&&&&/script&
&&&&&input&type="button"&value="测试按钮"&onclick="init()"/&
&&&&&input&type="button"&value="测试运行效果"&onclick="operation()"/&
&&&&&&&&此种方法的好处在于不会改变界面元素,不至于重写界面元素,但是同样是异步加载,会有同样的问题。
方法三:动态创建script元素(异步)
  在同一个文件夹下面创建一个function3.html,代码如下:
&&&&&title&动态加载js&/title&
&&&&&meta&http-equiv="Content-Type"&content="text/charset=UTF-8"&
&&&&&script&type="text/javascript"&
&&&&&&&&function&init()
&&&&&&&&&&&&var&myScript=&document.createElement("script");
&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&myScript.src="package.js";
&&&&&&&&&&&&document.body.appendChild(myScript);
&&&&&&&&&&&&//如果马上使用会找不到,因为还没有加载进来
&&&&&&&&&&&&functionOne();
&&&&&&&&function&operation()
&&&&&&&&&&&&//可以运行,显示“成功加载”
&&&&&&&&&&&&functionOne();
&&&&&/script&
&&&&&input&type="button"&value="测试按钮"&onclick="init()"/&
&&&&&input&type="button"&value="测试运行效果"&onclick="operation()"/&
&&&&&&&&此办法的优势相对于第二种而言就是不需要最开始就在界面写一个script标签,缺点还是异步加载,存在同样的问题。
  这三种方法都是异步执行的,所以在加载这些脚本的同时,主页面的脚本继续运行,如果用以上的方法,那下面的代码将得不到预期的效果。
  不过可以在functionOne前面加一个alert就可以堵塞一下主页面脚本的运行,然后你发现functionOne就可以运行了,或者你的后期代码需要在另一个按钮下执行,一步一步的来,要不就定义一个计时器,在固定时间后再执行后面的代码,不过在项目里面肯定不可能使用这些方法。
  其实第三种方法改一点就变成同步加载了。
方法四:动态创建script元素(同步)
  在同一个文件夹下面创建一个function4.html,代码如下:
&&&&&title&动态加载js&/title&
&&&&&meta&http-equiv="Content-Type"&content="text/charset=UTF-8"&
&&&&&script&type="text/javascript"&
&&&&&&&&function&init()
&&&&&&&&&&&&var&myScript=&document.createElement("script");
&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&myScript.appendChild(document.createTextNode("function&functionOne(){alert(\"成功运行\");&}"));
&&&&&&&&&&&&document.body.appendChild(myScript);
&&&&&&&&&&&&//此处发现可以运行
&&&&&&&&&&&&functionOne();
&&&&&/script&
&&&&&input&type="button"&value="测试按钮"&onclick="init()"/&
&&&&&&&&此方法并没有加载外部的js文件,而是给myScript添加了子项。在Firefox、Safari、Chrome、Opera和IE9中,这些代码可以正常运行。但是在IE8以及以下的版本中会导致错误。IE将&script&视为一个特殊的元素,不允许DOM访问其子节点。不过可以用&script&元素的text属性来制定js代码,想下面的例子这样:
var&myScript=&document.createElement("script");
&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&myScript.text&=&"function&functionOne(){alert(\"成功运行\");&}";
&&&&&&&&&&&&document.body.appendChild(myScript);
&&&&&&&&&&&&//此处可以运行
&&&&&&&&&&&&functionOne();
&&&&&&&&经过这样修改之后的代码可以在IE、Firefox、Opera和Safari3及之后版本中运行。Safari3.0之前的版本虽然不能正确地支持text属性,但却允许使用文本节点技术来指定代码。如果需要兼容早期版本的Safari,可以使用下面代码:
var&myScript=&document.createElement("script");
&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&var&code&=&"function&functionOne(){alert(\"成功运行\");&}";
&&&&&&&&&&&&try{
&&&&&&&&&&&&&&&&myScript.appendChild(document.createTextNode(code));
&&&&&&&&&&&&}
&&&&&&&&&&&&catch&(ex){
&&&&&&&&&&&&&&&&myScript.text&=&
&&&&&&&&&&&&}
&&&&&&&&&&&&document.body.appendChild(myScript);
&&&&&&&&&&&&//此处发现可以运行
&&&&&&&&&&&&functionOne();
这里,首先尝试标准的DOM文本节点方法,因为除了IE8以及以下,所有浏览器都支持这种方式。如果这行代码抛出了错误,那么说明是IE8以及以下,于是就必须使用text属性了。整个过程可以用以下函数来表示:
function&loadScriptString(code)
&&&&&&&&&&&&var&myScript=&document.createElement("script");
&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&try{
&&&&&&&&&&&&&&&&myScript.appendChild(document.createTextNode(code));
&&&&&&&&&&&&}
&&&&&&&&&&&&catch&(ex){
&&&&&&&&&&&&&&&&myScript.text&=&
&&&&&&&&&&&&}
&&&&&&&&&&&&document.body.appendChild(myScript);
&&&&&&&&然后你可以在其他地方使用此方法来加载需要使用的代码。实际上,这样执行代码与在全局作用于中把相同字符串传递给eval()是一样的。但是我们这里只能使用字符串形式的代码,也有局限性,用户一般希望提供的方法形如loadScriptAddress("package.js")的方式,所以我们还需要继续讨论。
方法五:XMLHttpRequest/ActiveXObject异步加载
  在同一个文件夹下面创建一个function5.html,代码如下:
&&&&&title&动态加载js&/title&
&&&&&meta&http-equiv="Content-Type"&content="text/charset=UTF-8"&
&&&&&script&type="text/javascript"&
&&&&&&&&function&init()
&&&&&&&&&&&&//加载package.js文件,设置script的id为yy
&&&&&&&&&&&&ajaxPage("yy","package.js");
&&&&&&&&&&&&//此方法为package.js里面的方法,此处执行方法成功
&&&&&&&&&&&&functionOne();
&&&&&&&&function&ajaxPage(sId,url)
&&&&&&&&&&&&var&oXmlHttp&=&getHttpRequest();
&&&&&&&&&&&&oXmlHttp.onreadystatechange&=&function()
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&//4代表数据发送完毕
&&&&&&&&&&&&&&&&if&(&oXmlHttp.readyState&==&4&)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&//0为访问的本地,200代表访问服务器成功,304代表没做修改访问的是缓存
&&&&&&&&&&&&&&&&&&&&if(oXmlHttp.status&==&200&||&oXmlHttp.status&==&0&||&oXmlHttp.status&==&304)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&includeJS(sId,oXmlHttp.responseText);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&oXmlHttp.open("GET",url,true);//true为异步加载(即在发送ajax的同时可运行其他代码)false为//同步加载(加载的同时不能执行其他代码);
&&&&&&&&&&&&oXmlHttp.send(null);
&&&&&&&&function&getHttpRequest()
&&&&&&&&&&&&if(window.ActiveXObject)//IE
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&new&ActiveXObject("MsXml2.XmlHttp");
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if(window.XMLHttpRequest)//其他
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&new&XMLHttpRequest();
&&&&&&&&&&&&}
&&&&&&&&function&includeJS(sId,source)
&&&&&&&&&&&&if((source&!=&null)&&(!document.getElementById(sId)))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&var&myHead&=&document.getElementsByTagName("HEAD").item(0);
&&&&&&&&&&&&&&&&var&myScript&=&document.createElement(&"script"&);
&&&&&&&&&&&&&&&&myScript.language&=&"javascript";
&&&&&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&&&&&myScript.id&=&sId;
&&&&&&&&&&&&&&&&try{
&&&&&&&&&&&&&&&&&&&&myScript.appendChild(document.createTextNode(source));
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&catch&(ex){
&&&&&&&&&&&&&&&&&&&&myScript.text&=&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&myHead.appendChild(&myScript&);
&&&&&&&&&&&&}
&&&&&/script&
&&&&&input&type="button"&value="测试按钮"&onclick="init()"/&
&&&&&&&&ActiveXObject只有IE里面才有,其他浏览器大部分支持XMLHttpRequest,通过此办法我们可以实现动态加载脚本了,不过是异步加载,也没法运行functionOne,第二次就可以运行了,但是可惜的是在IE、Firefox、Safari下可以运行,在Opera、Chrome下会出错,Chrome下的错误如下:
&&&&&&&&不过只要发布之后在Chrome和Opera下就不会出现错误了。
  其实这里把open里面设置为false就是同步加载了,同步加载不需要设置onreadystatechange事件。
方法六:XMLHttpRequest/ActiveXObject同步加载  
  在这里我把一些情况考虑在内,写成了一个方法,封装为loadJS.js,方便以后直接调用,代码如下:
&*&同步加载js脚本
&*&@param&id&&&需要设置的&script&标签的id
&*&@param&url&&&js文件的相对路径或绝对路径
&*&@return&{Boolean}&&&返回是否加载成功,true代表成功,false代表失败
function&loadJS(id,url){
&&&&var&&xmlHttp&=&
&&&&if(window.ActiveXObject)//IE
&&&&&&&&try&{
&&&&&&&&&&&&//IE6以及以后版本中可以使用
&&&&&&&&&&&&xmlHttp&=&new&ActiveXObject("Msxml2.XMLHTTP");
&&&&&&&&catch&(e)&{
&&&&&&&&&&&&//IE5.5以及以后版本可以使用
&&&&&&&&&&&&xmlHttp&=&new&ActiveXObject("Microsoft.XMLHTTP");
&&&&else&if(window.XMLHttpRequest)//Firefox,Opera&8.0+,Safari,Chrome
&&&&&&&&xmlHttp&=&new&XMLHttpRequest();
&&&&//采用同步加载
&&&&xmlHttp.open("GET",url,false);
&&&&//发送同步请求,如果浏览器为Chrome或Opera,必须发布后才能运行,不然会报错
&&&&xmlHttp.send(null);
&&&&//4代表数据发送完毕
&&&&if&(&xmlHttp.readyState&==&4&)
&&&&&&&&//0为访问的本地,200到300代表访问服务器成功,304代表没做修改访问的是缓存
&&&&&&&&if((xmlHttp.status&&=&200&&&&xmlHttp.status&&300)&||&xmlHttp.status&==&0&||&xmlHttp.status&==&304)
&&&&&&&&&&&&var&myHead&=&document.getElementsByTagName("HEAD").item(0);
&&&&&&&&&&&&var&myScript&=&document.createElement(&"script"&);
&&&&&&&&&&&&myScript.language&=&"javascript";
&&&&&&&&&&&&myScript.type&=&"text/javascript";
&&&&&&&&&&&&myScript.id&=&
&&&&&&&&&&&&try{
&&&&&&&&&&&&&&&&//IE8以及以下不支持这种方式,需要通过text属性来设置
&&&&&&&&&&&&&&&&myScript.appendChild(document.createTextNode(xmlHttp.responseText));
&&&&&&&&&&&&}
&&&&&&&&&&&&catch&(ex){
&&&&&&&&&&&&&&&&myScript.text&=&xmlHttp.responseT
&&&&&&&&&&&&}
&&&&&&&&&&&&myHead.appendChild(&myScript&);
&&&&&&&&&&&&return&
&&&&&&&&else
&&&&&&&&&&&&return&
&&&&&&&&return&
&&&&&&&&此处考虑到了浏览器的兼容性以及当为Chrome、Opera时必须是发布,注释还是写的比较清楚的,以后需要加载某个js文件时,只需要一句话就行了,如loadJS("myJS","package.js")。方便实用。
  如果想要实现不发布还非要兼容所有浏览器,至少我还没找出这样的同步加载的办法,我们只能通过异步加载开出回调函数来实现。
方法七:回调函数方式
  在同一个文件夹下面创建一个function7.html,代码如下:
&&&&&title&动态加载js&/title&
&&&&&meta&http-equiv="Content-Type"&content="text/charset=UTF-8"&
&&&&&script&type="text/javascript"&
&&&&&&&&function&init()
&&&&&&&&&&&&//加载package.js文件,设置script的id为yy
&&&&&&&&&&&&loadJs("yy","package.js",callbackFunction);
&&&&&&&&function&callbackFunction()
&&&&&&&&&&&&functionOne();
&&&&&&&&function&loadJs(sid,jsurl,callback){
&&&&&&&&&&&&var&nodeHead&=&document.getElementsByTagName('head')[0];
&&&&&&&&&&&&var&nodeScript&=&
&&&&&&&&&&&&if(document.getElementById(sid)&==&null){
&&&&&&&&&&&&&&&&nodeScript&=&document.createElement('script');
&&&&&&&&&&&&&&&&nodeScript.setAttribute('type',&'text/javascript');
&&&&&&&&&&&&&&&&nodeScript.setAttribute('src',&jsurl);
&&&&&&&&&&&&&&&&nodeScript.setAttribute('id',sid);
&&&&&&&&&&&&&&&&if&(callback&!=&null)&{
&&&&&&&&&&&&&&&&&&&&nodeScript.onload&=&nodeScript.onreadystatechange&=&function(){
&&&&&&&&&&&&&&&&&&&&&&&&if&(nodeScript.ready)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&if&(!nodeScript.readyState&||&nodeScript.readyState&==&"loaded"&||&nodeScript.readyState&==&'complete')&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&nodeScript.ready&=&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&callback();
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&nodeHead.appendChild(nodeScript);
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&if(callback&!=&null){
&&&&&&&&&&&&&&&&&&&&callback();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&/script&
&&&&&input&type="button"&value="测试按钮"&onclick="init()"/&
&&&&&&&&这种方式所有浏览器都支持,但是后面的代码必须放在回调函数里面,也就是异步加载了。看需求使用吧。
人打赏支持
码字总数 7160
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区查看: 1876|回复: 6
暂时解决chrome33以上版本阻止本地安装扩展脚本的方法
从33beta开始就有朋友反映不能本地安装扩展脚本的问题
当时试用了一下是可以解决的,今天再试用了一下最新的dev离线包
_130010.jpg (123.55 KB, 下载次数: 0)
13:21 上传
_130029.jpg (82.59 KB, 下载次数: 0)
13:21 上传
同样可以,说明方法短期内是可行的,就是把离线包制作成便携版,简单的方法如下
版区有你更精彩: )
非常感谢啊!
_一方通行、
等到 33 稳定版 才实行这政策
有些复杂呢。
用开发者模式调试总该可以用吧
我的方法是,将扩展解压到一个文件夹中,然后——开发者模式——加载正在开发的扩展程序...——选定文件夹,即可 。
缺点是每次启动浏览器是都会有一个提醒,告诉你别使用正在开发的扩展(可无视)。
Copyright & KaFan & All Rights Reserved.
Powered by Discuz! X3.1( 苏ICP备号 ) GMT+8, 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
怎样解除浏览器已经阻止此站点用不安全方式使用ActiveX控件
下载积分:1000
内容提示:怎样解除浏览器已经阻止此站点用不安全方式使用ActiveX控件
文档格式:DOC|
浏览次数:901|
上传日期: 11:17:04|
文档星级:
该用户还上传了这些文档
怎样解除浏览器已经阻止此站点用不安全方式使用ActiveX控件
官方公共微信}

我要回帖

更多关于 chrome 广告拦截 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信