一次解决页面特效问题的排查记录

简介: 大家在做项目的时候,肯定会和我一样,碰到各种各样的问题,然后熟练的打开搜索引擎,输入些关键字,开始解决问题。最近在做一个效果,中间就碰到了各种问题,接下来我把解决这个问题的过程发出来分享下,也算是我的一个小心得。要做的效果其实很简单,就是在做支付的时候,出现一个弹出层,然后跳到一张新页面,类似于下面两张图片的效果:

大家在做项目的时候,肯定会和我一样,碰到各种各样的问题,然后熟练的打开搜索引擎,输入些关键字,开始解决问题。最近在做一个效果,中间就碰到了各种问题,接下来我把解决这个问题的过程发出来分享下,也算是我的一个小心得。

要做的效果其实很简单,就是在做支付的时候,出现一个弹出层,然后跳到一张新页面,类似于下面两张图片的效果:


页面一 页面二

这里面就是两个技术点,一个是弹出层的实现,另外一个就是通过脚本弹出一个新页面。出现弹出层这个很好解决,我使用了一个方便的插件artDialog。第二个问题弹出一个新页面,花了点时间,后面用的实现技术是非常简单的,但中间就是发生了很多波折。心情也像过山车一样跌宕起伏.......

这个效果,我本来实现的方式是发送一个ajax请求,然后返回请求,最后在回调函数中跳转新页面和弹出提示层。

 

一、使用location.href实现



这是我最先想到的,然后自己YY了一下,给location加了个target属性,以为这样就能弹出新页面了,实在太无知啦,毫无效果,还是在当前页面跳转。这里就暴露了我解决新问题,总是喜欢从自己用过的技术着手,总是想把那些技术嫁接过来,拼上去,有点碰运气的感觉。发现失败了,就立刻打开搜索引擎,输入最直接的关键字。

 

二、搜索JS弹出新窗口



输入这个最直接的关键字,搜索引擎也没让我失望,一下子出现了好多的相关资料,我一般比较喜欢打开个人博客,个人博客的排版很整齐,像那个脚本之家的排版实在是乱。



image.png


有多个解决方案,我选了一个大家说的最多的方法,使用window.open(),这个的确很简单,只要把url地址作为参数放进去后就行,但是用了浏览器会阻止这个页面弹出,如下图:


image.png

 


这个东西如果给用户看的话,一定会引起恐慌啦,一般只有弹出垃圾页面或广告等信息的时候会出现,用户肯定会习惯性的认为你这里有蹊跷。接下来我就根据window.open来搜索了,想从这里找到个突破口。

 

三、搜索js window.open 不拦截


方法一:先弹出一个空页面,然后再用location.href,实践证明不可行。


var d=window.open();
d.location = 'http://www.cnblogs.com/strick';


方法二:利用浏览器的冒泡事件,这个方法高大上,但是我水平太菜了,不会用,后面还查到了一个差不多的方法,里面稍微有点修改,本来以为那个方法可以解除我的烦恼,但最终还是失败了,在执行到window.open的时候还是出现了阻止


clickOpenWin: function(f){
    var dataKey = "clickOpenWin.dataKey"
    var me = $(this);
    var A = me.data(dataKey);
    var returnData = null;
    if(!A){
        A = $("");
        me.data(dataKey, A);
        A.click(function(e){
            if(returnData){
                A.attr("href", returnData);
            }else {
                A.before(me);
                e.stop();
            }
        });
    }
    me.mouseover(function(){$(this).before(A).appendTo(A);});
    me.mouseout(function(){A.before($(this));});
    me.click(function(){
        A.attr("href", "#|");
        returnData = f.apply(this, arguments);
    });


经过这一连串的失败,我就想到一个问题,为什么页面上面用鼠标点击弹出新页面不会阻止,而用脚本弹出就会被限制呢?

 

四、搜索js模拟鼠标点击



想到动态添加一个a标签,用a标签来模拟打开新页面,柳暗花明又一村的感觉,而且实现方式也很简单


var openLink = $("a");
openLink.attr('href', 'http://www.cnblogs.com/strick/');
openLink.attr('target', '_blank');
openLink[0].click();

但是还是出现了很不受欢迎的拦截提示,作死的节奏。


image.png


继续搜索,发现有人用纯JS的语法来写,这个时候马上就怀疑自己是不是因为用了jQuery与动态生成的原因,有时候就是会因为一个小细节导致错误的,我马上就急冲冲的修改代码,在页面中加上a标签,然后用脚本click一下,依然是那个问题,唉


<a target="_blank" href="http://www.cnblogs.com/strick" id="myLink"></a>
<script language="text/javascript">
function AutoClick()
{
    var myLink = document.getElementById("myLink");
    myLink.click();
}
</script>


五、想利用弹出层来做跳转



这个我后面想了下,的确能做到在弹出层里面跳转,但是平时看到的那些效果完全感觉不出来是用弹出层的,更不会是用iframe来做的效果,否决了这个方案

 

六、搜索jquery 广告强制弹出窗口



平时浏览网站的时候,有些流氓页面还是会被弹出来,莫非有什么强力方法可以做到吗?

顺着这个思路去搜索,查到了一个相关代码,如下:


function windowOpen(){
     var a = document.createElement("a");
     a.setAttribute("href", url);
     if(target == null){
         target = '';
     }
     a.setAttribute("target", target);
     document.body.appendChild(a);
     if(a.click){
         a.click();
     }else{
         try{
             var evt = document.createEvent('Event');
             a.initEvent('click', true, true);
             a.dispatchEvent(evt);
         }catch(e){
             window.open(url);
         }
     }
     document.body.removeChild(a);
 }


从外形看,这个代码挺高大上的,看了下后,发现其实还是在用模拟a标签以及window.open的方法,一下子就感觉希望不大,还是抱着试试的态度操作了下,果不出所料

中图还看到一个用form方法弹出的方式:


<form id="form" action="http://www.cnblogs.com/strick" method="get" target="_blank">  
</form>
<script language="text/javascript">
function AutoClick()
{
    document.getElementById("EmailForm").submit();
}
</script>


这个方法倒挺像那么一回事的,有感觉,有预感能行,然后马上实验下,额,还是万恶的弹出层。

一直折腾到了吃晚饭的时候,吃饭的时候就在想,其他网站到底是什么高级的方法来实现的呢!!!突然想到可以去扣一下有这个效果的网站脚本,看看是怎么实现的。我这种扣脚本的事经常干,而且非常有效,经常会有很多意外收获,这次也不例外。

 

七、从实现这个效果的网站上扣脚本代码



用firebug查看html代码,然后一个一个查看脚本,网站的脚本没有压缩,非常幸运,后面找到了相关方法。非常意外,不是啥高级的方法,其实就是用form表单提交,target="_blank",尼玛,这不是和我刚刚的代码一样呀,为嘛他能顺利弹出,但是我这里死活就是拦截,本来以为是网站做了什么设置,YY了一下,想不到有啥设置,然后看了下html与js代码,终于发现了不同。

原因就是我打开新窗口的代码是放在ajax的回调函数中,而那个网站的代码没有写在回调函数中。找到了问题根源,就能迎刃而解啦,终于出现了我想要的效果


$('#open_new').submit();
dialog.showPayLayer();
// var fn = function(json) {
  // if(_model.isSuccess(json)) {
          // dialog.showPayLayer();
          //location.href = json.data.url;
  // }
  // viewUtil.setError(json.msg);
// };
//_model.post($(e.target), {cash:cash, ctype:ctype, type:'cashin'}, fn);


页面效果与那些后台代码不同,js、css、html等都暴露在外面,随时能够查看,想做效果,而且看到了网上的实践,完全可以查看相关代码,然后根据这些代码整合一下,省时省力,做前端得有点copy的能力。在解决这个问题的时候,我也是一点一点的分析,虽然过程很波折,但是在排查的过程中还是有很多体会,网上看到的解决方法不一定试用你的代码,根据这些方法从各个角度分析,总归会找到些线索,解决你现在的问题。

 

这个demo是需要放到php的apache下面的htdocs执行文件中,才能看到相关效果,不然会出现拦截的,直接解压,将pop文件夹放到htdocs中就可以了,如果改动文件夹的名字就需要在config.js的配置文件中修改domain


demo下载:


http://download.csdn.net/download/loneleaf1/7820931

相关文章
|
SQL Ubuntu 关系型数据库
PostgreSQL介绍和PostgreSQL包安装
PostgreSQL 是一个功能强大、可扩展的开源关系型数据库系统,以其可靠性、数据完整性和高性能著称。它支持复杂查询、事务、多版本并发控制及丰富的数据类型,适用于各种应用场景。本文介绍 PostgreSQL 的核心特性,并详细说明在多种 Linux 发行版上的安装与配置方法,帮助用户快速部署和使用该数据库系统。
484 0
|
8月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
461 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
5月前
|
JavaScript 前端开发
怀孕b超单子在线制作,p图一键生成怀孕,JS代码装逼娱乐
模拟B超单的视觉效果,包含随机生成的胎儿图像、医疗文本信息和医院标志。请注意这仅用于前端开发学习
|
8月前
|
开发工具 git
vscode推送项目到github仓库故障解决1
本文介绍了如何优雅解决本地仓库与远程仓库历史记录不一致的问题,并提供避免未来问题的最佳实践。核心在于理解问题根源(如历史记录差异和常见原因),采用推荐的解决方案(先本地初始化再关联远程仓库),并遵循一致的工作流程、团队协作规范及熟悉 Git 命令。通过强制推送或合并无关历史记录等方式处理现有冲突,同时养成良好习惯以预防类似问题。
|
前端开发 小程序 JavaScript
计算机论文|SpringBoot医院病历管理系统
计算机论文|SpringBoot医院病历管理系统
166 1
|
传感器 存储 供应链
物联网技术在物流领域的应用实例有哪些?
物联网技术在物流领域的应用实例有哪些?
2506 59
|
11月前
|
人工智能 数据可视化 关系型数据库
快速构建,JeeLowCode让你的应用开发速度飞起来#快速开发
低代码平台通过直观的图形化界面和模块化设计,大幅缩短开发周期、降低成本,使企业无需大量技术人员即可快速构建应用。其可视化开发、高效数据处理、模型驱动开发、AI智能助力及灵活扩展的插件生态,帮助企业应对复杂业务需求,实现快速迭代与市场响应,推动数字化转型。平台支持多种数据库和跨平台兼容,内置五大核心引擎,提供丰富的底层组件和自定义功能,确保开发效率与应用质量。开源框架与定制开发支持二次开发,进一步提升灵活性与可靠性。低代码平台让开发更简单、高效,助力企业释放创新潜力。
482 19
|
SQL Oracle 关系型数据库
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
708 0
|
消息中间件 数据库
如何保证 RabbitMQ 消费者端在更新数据库时可以成功
如何保证 RabbitMQ 消费者端在更新数据库时可以成功
397 0
|
Linux 对象存储 Windows
MinIO 客户端安装与使用教程
详细讲解MinIO CLI的安装与使用
4783 0