Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >作为window对象属性的元素 多窗口和窗体

作为window对象属性的元素 多窗口和窗体

原创
作者头像
mySoul
发布于 2018-08-04 18:16:41
发布于 2018-08-04 18:16:41
2.2K0
举报
文章被收录于专栏:mySoulmySoul

作为window对象属性的文档元素

如果html文档中用id属性为元素命名。并且如果 window对象没有此名字的属性,则window对象会赋予一个属性,其名字为id属性的值,其值指向该元素

html

代码语言:txt
AI代码解释
复制
<div id="ming"></div>

控制台

代码语言:txt
AI代码解释
复制
window.ming;
<button id="ming"></button>

由于window对象是作用域链的最顶层,即id属性为脚本访问的全局变量。如上方的,可以通过变量ming来达到引用此元素的目的。其中button为一个按钮

但是如果window对象已经具有此名字的属性。不会发生上述情况,因为ID已经被占用。

如果在代码中声明并赋值给全局变量x,那么显示声明会隐藏隐式声明的元素变量。如果脚本中的变量声明出现在命名元素之前,那么变量的存在会阻止元素获取它的window属性。如果脚本中的变量声明出现在命名元素之后,那么变量的显式会覆盖属性的隐式值。即,显示的是显式的声明。

举一个查找元素id的例子

代码语言:txt
AI代码解释
复制
var ui = ["input", "prompt", "heading"];
ui.forEach((id) => {	// 进行一次循环
	ui[id] = document.getElementById(id);
	console.log(ui[id]);
});

html

代码语言:txt
AI代码解释
复制
<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<script src="./index.js"></script>
</head>
<body>
	<div id="input">111</div>
	<button id="prompt">1111</button>
	<div id="heading">1111</div>
</body>
</html>

好吧,因为浏览器厂商可以随便给加属性,导致很容易出现显式和隐式的问题。所以呢,一般不用,并且输出的结果,全是null,没有该id。

为什么呢。因为script脚本在头部先进行加载,无法获得完整的dom树,导致dom树获取全为空值,因为在处理js脚本的时候,dom树渲染是阻塞的,除非允许异步渲染,加载完成以后进行渲染,或者是异步的随机渲染。

代码语言:txt
AI代码解释
复制
window.prompt

因为window对象存在该属性,导致会出现遍历的失败

Σ( ° △ °|||)︴

给一个id进行查找

代码语言:txt
AI代码解释
复制
var $ = (id) => { return document.getElementById(id); };
var ui = {};
ui.prompt = $('prompt');
console.log(ui);

多窗口和窗体

一个web浏览器有多个标签,每一个标签页都是一个独立的浏览上下文(即,每一个独立的标签都是一个线程,有些时候,浏览器会进行线程的合并)。每一个标签页都有一个独立的window对象。而且相互之间不干扰。每个标签页中运行的脚本通常并不知道其他便签页的存在。更不会和其他标签页的window对象进行交互操作或者操作其文档内容。

窗口和其他窗口并不是没有完全的关系。一个窗口或标签页中的脚本可以打开新的窗口或者标签页。当一个脚本这样做,多个窗口可以相互操作

iframe

已经处于半废弃的inframe标签。挺无奈的,已经快废了。

不过学习还是学习一下吧

iframe是用来嵌套多个文档的。由iframe所创建的嵌套浏览上下文是用自己的window对象表示的。每一个iframe都是一个独立的window对象。

对于客户端js来说,窗口,标签页,iframe和框架都是浏览上下文。对于js来说都是window对象。和独立的不同之处在于,js脚本能够看到其祖先和子孙

打开和关闭窗口

使用window的open可以打开一个新的标签页

window.open将会载入指定的url到新的或者已经存在的窗口中(取决于如何设置)。并返回代表那个窗口的window对象。

open()第一个参数会在新窗口中显示文档的url,如果参数省,或为空,将会使用空白页面进行显示

代码语言:txt
AI代码解释
复制
about:blank

脚本无法通过简单的猜测窗口的名字来操纵窗口的web应用。只有设置了允许导航的页面才可以。

即,当且仅当窗口包含的文档来自相同的源,或者这个脚本打开的哪个窗口。(或者递归打开的窗口),脚本才能通过名字指定存在的窗口,或者如果是一个窗口内嵌在另一个窗口里的窗体,那么在它们的脚本之间可以相互导航。使用

代码语言:txt
AI代码解释
复制
_top(顶级祖先窗口)

代码语言:txt
AI代码解释
复制
_parent(直接父级窗口)

来获取上下文。

窗口名字 窗口名字,运行open()方法引用已存在的窗口。并同时可以作为标签a和标签form的taget的值,表示加载到哪

open第三个参数表明如何打开这个标签的,以及大小(一般弹窗广告喜欢这样做)

代码语言:txt
AI代码解释
复制
// 打开允许改变大小的浏览器的窗口,包含地址栏,工具栏和地址栏
var w = window.open("http://www.baidu.com/", "smallwin", "windth=200, height=350, statue=yes");

在新的窗口中运行

代码语言:txt
AI代码解释
复制
window.name
"smallwin"

第四个参数只在第二个参数命名的时候有用,是在当前(原先)窗口是替换掉历史记录,还是新建一个历史记录,默认是后者,因为要指定名称,才会在历史记录中储存

窗口的返回值

代码语言:txt
AI代码解释
复制
var w = window.open();
w.alert('about to visit https://www.google.com.hk/')	// 在新的窗口调用alert()方法
w.location = "https://www.google.com"	// 设置窗口的location,完成页面的跳转

w保存的是跳转网页的window对象的值

关闭窗口

如果已经使用open()打开窗口,同样可以用close()关闭其窗口

代码语言:txt
AI代码解释
复制
w.close();
undefined

这样可以将w开的窗口将其关闭

如果要关闭本窗口可以调用

代码语言:txt
AI代码解释
复制
close()

这样就完成了页面的关闭

即使一个窗口已经关闭了,那么其window对象仍旧保存在其父窗口,直到父窗口关闭,window对象彻底的消失。其closed的值为true,并且document的值为null,其方法也不能使用

窗体之间的关系

window对象的方法open()可以打开并创建一个新的window对象(即创建一个新的窗口)并且该窗口是具有opener属性,根据该属性,可以打开其原始窗口。

即,通过这样两个窗口可以实现相互引用。或者调用对方的方法。

如果一个窗口是顶级窗口,标签

代码语言:txt
AI代码解释
复制
parent == self
true

self 属性返回窗体本身,表明parent指向其窗体

如果一个窗体是在另外一个窗体之中,则parent.parent将会是顶级窗口。不管其嵌套了多少层,包括使用top属性指向的都是最顶层窗口。

如果window本身就是顶层窗口,则top就是其窗口本身。其top就是parent

交互窗口中的js

每个窗口窗体都是js的执行上下文。以window对象作为全局对象,这样的话,一个窗口窗体中的代码可以应用到其他窗口或者窗体(并且同源策略没有进行阻止)。那么他们之间可以完成交互。

好啦,不在过多解释,毕竟这个已经没有什么用的了

window作用域链

window对象是客户端js的全局变量,但是从技术上不是,web浏览器每次向窗口或者窗体载入新的内容的时候,都是开始一个新的js执行上下文,包含一个新创建的全局对象。事实上,全局对象会在窗口或窗体载入新内容时被替换,即window对象实际不是全局对象,是一个代理,即windowProxy

ps 需要注意一点的是在多个标签或者窗体的时候,每个窗体仅仅为一个线程,线程之间使用的是一个浏览器定义好的api 即 Window.localStorage 或者是 Cookie 加 轮询达到多个标签之间的通信的目的。

博客

www.iming.info

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
飞书开放平台-发送文本&富文本消息
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/01/08
1.9K0
飞书开放平台-发送文本&富文本消息
最近爆火的MCP究竟有多大魅力?MCP开发初体验|得物技术
MCP 全称 Model Context Protocol,是由 Anthropic 公司在 2024 年 11 月推出一个开放协议,主要用于标准化应用程序向大语言模型提供上下文的方式。可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化方式。
得物技术
2025/05/08
1900
最近爆火的MCP究竟有多大魅力?MCP开发初体验|得物技术
飞书开放平台-全新消息卡片搭建工具
前言 你还在为需要手撕 JSON 代码而烦恼吗?消息卡片搭建工具全新升级,为你带来更优雅的卡片创作体验: 🌟 卡片编辑:纯可视化操作编辑消息卡片,再也不用碰代码 🌟 我的卡片:一键保存卡片,轻松构建你的专属卡片模板库 🌟 模板消息:无需烦恼冗长的请求体,一个卡片 ID 就能发送 可视化编辑工具 image.png 如上图卡片上每个元素,都提供了可视化的边界功能。 卡片格式与数据分离 image.png 如上每个卡片都有一个ID,我们称之为卡片模板的ID,另外卡片上每个元素都可以绑定一个变量,通
加多
2023/01/07
2.1K1
飞书开放平台-全新消息卡片搭建工具
飞书开放平台-批量发送消息示例
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/03/19
1.2K0
飞书开放平台-发送卡片消息
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/01/10
2K0
飞书开放平台-发送卡片消息
飞书开放平台-回复消息示例
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/01/12
1.3K0
飞书开放平台-回复消息示例
聊聊Spring AI Alibaba的FeiShuDocumentReader
本文主要研究一下Spring AI Alibaba的FeiShuDocumentReader
code4it
2025/04/20
610
聊聊Spring AI Alibaba的FeiShuDocumentReader
go调用第三方API通用做法
在最近本人需要调用一些第三方服务,可是有些第三方服务并没有实现Go的官方SDK调用方法,本文将以一个实战案例教会你如何调用99%的第三方api
陈杪秋
2024/07/13
2260
prometheus实战之五:飞书通知告警
程序员欣宸
2023/05/27
4.2K0
prometheus实战之五:飞书通知告警
SCF+腾讯云API+企业微信机器人实现CDB慢查询提醒
CDB数据库在腾讯云控制台可以看到每个数据库示例的操作日志。
树根
2019/01/26
4.6K4
SCF+腾讯云API+企业微信机器人实现CDB慢查询提醒
Go实现海量日志收集系统
完整代码地址为: https://github.com/pythonsite/logagent
肉眼品世界
2021/01/25
1.3K0
Go实现海量日志收集系统
Go使用Curl推送钉钉消息
最近在用Go实现业务日志实时监控,当捕捉到error级别的日志时,想要推送钉钉消息到群里进行通知,下面代码实现了简单消息及markdown消息推送到钉钉机器人webhook的操作,供大家参考。
Clive
2019/05/31
1.3K0
V3手动鉴权失败之Go篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/11/16
1.2K0
V3手动鉴权失败之Go篇
Go实现海量日志收集系统(四)
到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSearch,并且最终通过kiban
coders
2018/05/28
1.5K0
【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
可以看见,时间戳1589629920对应2020-5-16 19:52;这一分钟的网卡流量是103.345Mbps
ahfuzhang
2022/02/22
8110
【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
golang源码分析:分布式链路追踪
在上一节搭完分布式追踪的采集展示链路后,这一节开始分析分析分布式链路追踪的核心源码。我们知道分布式追踪的原理是通过traceId串联调用链路上的所有服务和日志,每个服务都有一个自己的spanId,每一次rpc调用都需要生成一个子spanId,通过父子spanID的对应关系,构建一个有向无环图实现分布式追踪的。因此在业务代码的接入过程中需要实现如下功能,父子span关系的构建,父子span关系的传递(包括context内部传递和rpc服务之间的传递有可能跨协议比如http和grpc协议之间传递),rpc日志的采样,上报等等。每一个厂商都有自己的实现,opentrace定义了统一的标准接口,我们按照标准实现即可。在业务代码中实现包括四步:
golangLeetcode
2022/12/17
8240
golang源码分析:分布式链路追踪
如何开发ChatOps
现在各种Ops,比如DevOps,AIOps,ChatOps,NoOps等等,反正其背后的意义就是各种卷运维,让运维无路可走。
没有故事的陈师傅
2022/12/06
5550
如何开发ChatOps
8.Go编程快速入门学习
[TOC] 0x00 Go语言基础之Socket网络编程 现在的我们几乎每天都在使用互联网,但是你知道程序是如果通过网络互相通信吗? 描述: 相信大部分人通常是一知半解的,作为一个程序员👨‍💻‍,对于网络模型你应该了解,知道网络到底是怎么进行通信的,进行工作的,为什么服务器能够接收到请求,做出响应。这里面的原理应该是每个 Web 程序员应该了解的。 本章我们就一起来学习下Go语言中的网络编程,关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。 1.基础概念介绍
全栈工程师修炼指南
2022/09/29
7960
8.Go编程快速入门学习
如何优雅的设计一个SDK
相信很多开发同学一定都听说过SDK,SDK全称Software Development Kit,即软件开发工具包。它是由硬件平台、操作系统或编程语言的制造商提供的一套工具,协助软件开发人员面向特定的平台、系统或编程语言创建应用。SDK经常被用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。
闫同学
2023/11/18
1.7K1
Golang包——net
请求http://localhost:8080/hello会打印hello world
羊羽shine
2019/05/29
4750
相关推荐
飞书开放平台-发送文本&富文本消息
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档