程序员必知:广告等第三方应用嵌入到web页面方案之使用js片段

简介: 程序员必知:广告等第三方应用嵌入到web页面方案之使用js片段

在自己的项目中嵌入过广告的朋友们可能都用过百度联盟, 只需要嵌入如下一段js代码片段, 就可以在自己的项目中嵌入广告, 来获得收益.

?1234 var cpro_id = “u2557752”;

  优点: 可通过URL传递到服务器

  缺点: 必须进行DOM查询,无法缓存

  2.通过hash传递

?1[/code>script src=“ type=“text/javascript”>

  优点: 使用URL,便于缓存

  缺点: 必须进行DOM查询

  3.自定义属性

?1[/code>script data-hxh-coupon-id=‘1234’ src=“ type=“text/javascript”>

  优点: 可读性强, 便于缓存, 易于识别脚本引入代码的位置

  缺点: 必须进行DOM查询

  4.使用全局变量

?1234[/code>script type=“text/javascript”> var couponId = ‘87393’;script src=“ type=“text/javascript”>

  优点: 可读性强,便于缓存,参数类型灵活,无需进行DOM查询

  缺点: 使用了全局变量

2.获取数据

关于获取数据, 服务端生成脚本, 服务端直接查询数据, 静态js脚本方案中, 可使用jsonP, Cors等方案进行跨域请求.

3.输出html

使用document.write

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

  document.write直接在当前文档流中写入字符串,一旦文档流已经关闭,就打开新的文档流并写入,原来的文档流会被清空,已渲染好的页面就会被清除,浏览器将重新构建DOM并渲染页面.所以使用这种方案, 就一必须是同步执行嵌入的这段js代码, 作为第三方脚本引入,阻塞性的脚本会阻止主页面的渲染,如果js文件加载迟缓,甚至不可用的, 会给主页面造成严重的性能问题, 所有不建议使用.

操作DOM添加

  1.在目标位置嵌入js片段, 并使用预先定义的ID,class,data-等(如上)

  2.js文件中创建DOM元素,将HTML字符串赋值给元素的innerHTML属性

  3.根据ID,calss,data-等查询到脚本所在位置,并将元素添加到DOM中

?123456789[/code>script id='hxh-coupon-scandown' type="text/javascript"> (function(){ var script = document.createElement('script'); script.async = true; script.src = ''; var entry = document.getElementsByTagName('script')【0】; entry.parentNode.insertBefore(script, entry); })()

  优点:

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

p.p2 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000; min-height: 19px }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

    1.可以异步加载第三方DOM, 不阻塞主页面的渲染,即使js出错,也不会影响到主页面

    2.可以将创建的DOM动态插入到已存在的元素之后(即可以追加到已知位置)

  缺点:

    1.使用字符串拼接不利于HTML片段的编写和维护

    2.会继承父页面样式

    3.主页面可更改DOM内容

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

  字符串拼接不利于编写和维护的问题,可以通过JavaScript模板引擎库来编写HTML片段, 流行模板库:HandlebarsJS,Mustache,BAIDU-Template,artTemplate等

使用不设置src的iframe

li.li1 { margin: 0; font: 17px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font: 12px Helvetica; color: rgba(0, 0, 0, 1); -webkit-text-stroke: 0px #000000 }

span.s2 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

span.s3 { font: 12px Helvetica; color: rgba(0, 0, 0, 1) }

ol.ol1 { list-style-type: decimal }

  主页面提供一个不设置src的iframe标签,通过iframe的contentWindow访问iframe的DOM,使用document.write将HTML直接写入到iframe中

?12345678var doc = document.getElementsByTagName('iframe')【0】.contentWindow.document;doc.writeln("点击");doc.writeln("");doc.writeln("var btn = document.getElementById(\'btn\');");doc.writeln("btn.onclick = function(){");doc.writeln("parent.parentEvent();");doc.writeln("");doc.close(); 

p.p1 { margin: 0; text-align: center; font: 15px "Trebuchet MS"; color: rgba(255, 38, 0, 1); -webkit-text-stroke: #ff2600 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

  注: iframe由浏览器异步处理, 所以此处使用document.write()并不会阻止父页面的加载

优点:

p.p1 { margin: 0; font: 16px "PingFang SC"; color: rgba(67, 91, 102, 1); -webkit-text-stroke: #000000 }

p.p2 { margin: 0; font: 16px "PingFang SC"; color: rgba(67, 91, 102, 1); -webkit-text-stroke: #000000; min-height: 22px }

span.s1 { font-kerning: none }

span.s2 { font-kerning: none; color: rgba(67, 90, 102, 1) }

  1.完全独立的DOM环境,不会继承父页面的样式

  2完全独立的window,避免和主页面其他脚本冲突

  3.可直接与主页面进行交互(与iframe引入外部页面对比)

缺点:

p.p1 { margin: 0; font: 16px "PingFang SC"; color: rgba(67, 91, 102, 1); -webkit-text-stroke: #000000 }

p.p2 { margin: 0; font: 16px "PingFang SC"; color: rgba(67, 91, 102, 1); -webkit-text-stroke: #000000; min-height: 22px }

span.s1 { font-kerning: none }

  1. Iframe标签的创建速度慢

  2.主页面可以访问iframe的DOM环境并可进行更改

嵌入第三方页面两种方案中,另一种方案() 都大篇幅介绍使用了iframe进行html输出,iframe提供了一种最佳的避免样式和脚本冲突的嵌入途径,但是有些情况在主页面的DOM中去渲染更为合适

不适合使用iframe的情况:

p.p1 { margin: 0; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

  1.需要在iframe外部呈现内容, 场景: 第三方应用中需要弹出对话框时,如果iframe不是覆盖整个页面的, 就无法正常展示对话框

p.p1 { margin: 0; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

  2.一个页面引入很多个iframe嵌入页面, 同一个页面引入许多个iframe时, 会带来主页面很大的性能开销, 对于只是渲染一两次情况, 这种性能消耗可以忽略不计

p.p1 { margin: 0; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

  3.需要继承父页面的基础样式, 有些时候,希望第三方应用继承父页面的基础样式, 来和主页面的样式风格保持一致,这种情况不适用于使用iframe

p.p1 { margin: 0; font: 12px Helvetica; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 12px Helvetica; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; text-align: center; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 19px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 16px Helvetica; color: rgba(255, 38, 0, 1); -webkit-text-stroke: #ff2600 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

li.li1 { margin: 0; font: 17px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font: 12px Helvetica; color: rgba(0, 0, 0, 1); -webkit-text-stroke: 0px #000000 }

span.s2 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

span.s3 { font: 12px Helvetica; color: rgba(0, 0, 0, 1) }

ol.ol1 { list-style-type: decimal }

p.p1 { margin: 0; font: 28px Helvetica; color: rgba(38, 38, 38, 1); -webkit-text-stroke: #262626 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 18px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

p.p1 { margin: 0; font: 16px "Trebuchet MS"; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }

span.s1 { font-kerning: none; font-variant-ligatures: no-common-ligatures }

相关文章
|
2月前
|
编解码 前端开发 JavaScript
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
65 2
|
3月前
|
存储
在 Web 中判断页面是不是刷新
【9月更文挑战第10天】在Web开发中,判断页面是否刷新有多种方法:1) 监听`popstate`事件,检测用户是否通过历史记录访问页面;2) 记录并比较页面加载时间戳,若相差极小,则可能为刷新;3) 利用本地存储设置特定值,若该值不存在或不符合预期,则页面可能被刷新。然而,这些方法并非绝对准确。
215 3
html,web页面朗读文字,朗读中文,朗读英文
html,web页面朗读文字,朗读中文,朗读英文
|
3月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
149 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
162 45
|
12天前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
19天前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
27 7
|
23天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
22天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2