Python自学-程序的三大结构 程序三大结构(顺序,分支,循环)顺序分支循环for-else 语句for 循环之 break,continue,passwhile 循环 程序三大结构(顺序,分支,循环) 顺序 即程序从上到下按顺序执行
分支 gender = input("请输入性别") print("你输入的性别是:{0}".format(gender)) if gender == "男": print("来来来,敲代码") else: print("吃糖吃糖") print("开始上课") 循环 for name in ["zhangsan","lisi","wangwu","jingjing"]: print(name) if name == "jingjing": print("我的最爱{0}出现了".format(name)) else: print("同学,我们不约") # range 包头不包尾 # randint 两头都包括 for i in range(1,11): print(i) a = randint(1,10) from random import randint print(a) for-else 语句 # - 当 for 循环结束的时候,会执行 else 语句 # - else 语句为可选语句 for name in ["
引言 LIVE555的安装就不多赘述了,一搜一大把。但是它选择编译平台的思路很独特,我这里想简单介绍一下。
我们在给不同平台编译的时候,主要的区别就是编译链的区别,LIVE555给每个不同的平台各做了一份config文件,里面放的是目标平台的CC、CPP、C_FLAGS、CPP_FLAGS等等信息,然后用genMakefile脚本来组合生成目标Makefile。
这个思路被我用在了项目里,我的工程中定义了很多条件编译选项,因为要针对不同的需求给相应的功能。在了解了LIVE555这个方法后,我把C_FLAGS单独拿出来管理,用脚本生成我要的Makefile。
以下言归正传,这一篇先讲讲LIVE555的主要模块。
一、主要模块 LIVE555的源码结构还是很清晰的,每个模块是一个文件夹。除了主目录下用来区分平台编译的各种config文件,剩下8个文件夹。
主要的模块只有4个:BasicUsageEnvironment,UsageEnvironment,groupsock,liveMedia。
上手开发主要关注的是 liveMedia 模块,音视频数据的处理都在这里做。另外的三个模块,字面意思看是跟系统、网络socket相关的部分,还不是很理解,不在此误人子弟。
mediaServer是LIVE555提供的RTSP直播服务器,更准确的说,是一个点播服务器。而我理解的直播,是摄像头视频的实时直播或者是录屏画面的实时直播。
proxyServer字面就是代理服务器,我也没多研究。testProgs和WindowsAudioInputDevice直接跳过没看。
二、liveMedia和mediaServer 理解源码从mediaServer开始,这个模块是一个完整的示例程序,从如何启动RTSP服务,到如何调用liveMedia相应的类。自己上手开发的时候也是按这个顺序来垒代码。
mediaServer简单带过,看源码能懂。主要头疼的是这个liveMedia,这也是我小标题里把它放在前面的原因。
从liveMedia这个模块里我深深感受到了C++继承与派生的强大之处。首先要做的是理清基类和派生类之间的关系。
雷霄骅的一篇博客对LIVE555的源码进行了分析,我取了其中对继承关系的梳理。传送门:https://blog.csdn.net/leixiaohua1020/article/details/12235615
获取数据的类的继承关系:
Medium <- ServerMediaSession
Medium <- ServerMediaSubsession <- OnDemandServerMediaSubsession <-MPEG1or2DemuxedServerMediaSubsession
Medium <- MediaSource <- FramedSouse <- FramedFileSource <- ByteStreamFileSource
Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream
Medium <- MPEG1or2FileServerDemux
Medium <- MPEG1or2Demux
Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream
Medium <- MediaSource <- FramedSouse <- FramedFilter <- MPEGVideoStreamFramer <-MPEG1or2VideoStreamFramer
Medium <- MediaSink <- RTPSink <- MultiFramedRTPSink <- VideoRTPSink <-MPEG1or2VideoRTPSink
前言 这是去年ECCV2018的一篇文章,主要贡献为提出一个新的网络结构。之前有一篇论文提出了SENet,在feature map的通道上进行attention生成,然后与原来的feature map相乘。这篇文章指出,该种attention方法只关注了通道层面上哪些层会具有更强的反馈能力,但是在空间维度上并不能体现出attention的意思。CBAM作为本文的亮点,将attention同时运用在channel和spatial两个维度上,CBAM与SE Module一样,可以嵌入了目前大部分主流网络中,在不显著增加计算量和参数量的前提下能提升网络模型的特征提取能力。 近几年,随着CNN的兴起,很多结构新颖、有效的网络结构被提出,比如ResNet、ResNext等;最近,大部分论文证明了在网络结构中引入attention机制可以提升网络模型的特征表达能力。attention不止能告诉网络模型该注意什么,同时也能增强特定区域的表征。本文的CBAM在channel和spatial两个维度上引入了attention机制。
贡献 1.我们提出了一种简单而有效的注意力模块(CBAM),可以广泛应用于提高CNN的表示能力。 2.我们通过广泛的消融研究验证了我们注意力模块的有效性。
3.我们通过插入轻量级模块,验证多个基准(ImageNet-1K,MS COCO和VOC 2007)的各种网络性能得到了极大提升。
思想原理 根据近年的深度学习的深入研究调查了网络的三个重要因素:深度,宽度和基数。
当然除了这些因素之外,该论文还研究了架构设计的一个不同方面,即注意力。虽然在之前的文献中,已经有很多的相关研究关于注意力的重要性。所谓的注意力不仅要告诉重点在哪里,还要提高兴趣点的代表性。此论文的目标是通过使用注意机制来增加表现力:关注重要特征并抑制不必要的特征。
核心思想 由于卷积运算通过将多通道和空间信息混合在一起来提取信息特征,而在论文中采用他们的模块来强调沿着这两个主要维度的有意义的特征:通道和空间轴。这样每个分支都可以分别在通道和空间轴上学习到"what"和"where"。
主要的公式:
F是input feature map作为输入,其中⊗表示逐元素乘法
Mc表示在channel维度上做attention提取的操作
Ms表示的是在spatial维度上做attention提取的操作
下图便是具体的处理过程图:
Channel Attention Module算法原理 算法公式:
为了有效地计算通道注意力,我们压缩输入特征图谱的空间维度。为了聚集空间信息首先将feature map在spatial维度上进行压缩,得到一个一维矢量以后再进行操作。对输入feature map进行spatial维度压缩时,a使用的是average pooling(平均池化)和max pooling(最大值池化),通过两个pooling函数以后总共可以得到两个一维矢量,这样做的好处是:average pooling有效地学习目标物体,而最大池化收集了关于独特对象特征的另一个重要线索,以推断出通道方面的注意力。此外,我在网上学习时看到过另一种说法:average pooling对feature map上的每一个像素点都有反馈,而 max pooling在进行梯度反向传播计算只有feature map中响应最大的地方有梯度的反馈,能作为GAP的一个补充。
在得到两个一维矢量后,将其放入一个共享网络中,共享网络是由一个隐藏层和多层感知机(MLP)组成。为了减少参数开销,隐藏的激活大小设置为,其中r是压缩率。在将共享网络应用于矢量之后,我们使用逐元素求和来合并输出特征向量。其中σ表示Sigmoid函数,即再经过激活函数后最后得到的结果
值得注意的是,多层感知机模型中W0和W1之间的feature需要使用ReLU作为激活函数去处理。代码如下:
def channel_attention(input_feature, name, ratio=8): kernel_initializer = tf.contrib.layers.variance_scaling_initializer() bias_initializer = tf.constant_initializer(value=0.0) with tf.variable_scope(name): channel = input_feature.get_shape()[-1] avg_pool = tf.reduce_mean(input_feature, axis=[1,2], keepdims=True) assert avg_pool.get_shape()[1:] == (1,1,channel) avg_pool = tf.layers.dense(inputs=avg_pool, units=channel//ratio, activation=tf.
Most probably matplotlib 1.5.1 have installed in your machine and you may experience to get this kind of warning:
/usr/lib/python2.7/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment. warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.') To rid off from this warning please upgrade matplotlib by:
*sudo pip install --upgrade matplotlib*
前言,今天要写的是jsp开发时,需要的验证码功能。
1,实现验证码有很多方式,现在还有插件可以使用,今天主要讲的是通过代码实现验证码的功能
2,开始
1)首先我们要在前端写好验证码显示的区域
<div> 验证码:<img src="<%=request.getContextPath() %>/base2/validate" alt="验证码" id="image" /> <a href="javascript:reload();"><label>换一张</label></a><br> <input type="text" name="yanzhengma" id="yanzhengma" class="form-control" placeholder="验证码(忽略大小写)" onblur="validateCode();" /> <label id="spans"></label> </div> 2)然后我们需要写好JavaScript,我们需要用到它去获得验证码,以及刷新验证码功能
<script type="text/javascript"> //-----------------------这个函数主要用来刷新验证码------------------------------------ function reload(){ $("#image").attr('src','<%=request.getContextPath()%>/base2/validate?date='+new Date().getTime()); $("#checkcode").val(""); // 将验证码清空 } //------------------------这个函数用来校验验证码-------------------------- function yanzhengma() { var spans=document.getElementById("spans"); var texts=document.getElementById("yanzhengma").value; if(texts.length<=0){ spans.innerHTML="请输入输入验证码"; spans.style.background="red"; return false; }else{ $.ajax({ Type:"POST", url:"base2/check", data:{"texts":texts}, success:function (data) { var booleans=data.boo; if (booleans == "false") { spans.innerHTML = "验证码输入错误"; spans.style.background = "
每次sudo make all时都会出现这样的问题:
CXX src/caffe/solver.cpp
In file included from src/caffe/solver.cpp:9:0:
./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: 没有那个文件或目录
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/solver.o' failed
make: *** [.build_release/src/caffe/solver.o] Error 1
此问题困扰了我一整个晚上,尝试了网上所有的方法依旧无济于事,如添加依赖,还有流传最多的方法:
在Makefile.config文件中,将:INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
改为:INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
在Makefile文件,将:LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
改为:LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
我自以为是按上述所说的修改的,可是一直不见效,直到今天早上忽然发现似乎所有的解决方法中
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
在/include /usr/之中有一个空格,切记一定要加空格!一定要加空格!一定要加空格!我就是在加上空格之后才顺利完成了编译
--------------------- 作者:枫^.^ 来源:CSDN 原文:https://blog.
最近在用go写一个小工具,一个小功能是用smtp发邮件,用公司内网的邮箱服务器实现踩了不少坑
想知道x509: cannot validate certificate for解决的直接看2.2.1,想知道auth login怎么实现看2.2.2
1 smtp协议 基础知识,回顾一下smtp协议的基本使用
1.1 命令行通过smtp协议发邮件 smtp协议网上资料很多,这里用最简单的方法过一遍,用的是qq邮箱
qq邮箱在使用smtp协议的时候,用的不是qq密码,而是一个叫授权码的东西,我们去qq邮箱设置——账户里找到生成授权码
他会让你用密保手机发短信到某个号码,照做即可获得一个16位字母的授权码,保存好
去一个在线加密base64的网站,我用的是这个在线加密解密
把用来发邮件的qq邮箱账号和授权码转成base64编码
现在打开命令行,连接qq的smtp服务器和端口,qq的是smtp.qq.com:25
telnet smtp.qq.com 25 要和他打个招呼,后面跟着的不一定要是smtp,我不是很清楚这个有什么区别,我试着是什么都行
helo smtp 接下来就是验证你的身份,我们实验auth login法
auth login 分两行,填入刚才转换成base64的账号和授权码,这里也可以把账号和auth login放在一行写,下一行再写密码
响应235 Authentication successful,表示登陆成功
现在开始配置好发件人和收件人
mail from:<你的发件邮箱> rcpt to:<接收邮箱> 输入data,开始写邮件内容,写完后一个.表示邮件结束,返回250 Ok: queued as,邮件就发出去了
data subject:填写邮件主题 <空一行> 填写邮件内容 ... 邮件内容 . 1.2 smtp auth方式 之前用的是auth login方式,smtp还有很多其他方式,可参考这篇文章 SMTP(Login,Plain,CRAM-MD5)验证
用ehlo来代替helo命令,就可以查询这个邮件服务器支持的auth方式
我在qq邮箱和我公司邮件服务器上尝试ehlo,得到的返回如下
所以qq支持auth login和plain两种方式,我公司的邮件服务器只支持auth login,plain的格式是<NULL>账号<NULL>密码
2 如何用go发出一封auth login的邮件 2.1 官方是怎么说的 https://golang.org/pkg/net/smtp/#example_PlainAuth
官方godoc给出了一个plain验证方式的发邮件代码
package main import ( "
对SSB信号的调制以及相干解调过程进行仿真 一、要求
利用Matlab,对SSB信号的调制以及相干解调过程进行仿真,给出仿真过程的时域波形及频谱,比较其不同并合理解释。
二、使用软件
matlab2013a
三、原理
①、SSB调制
移相法形成单边带信号系统框图:
系统框图的解释及公式:
输入信号:m(t)
载波信号:coswct
输入信号的希尔伯特变换:m^ (t)
SSB已调信号(取上边带):S_SSB = 1/2m(t)coswct-1/2m^ (t) sinwct
②、SSB相干解调
相干调制原理:已调信号乘以载波信号,经过低通滤波器滤除高频信号,得到原始的输入信号。
S_SSB * coswct = 1/4m(t)+1/4m(t)cos2wct-1/4m^ (t)sin2 wct
经过低通滤波器滤除1/4m(t)cos2wct-1/4m^ (t)sin2 wct分量
四、代码
clc; clf; Fs=10000; % 仿真的采样率 N=10000; %采样点个数 t=(0:N-1)/Fs; %仿真时间范围 f=(0:N-1)*Fs/N;%仿真频率范围 for F=150:400 % 基带信号发生:频率150Hz~400Hz m_t=m_t+0.003*sin(2*pi*F*t)*(400-F); % 幅度随线性递减 end m_t90shift=imag(hilbert(m_t)); % 基带信号的希尔伯特变换 carriercos=cos(2*pi*1000*t); % 1000Hz载波 cos carriersin=sin(2*pi*1000*t); % 1000Hz正交载波 sin s_SSB=0.5*m_t.*carriercos-0.5*m_t90shift.*carriersin; % 上边带SSB out=s_SSB.*carriercos; % 相干解调 [a,b]=butter(4, 500/(Fs/2)); % 低通滤波器设计4阶,截止频率为500Hz demodsig=filter(a,b,out); % 解调输出 % 下面作出各波形以及频谱 figure(1); subplot(4,2,1); plot(t(1:200)/Fs,s_SSB(1:200)); % SSB波形 title('SSB波形');xlabel('时间/s');ylabel('幅度'); subplot(4,2,2); plot(f,abs(fft(s_SSB)/Fs)); % SSB频谱 axis([0 5000 0 5]); title('SSB频谱');xlabel('频率/Hz');ylabel('幅度'); subplot(4,2,3); plot(t(1:200)/Fs,out(1:200)); % 相干解调波形 title('相干解调波形');xlabel('时间/s');ylabel('幅度'); subplot(4,2,4); plot(f,abs(fft(out)/Fs)); % 相干解调频谱 axis([0 5000 0 2]); title('相干解调频谱');xlabel('频率/Hz');ylabel('幅度'); subplot(4,2,5); plot(t(1:200)/Fs,demodsig(1:200)); % 低通输出信号 title('低通输出信号');xlabel('时间/s');ylabel('幅度'); subplot(4,2,6); plot(f,abs(fft(demodsig)/Fs));% 低通输出信号的频谱 axis([0 5000 0 2]); title('低通输出信号的频谱');xlabel('频率/Hz');ylabel('幅度'); subplot(4,2,7); plot(t(1:200)/Fs,m_t(1:200));%输入信号波形 title('输入信号波形');xlabel('时间/s');ylabel('幅度'); subplot(4,2,8); plot(f,abs(fft(m_t)/Fs));%输入信号频谱 axis([0 5000 0 10]); title('输入信号频谱');xlabel('频率/Hz');ylabel('幅度'); 五、实验结果及分析
刚接触go时真是被它的时间给弄晕了。也不知道如何能够将时间转换到毫秒级别,找了半天也没找到,后来终于试出来了。
20060102150405.000 #这个相当于java中的yyyy-MM-dd HH:mm:ss.SSS
1 GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
2 GET提交有数据大小的限制,一般是不超过1024个字节,而这种说法也不完全准确,HTTP协议并没有设定URL字节长度的上限,而是浏览器做了些处理,所以长度依据浏览器的不同有所不同;POST请求在HTTP协议中也没有做说明,一般来说是没有设置限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用GET,大量的数据使用POST。
3 POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。
因此,GET请求的数据会暴露在地址栏中,所以安全性比较低,比如密码是不能暴露的,就不能使用GET请求 , 而POST请求中,请求参数信息是放在请求头的,所以安全性较高,可以使用。在实际中,涉及到登录操作的时候,尽量使用HTTPS请求,安全性更好。而POST请求则不会。
list=[12,53,5,24,98,62] new_list=[] #定义一个空列表 def get_min(list): #获取列表最小值 a=min(list) #原列表删除最小值 list.remove(a) #将最小值加入新列表 new_list.append(a) #保证列报中有值,递归调用获取最小值,直到所有制获取完,并加入新列表返回新列表 if len(list)>0: get_min(list) return new_list new_list=get_min(list) print(new_list)
node提供了3种获取路径的方法 ,在当前目录下,运行node const {resolve} = require('path') console.log('__dirname : ' + __dirname) console.log('resolve : ' + resolve('./')) console.log('cwd : ' + process.cwd()) //__dirname : D:\new\node //resolve : D:\new\node //cwd : D:\new\node 我们可以看到3个命令都返回了相同的路径,但是他们是不一样的。
__dirname:返回运行文件所在的目录 resolve('./'):当前命令所在的目录 process.cwd():当前命令所在的目录 我们返回到new的目录,测试一下
cd .. const {resolve} = require('path') console.log('__dirname : ' + __dirname) console.log('resolve : ' + resolve('./')) console.log('cwd : ' + process.cwd()) //__dirname : D:\node\new //resolve : D:\node //cwd : D:\node 转载于:https://www.cnblogs.com/founderswitch/p/10310203.html
实现步骤
1.自定义view 实现拖动事件
package com.example.administrator.mydemo.dragview; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import com.example.administrator.mydemo.R; public class DragView extends FrameLayout { private float mStartX; private float mStartY; private int rawX; private int rawY; private int lastX; private int lastY; private int pHeight; private int pWidth; private long mLastTime; private ViewGroup parent; private ImageView iv_pic, iv_close; private OnDragViewClickListener dragViewClickListener; private boolean flag = false; public void SetClickListener(OnDragViewClickListener dragViewClickListener) { this.
设置VS显示代码行数,可以方便调试代码,工具-》选项-》文本编辑器-》C/C+±》常规-》行号勾选上
参考了https://jingyan.baidu.com/album/af9f5a2d2e193543140a4533.html?picindex=2
最近用vs调试程序时,用控制台定时1s打印一次信息,调试过程发现偶尔出现控制台停止打印。不管是否开启多线程,都会出现该问题,而且也怀疑可能是sleep()延时阻塞导致的问题。后来多次实验发现敲一个回车键程序又会继续运行,才发现是是vs控制台提供的暂停功能,即控制台连续打印过程中,鼠标单击控制台的界面(控制台边框内)程序会暂停,打印也停止,可以方便查看打印信息,点回车键后又会继续运行。
在用VS编写C++程序的时候,遇到这样的问题IntelliSense: argument of type “void *” is incompatible with parameter of type “const char *”,但是给的例程确实传入参数就是void *,网上找了很久没发现解决办法。
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) { int r; long len = 0; r = sscanf(ptr, "Content-Length: %ld\n", &len);//这一句的ptr变量报错,sscanf第一个参数是const char *或string类型。 if (r) *((long *)stream) = len; r eturn size * nmemb; } 后面尝试将报错的void*变量ptr加上强制类型转换后就不报错了:
r = sscanf((const char *)ptr, "Content-Length: %ld\n", &len);
方法一: a,b=3,4 a,b=b,a print(a,b) 方法二: a=1 b=5 c=a a=b b=c print(a,b) 4 3
5 1
问题描述:当表格数据量过多,一次请求回来会很卡,同时又不想分页的情况下,我们想让鼠标滚动到表格底部时再去请求数据。
解决思路:项目用的是element-ui的框架,给el-table添加一个滚动事件,计算滚动条到顶部的距离,容器的高度,以及滚动内容的高度,当 滚动条到顶部的距离+容器的高度=滚动内容的高度时请求数据。注:如果容器有padding和margin的话需要相应增减。
我试过直接在el-table 上加@scoll事件是不生效的,在网上查阅资料后解决方案如下:
1.给table一个ref属性。
2.监听scroll事件。
this.$refs.multipleTable.bodyWrapper.addEventListener('scroll', (res) => { let height = res.target; let clientHeight = height.clientHeight; let scrollTop = height.scrollTop; let scrollHeight = height.scrollHeight; if(clientHeight + scrollTop + 300 > scrollHeight){ console.log(clientHeight + scrollTop); console.log(scrollHeight); } },true); 复制代码 因为组件中的table是由几个table组合起来的,所以取值时this.$refs.multipleTable.bodyWrapper这样写才能获取到dom节点。
这样大致就可以实现功能了。
过程中遇到个问题
this.$refs.multipleTable.bodyWrapper.addEventListener('scroll', () => { let clientHeight = this.clientHeight; let scrollTop = this.scrollTop; let scrollHeight = this.scrollHeight; if(clientHeight + scrollTop + 300 > scrollHeight){ console.log(clientHeight + scrollTop); console.
$在JS中本身只是一个符号而异,在JS里什么也不是。 但在JS应用库JQUERY的作者将之做为一个自定义函数名了,这个函数是获取指定网页元素的函数,使用非常之频繁,所以好多新手不知道,还以为$是JS的什么特殊语法。 后来,可能有些程序员JQUERY用得多了,发现$这个函数很好用,很方便,所以,在不用JQUERY的情况,一般自己也会自定义一个$函数。 即: function $(Nid){ return document.getElementById(Nid); } 就这么简单(在JSQUERY里可能稍微功能再强大一点,但主要还是我写的这个功能。) 以后在网页就不用每次使用document.getElementById("ID名")来获取元素,只用$('ID名')即可,非常简使了。 三种具体用法: 1、$()可以是$(expresion),即css选择器、Xpath或html元素,也就是通过上述表达式来匹配目标元素。 比如:$("a")构造的这个对象,是用CSS选择器构建了一个jQuery对象——它选择了所有的<a/>这个标签。如: $("a").click(function(){...}) 就是在点击页面上的任何一个链接时的触发事件。确切地说,就是jQuery用<a/>这个标签构建了一个对象$("a"),函数 click()是这个jQuery对象的一个(事件)方法。 比如有这样一段HTML代码: <p>one</p> <div> <p>two</p> </div> <p>three</p> <a href="#" id="test" onClick="jq()" >jQuery</a> 而操作这段HTML的是如下一条语句: alert($("div>p").html()); $()中的是一个查询表达式,也就是用“div>p”这样一个查询表达式构建了一个jQuery对象,然后的“html()”意思是显示其html内容,也就是上面HTML代码段的[two]。再如: $("<div><p>Hello</p></div>").appendTo("body"); $()中的是一个字符串,用这样一段字串构建了jQuery对象,然后向<body/>中添加这一字串。 2、$()可以是$(element),即一个特定的DOM元素。如常用的DOM对象有document、location、form等。如这样一行代码: $(document).find("div>p").html()); $()中的document是一个DOM元素,即在全文寻找带<p>的<div>元素,并显示<p>中的内容。 3、$()可以是$(function),即一个函数,它是$(document).ready()的一个速记方式。如常见的形式是这样的: $(document).ready(function(){ alert("Hello world!"); }); 可变形作: $(function(){ alert("Hello world!"); }); 对于选择HTML文档中的elements,jQuery有两种方法: 1)如$("div>ul a"),它的意思是div标签中的ul标签中的a标签 不过,$('div>ul')和$('div ul')是有区别的, $('div>ul')是<div>的直接后代里找<ul>; 而$('div ul')是在<div>的所有后代里找<ul>。 2)用jQuery对象的几个方法(如方法find()、each()等) $("#orderedlist).find("li") 就像 $("#orderedlist li"). each()一样迭代了所有的li,而表达式中的“#”表示HTML中的ID,如上例中的“#orderedlist”就表示“ID为orderedlist所在的标签”。 **************************************************************** 1、标签选择器$('p')、类选择器$('.myClass')、id选择器$('#myId')相对简单,不多说。不过有一点——$('div>ul')和$('div ul')是有区别的, $('div>ul')是<div>的直接后代里找<ul>;而$('div ul')是在<div>的所有后代里找<ul>。 所以,$('#sId>li')所选择的是id为"sId"的所有<li>孩子节点,即使这个<li>的后代还有<li>也不是它所找的范围(所找到的DOM对象,只是它本级的DOM对象。)。而$('#sId li:not(.horizontal)'),就是指类名"sId"里面的所有li的子孙中没有horizontal类的所有元素。——这里的not()是一个negation pseudo class. 这里返回的是一个jQurey对象,一个数组对象,这个jQuery对象的长度可用.
直接上图(图中有详细注释):
**注意:**1.这里通过内部类继承BroadcastReceiver,重写其onReceive方法。
2.在AndroidManifest.xml中需要加入网络权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 实现效果:能够监听你手机有无网络并提示吐丝。