整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

聊聊说中国违背了国际秩序与入世承诺是什么意思

聊聊说中国违背了国际秩序与入世承诺是什么意思

常看到美国的官员说中国违背国际秩序,现在日本也加入进来了,那我们不禁有个疑惑,究竟这个“中国违背国际秩序”是什么意思?

4月17日,访问美国的日本首相菅义伟,和美国总统拜登发布了一个美日领导人联合声明,其中涉及中国的内容遭到了中国外交部的反对。

那么他们的声明究竟包含了关于中国的什么消极内容呢?

在美国之音上有中文版的原文,他们表示了对东海,南海,台湾,香港,新疆的关切,并称“中国的活动与基于国际规则的秩序不符”。

如下所示:

拜登总统和菅义伟首相就中国的行动对印度太平洋地区乃至世界和平与繁荣的影响交换了意见,并对中国的活动与基于国际规则的秩序不符,包括用经济或其他形式的胁迫。

我们将继续基于普世价值和共同原则合作。我们也认识到威慑对于维持该地区的和平与稳定的重要性。

我们反对任何单方面改变东中国海现状的企图。

我们重申对中国在南中国海的非法海事主张和活动的反对,并重申我们对遵循国际法的自由开放的南中国海有强烈的共同利益。在南中国海,航行自由和飞越自由与《联合国公约》相符。

我们强调台湾海峡两岸和平与稳定的重要性,并鼓励和平解决两岸问题。

我们对香港和新疆维吾尔自治区的人权状况表示严重关切。

美国和日本认识到与中国进行坦率对话的重要性,重申与他们直接就关切问题交换看法的意向,并承认有必要在有共同利益的领域与中国合作。


无独有偶,在上个月,美国国务卿布林肯AntonyBlinken 与国防部长奥斯汀LlyodAustin 上任后首次外访选择亚洲,以日本作为起点。布林肯与奥斯汀3月16日与日本高层召开“美日安全保障协议委员会”会议。会谈结束以后,美日高层也发表了联合文件,说“美国和日本认识到中国的行为,当与现存的国际秩序不一致时( inconsistent with the existing internationalorder),对同盟和国际社会造成政治、经济、军事和科技上的挑战。


这个就比较有意思,上个月在日本,这个月在美国,

美国和日本这两个国家都发表了联合声明,说中国违背国际秩序(inconsistent with the existing international order,),那这句话是什么意思呢,究竟什么是违背国际秩序呢?在美国驻华大使馆和领事馆的官网上,是可以看到3月份的联合声明文件的中英文原文的,

https://china.usembassy-china.org.cn/zh/u-s-japan-joint-press-statement-cn/
在这份联合文件里面,也和这次的美日领导人联合声明一样,把具体的内容写出来了,涉及到中国的部分,中文内容是这样的:

美国和日本认识到中国的行为,当与现存的国际秩序不一致时,对同盟和国际社会造成政治、经济、军事和科技上的挑战。部长们承诺抵制在此地区以胁迫和破坏稳定的方式对付他国的行为,其破坏基于规则的国际体系。他们重新确认支持合法商务畅通无阻和尊重国际法, 包括航行和飞越自由和其他合法的海洋使用。

部长们同时对近来在该地区的扰乱性发展,例如中国的《海警法》,表示严正关切。

此外,他们也论及美国依照安保条约第五条对日本防务不动摇的承诺,包括尖阁列岛在内。美日持续反对任何以单边寻求改变现状或削弱日本对这些岛屿的管理的行动。

部长们强调台湾海峡和平稳定的重要性。他们重申反对中国在南中国海的非法海事声索和活动,并重申2016年7月根据1982年《海洋法公约》所做出的、有关菲律宾和中国仲裁案的判决为最终判决,且对当事方具法律约束力。

部长们表达对香港和新疆维吾尔自治区人权状况的严正关切。


来我们总结一下这两份声明,美国和日本认为的中国“破坏国际规则,违背国际秩序”的点究竟是什么。
1:中国通过了《海警法》,是扰乱了地区发展
2:包括“尖阁列岛”在内。美日持续反对任何以单边寻求改变现状或削弱日本对这些岛屿的管理的行动
3:强调台湾海峡和平稳定的重要性(暗示是中国在破坏台海和平稳定)
4:反对中国在南中国海的海事声索和活动,并重申2016年7月根据1982年《海洋法公约》所做出的、有关菲律宾和中国仲裁案的判决为最终判决,且对当事方具法律约束力。

在4月的声明里面,“重申对中国在南中国海的非法海事主张和活动的反对”
5:表达对香港和新疆人权状况的严正关切

其实我们可以看出来,这五条里面,

台湾,香港和新疆是完全的中国国内事务,而《海警法》,钓鱼岛和南海是涉及到中国和周边国家的领土争端,

而美日的联合声明则是完全的站在中国的对立面,在钓鱼岛归属中支持日本,在南海岛屿归属中支持菲律宾。美国和日本的意思是,中国的国力增强,在这些事务中占据了越来越有利的位置,所以是“违背了现存的国际秩序”。


在以前,我们总是会隐隐觉得,西方社会和日本对我们的指责,虽然总体没有道理,但是不是多多少少还是确实我们也有不对的地方?

但是当看了这些内容之后,可以进一步确认我们在做的事情是合理的,并没有什么不对。

美日的反对纯粹是因为利益问题,而不是因为道义。

至于涉及到利益,那就是立场问题了,对与不对,就看你站在谁的立场了


其实类似的,国内网络上以前还有说“中国违背了入世承诺”的声音,

2015年9月,美国智库美国信息技术与创新基金会(InformationTechnology and Innovation Foundation,以下简称ITIF)的主席阿特金森与其合作者发表了一篇报告,指责中国没有履行入世承诺。这片报告当时影响很大,说中国没有开放电信市场,电影市场,银行等市场之类,这个基金会还制作了一个表格,被人翻译成了中文,在中国网上广为传播,毕竟是2015年,那个时候国内的气氛对美国人还是高度信任的,觉得美国人指责一定是有理有据的,没有意识到背后还有利益的成分,


事实上直到2018年中兴事件爆发的时候,国内也还在一边倒的骂中兴不讲诚信不遵守规则,到后面美国人各种加征关税,接二连三的打击华为,各种把中国企业实体清单,越来越多的人意识到了不对劲,国内的舆论气氛才被美国人给扭转了过来。

2015年ITIF基金会的报告出来后,当时国内不少学者,媒体人,知名人士也不加甄别,总之思想上毫无防备的接受了美方的观点和内容,并且在各种场合到处传播说中国违背了入世承诺,造成了很大的影响,毕竟三人成虎,大家都这么说,就形成了强大的舆论氛围。

我们看下,就是下面这个表格。

其实中国政府早在2011年就发了个白皮书,叫《中国的对外贸易


http://www.gov.cn/zwgk/2011-12/07/content_2013475.htm

里面是这么说的:

“截至2010年,中国加入世界贸易组织的所有承诺全部履行完毕。中国认真履行承诺的实际行动得到世界贸易组织大多数成员的肯定。2006年、2008年和2010年,中国政府接受了世界贸易组织的三次贸易政策审议。世界贸易组织所倡导的非歧视、透明度、公平竞争等基本原则已经融入中国的法律法规和有关制度。市场意识、开放意识、公平竞争意识、法治精神和知识产权观念等在中国更加深入人心,推动了中国经济进一步开放和市场经济体制进一步完善。”


你看中国和世贸组织的说法,中国是履行了入世承诺的,显然这和美国的说法不一致,既然双方说法不一致,为什么我们当时会本能的选择相信美方呢?

即使不站在中国的立场,至少也应该都看下双方的具体观点和证据,站在中立的角度,先不忙下结论。可惜当时我们国内的舆论气氛,很多人就是完全采信美方的说法,只能说我们常犯的错误,因为美国确实很富强,结果就本能的把“把美国人想的太好了”,对其信任度太高,其实这是不利于我们客观的看待问题的。


其实我们要有一个常识,在国际政治中的互相指责,尤其是美国为首的西方国家对我国的指责,其中一定是夹杂着利益的诉求,我们是要进行甄别的,是要进行分类的。

就以上面那个表格为例子,

我们对比下中国商务部官网发布的中国入世承诺,在如下链接:

http://www.mofcom.gov.cn/aarticle/Nocategory/200612/20061204000376.html

另外就是中国加入世贸组织议定书(标准中文版全文),在如下链接:

http://gpj.mofcom.gov.cn/article/zuixindt/201612/20161202103711.shtml


先说第一类,完全无中生有的,造谣类的,

表格里面那个中国向“华盛顿共识”定义的目标发展的承诺,这个明显就不对,想想中国可能会做这个承诺吗?

所谓华盛顿共识,是因为1989年,陷于债务危机的拉美国家急需进行国内经济改革。美国国际经济研究所邀请国际货币基金组织(IMF)、世界银行(WBG)、美洲开发银行和美国财政部的研究人员以及拉美国家代表在华盛顿召开了一个研讨会,旨在为拉美国家经济改革提供方案和对策。


曾任世界银行美国国际经济研究所经济学家约翰·威廉姆森执笔写了《华盛顿共识》,

系统地提出指导拉美经济改革的各项主张,包括实行紧缩政策防止通货膨胀、削减公共福利开支、金融和贸易自由化、统一汇率、取消对外资自由流动的各种障碍以及国有企业私有化、取消政府对企业的管制等。

美国人给拉美开的药方,中国会承诺照做?仅仅从常识判断就知道不可能,这个就不展开了,上面的链接有中国入世承诺原文,里面根本没有提到华盛顿共识,这是个谣言,中国不可能做这个承诺。

美方把其希望中国入世后“经济自由化”的意图简化成“华盛顿共识”,并且声称中国做了承诺,这是舆论战的一部分。


同样的谣言还有“国外电影国内发行自由化”,想想中国有可能做这样的承诺吗?

中国会让国外电影在中国随便发行?如果是那些带有高度意识形态的电影呢?

在入世承诺的5.15 视听服务的承诺中写的很明确:

“电影:自加入时起,允许以利润分成的形式每年进口20部外国电影用于影院放映。 ”

“音像制品:在不损害中国审查音像制品内容的权利的情况下,允许外商在中国设立合作企业,从事音像制品的分销(不包括电影)”

每年进口20部分账片,这个没有做到么?下图来自东方证券,实际上我国每年进口分账电影大大超过20部的承诺。

基金会的表格里面先写个电影自由发行,然后再写个没有做到承诺,这个就是传播虚假信息。


美方真正的意思是,目前能够进入中国的电影都是要中方审批的,而且有的片段还要按照中方的意志进行修改,比如碟中谍3在进入中国院线播放时,中方要求删掉了一些镜头,例如汤姆克鲁斯闯入一户中国家庭,里面的中国人呆若木鸡的样子,就被中方要求删掉了,

电影引进需要审查,这不符合他们的期望,指责中国违背了入世承诺,而中国认为按照承诺满足20部的数量就可以。


同样的谣言还有“国企市场份额逐渐减少”,这个并不在中国的入世承诺中,国企是中国政府手中的根基,我国经济制度是以公有制为主体的形式,怎么会承诺要减少呢?

这么多行业,究竟是承诺了哪个行业的国企市场份额要逐渐减少?

如果是本来国企份额就低的行业,为什么要承诺减少?

如果是国企份额比较高的行业,究竟在多少份额以上就要承诺减少?

如果某些国企本身的竞争力就是强,也要强行将其份额减少吗?

从这些问题可以看出,如果有减少国企市场份额的承诺,一定会是有非常具体的细则,规定了具体的行业,具体是哪个份额线之类,实际上这些内容根本就不存在于入世承诺中。


我们再看第二类,中国其实做的还算可以,但是说中国没有做到的。

典型的就是“盗版及侵犯知识产权行为显著减少”,

中国的入世承诺里面有很大的篇幅讲知识产权保护,包括立法,商标,专利,执法等等,但是并没有承诺“显著减少”,当然美方如果理解成在入世条款中要求中国采取这些措施,其实就是要“显著减少”侵犯知识产权的行为,我觉得也可以,毕竟最终还是要看结果。


但其实即使我们完全不懂专业条文,也不了解经贸活动,

就凭我们的实际生活体验,也可以看出来,那个“盗版及侵犯知识产权行为显著减少”是的确的事情,为啥要写个没有履约呢?

还记得十年前的中国互联网环境吗?盗版的电影,音乐,境外综艺节目到处都可以下载,随便一个网站都可以听音乐看电影,上映的电影很快就会在网上出现枪版。

现在的话,你想看电影只能去电影院,想听歌只能用网易音乐,QQ音乐之类的大型互联网公司的软件。


我记得十年前中国非常流行BT下载,这是P2P的下载模式,那个时候国内还有大型的网站和下载软件,像是BT中国联盟,当然还有影响更大的VeryCD电驴下载,这个相信大家都有印象,我自己也用BT下载过东西,后面这些网站和软件因为盗版问题全部关掉了。

还记得当时国内论坛上到处都是“楼主,求种子”“留图不留种”之类的留言。

我找了个2009年的网友回帖,听说VeryCD要关闭,发帖诉苦,说每天工作回家后唯一的娱乐就是在VeryCD下载电影,电视剧看,希望不要关掉。

十年前想看美国电影,看美剧到网上下载就好了,现在只能去电影院,或者在优酷,搜狐之类的视频网站收看美剧了,而且往往是要付费的。

不过从另一方面讲,你想找反面例子也可以找得到,

最为典型的就是“乔丹”商标,直到2020年才一审败诉,但是这个商标其实是2000年申请的,是属于历史遗留问题了。

像Windows的盗版,现在在国内也还依然存在。


但总的来说,中国人的收入水平在迅速提高,越来越厌恶山寨商品和盗版,像是十年前主导中国市场的山寨手机,就逐渐退出了市场,同时消费者对于原创,正版,品牌以及付费会员订阅的接受度也在越来越高,再继续搞仿制品,山寨品,市场空间在越来越小,中国企业也在越来越重视原创和技术研发,因为山寨之路越来越走不通了。

在这个历史大潮下,你说中国侵犯知识产权的现象在越来越多,那显然是不符合事实的,也是不符合逻辑的,就拿运动鞋来说,国产品牌安踏,李宁等销售额迅速扩大,远快于市场的增长,说明品牌鞋在挤占山寨鞋的空间。


像汽车消费,过去的十年间消费者购买的汽车均价在越来越贵,越来越注重品牌,10万元以下的汽车市场占比越来越低,处于低端的自主品牌汽车受到了很大冲击,市场份额下降,这些都是现实的已经发生的事情。

你说哪个车企还不知道搞自主研发提升品牌价值,说实话那是自寻死路。


我们也可以看下OECD(经济合作与发展组织)组织发布的两张图,中国对美国支付的知识产权费用,图1A中显示了中国为使用美国知识产权支付的款项,从1999年的7.55亿美元增长到2017年的83亿美元——增长了11倍多。

而根据图1B所示,中国对美国的知识产权使用费(蓝线)增长快于中国的GDP(红线)。说明支付的知识产权费用占GDP的比例在提高。

当然,对于美方来说,他要想找中国侵犯知识产权的现象,也并不困难,比如说“莆田鞋”,山寨奢侈品牌箱包,现在依然是存在的,但此种现象,在其他国家尤其是落后的发展中国家也大量存在,所以说这个东西,就是打口水仗,我说你做的不好,我说我在进步,大家各自为了自己的利益。

就中国而言,人均今天已经突破一万美金,人民生活水平和企业科技水平不断提高,不断加强知识产权保护已经是历史大势了,不然的话我们的原创设计和技术将会受到伤害,也不利于产业升级,会导致我们无法跨入发达国家门槛。我国不会逆这一历史潮流而动。


另外还有个典型的,就是指责中国没有向国外生产商开放通信市场,但是实际上外资从中国的通信市场获取了海量的利润。

这个指责因为和我们普通人的感觉是相符合的,我们生活中确实没有看到外国的电信运营商在中国运营,因此会本能的觉得中国确实就是违背了入世承诺。


这个其实是这样的,首先在中国入世承诺的5.14条里面,没有任何一条是承诺外资电信运营商独资,最高只允许外资占比49%和50%。

原文如下,嫌长的可以跳过:

增值电信服务

该项服务包括如下类别:电子邮件、语音邮件、在线信息和数据检索、电子数据交换、增值传真服务(包括储存和发送、储存和检索)编码和规程转换、在线信息和/或数据处理(包括交易处理)。

允许外商在上海、广州和北京设立合资增值电信企业,并在这些城市内提供服务,无数量限制。合资企业中的外资不得超过30%。

在入世后1年内,地域扩大至包括成都、重庆、大连、福州、杭州、南京、宁波、青岛、沈阳、深圳、厦门、西安、太原和武汉,但外资持股比例不得超过49%。

入世后2年内,将取消地域限制,但外资持股不得超过50%。


基础电信服务(传呼服务)

入世时允许外商在上海、广州和北京设立合资企业,并在这些城市内及其之间提供服务,无数量限制,但合资企业中的外资不得超过30%。

于入世后1年内,地域扩大至包括成都、重庆、大连、福州、杭州、南京、宁波、青岛、沈阳、深圳、厦门、西安、太原和武汉市内及这些城市之间的服务,但外资持股比例不得超过49%。于入世后2年内,将取消地域限制,外资持股不得超过50%。


移动话音及数据服务

加入时,允许外商在上海、广州、北京设立外方持股比例不超过25%的合资企业,在这些城市内及三者之间提供服务,无数量限制。

于入世后1年内,扩展至成都、重庆、大连、福州、杭州、南京、宁波、青岛、沈阳、深圳、厦门、西安、太原和武汉市内及这些城市之间的服务。外资持股可增至35%。

于入世后3年内,外资持股可增至49%。

于入世后5年内,取消地域限制。


国内及国际服务

国内业务包括:语音服务、分组交换数据传输业务、电路交换数据传输业务、传真服务、国内专线电路租用服务。

国际业务包括:语音服务、分组交换数据传输业务、电路交换数据传输业务、传真服务、国际闭合用户群话语音和数据服务(允许使用专线电路租用服务)。

于入世后3年内,允许外商在上海、广州、北京设立外方持股比例不超过25%的合资企业,并在这些城市内和三者之间提供服务。

于入世后5年内,地域扩展至成都、重庆、大连、福州、杭州、南京、宁波、青岛、沈阳、深圳、厦门、西安、太原和武汉市内及这些城市之间,外资持股比例可增至35%。

于入世后6年内,取消地域限制。外资持股比例可增至49%。


我们在日常生活中虽然没有看到外国运营商在中国大规模运营,但是我国三大运营商都有外资持股,中国移动,联通,电信都在香港上市,并且都在美国证券交易所通过存托股份上市,都有外资持有股份,下图是中国移动官网的上市股票,在香港上市+美国存托股份。

当然今年1月,特朗普政府通知中国三大运营商都在美国下市了。



下图是中国电信2020年12月31日的股权结构,各个国有企业股权占比82.85%,有17.15%开放给公众持股,其中十大股东的BlackRock(贝莱德集团),The Bank ofNew York Mellon corporation都是美资机构,中国这么庞大又有高额利润的电信市场开放了一部分给外资持股,实际上不只是中国电信,中国移动,中国联通都有美资股东,每年通过分红是可以获得固定收益的。

下图是中国联通的股权结构,其香港上市公司开放了20.1%的股权给公众投资者,其中腾讯,阿里,京东等都有投资,而这些公司背后都有美资股权,当然也有美资也可以直接在香港投资。

反过来我们可以看下美国的AT&T运营商的股权结构,并没有中方资本。


实际上你很难想象中国三大运营商在欧美建立大规模的通信网络,或者中国资本大规模的持有美国运营商的股权,光是所谓国家安全审查这一关就过不去。

同样的还有通信设备和企业IT市场,


长期以来美国是全球最大的通信设备和企业IT市场之一,

但中国的华为和中兴被严格的挡在美国市场之外,长期试图进入美国市场而不能,我们也知道在通信设备市场华为+中兴占了全球市场差不多40%的份额,却无法进入美国市场,这不得不说很可惜,

而美国的思科之类的设备厂家则一直在中国市场有销售,可以说在这一块双方就是不对等的。


除了通信设备和企业IT市场,还有很大的一块市场就是美国的智能手机市场,

美国的智能手机公司苹果的产品可以在中国市场正常销售,

苹果公司仅仅在2021年的第一财季(也就是2020年的Q4),因为其新款iPhone 的上市,加上华为旗舰机因为芯片被禁销量下滑,苹果该季度在大中华区的销售金额就高达213.13亿美元。注意这是一个季度的销售额就超过200亿美元,不是一年。

光是这一项美国就能从中国市场赚走巨量的利润。相反中国综合实力最强的华为智能手机,即使在被制裁之前,也因为无法在美国和运营商合作销售,导致几乎无法进入美国市场。


在互联网公司方面,美国的谷歌及其旗下的youtube,Facebook及其旗下的WhatsApp等因为各种原因现在无法在中国市场运营,这也是美方不断指责中国的一个点,

但是一方面,涉及到中国法律遵从和意识形态问题,

另一方面,中国虽然没有对美资互联网公司开放市场,但是中国的互联网巨头的股权却大量的被包括美资在内的外资持有,外资通过持有中国互联网巨头的股权,充分的享受到了中国超大的互联网市场发展的红利,从中获取了巨额的利润,而中国并没有对此进行行政干预。

相反中国资本却很难成为美国大型互联网公司的主要股东,

你能想象中资成为谷歌,推特,Facebook的大股东吗?先不要说到美国政府审查了,光是这些意识形态强烈的公司自身就不会允许,这是超出商业范围以外的考量了。


典型的就是美国雅虎公司(现在是Altaba了)长期是阿里的大股东,阿里可以说是拯救雅虎的大救星。

2012年,雅虎时任CEO汤普森和阿里巴巴达成了一项转让股权的交易。

阿里巴巴集团斥资76亿美元(其中包括63亿美元现金和8亿美元的阿里巴巴优先股),从雅虎手中回购了20%的本公司股权。

2014年10月,雅虎在阿里巴巴集团IPO交易中,以每股63美元的价格出售了1.4亿股股票,得到94亿美元收入。

中国的互联网巨头,只要一查询,都有美国资本持股,这么一块大蛋糕,美国资本从中是获取了大量好处的,但是反过来,美国的互联网巨头,有没有可能大量让中资机构持股?

要知道,美帝的互联网巨头,动辄市值数千亿美元,也是块大蛋糕。


下图是Facebook的十大股东,并没有中资的存在。




实际上,中资互联网巨头的股权大量被外资持有股权,这个情况对于近几年新崛起的互联网巨头依然存在,像去年9月份当特朗普政府在强迫Tik Tok出售时,美国媒体如CNBC披露美资拥有字节跳动大约41%的股权,美国媒体因此认为由于字节母公司的股权大量被美资持有,因此其旗下的TikTok美国公司只要再出售一部分股权,就能够形成美方控股的局面。

要知道字节跳动旗下的TikTok可以说是中国出海最为成功的应用了。


互联网企业是目前中国最为赚钱的行业,外资的获利有多么丰厚呢?除了上面雅虎的例子,

2021年4月8日港股盘前,腾讯控股发布公告,称公司接获Prosus(腾讯控股股东,由南非Naspers拥有大多数股权)通知,Prosus全资附属公司MIHTC已于2021年4月8日与配售代理订立配售协议,将按总价1141.7455亿港元(约合人民币959.4亿元)出售总计约1.92亿股股份,占已发行股份总数约2%。

在此之前,Prosus间接持有约29.61亿股腾讯控股股份,占已发行股份总数约30.87%。减持完成后,Prosus间接持有腾讯控股股份将减少至27.69亿股,占已发行股份总数约28.86%。Prosus是一家控股公司,用来持有南非投资公司Naspers(南非报业)的国际互联网资产。


想一下,出售仅仅2%的股份就获利差不多1000亿人民币,而出售之后手中还有接近29%的股权,这个获利还不够大吗?

腾讯的第一大股东Naspers(通过Prosus持股腾讯),其在南非的上市公司,大约30%的股权和分红属于北美投资者,股权持有比例仅次于南非的机构股东。


因此总的来说,中国的通信市场,

通过三大运营商开放让外资直接和间接持有部分股权;

通过运营商的通信设备市场也对外开放购买;

通过开放国外终端品牌苹果等公司在中国市场正常销售;

通过开放国内互联网巨头让外资大量持股,

国内市值最高的两大巨头阿里,腾讯的第一大股东都是外资,而如果再看美团,字节跳动,快手,百度等,也都有外资持有不少股权。

中国市场实际上让外资获得了巨额的收益,指责中国没有开放通信市场,并不是说外资从中国通信市场赚不到钱,实际上还是因为利益,觉得还想要更多,跟中国讨价还价罢了。


我们再看第三类,那就是中国确实或者至少是看起来是有改进空间的,但是我们要理解背后的客观原因和利益博弈。

这个我们可以看下世贸组织总干事的评价。

2011年,中国正值入世十周年,WTO时任总干事拉米前来中国参加纪念活动。他公开表示中国入世后的表现是A+(Aplus),同时表示中国履行了规则,虽然并没有做到100%,毕竟规则的理解有时存在争议,没有哪个世贸组织成员的履行是尽善尽美的。


在几年后,2018年2月19日召开的由联合国贸发会议举办的日内瓦对话会上,

已经卸任的拉米指责了美国对世贸组织规则的破坏,指出世贸组织成员需要做好一个没有美国的世贸组织的思想准备。

谈到中国时,他说:“中国没有欺骗,美国在这一点上错了,中国遵守了她当年签下的WTO承诺不过,中国非常有效地使得WTO纪律并没有象以往约束老成员那样能够约束中国,特别是在补贴与政府采购领域。

以中国今天在世界经济中的体量,中国没有开放政府采购市场,这很不公平。在这方面,美国确实有权说这有些不平衡。这些问题应该被广泛认识,并且开展坦诚的对话。

注意拉米提到了两个东西,一个是政府采购,一个是补贴,

可以说是委婉的认为中国在这两方面还需要改进,不过拉米也说了中国是在利用规则保护自己的利益。


先看在政府和国企采购平等对待方面,这一条我们确实做了承诺,在入世承诺文本里面:

6.2 政府采购

中央和地方各级所有政府实体,以及专门从事商业活动以外的公共实体,将以透明的方式从事其采购,并按照最惠国待遇的原则,向所有外国供应商提供参与采购的平等机会,即:如一项采购向外国供应商开放,

则将向所有外国供应商提供参加该项采购的平等机会(例如,通过招标程序)。此类实体的采购将只受已公布,且公众可获得的法律、法规、普遍适用的司法决定、行政决定以及程序(包括标准合同条款)的约束。

在加入后成为《政府采购协定》的观察员,跟踪有关活动。一旦条件具备,尽快开始加入谈判。


在入世协定书的第三条里面也有提及:

第3条非歧视

除本议定书另有规定外,在下列方面给予外国个人、企业和外商投资企业的待遇不得低于给予其他个人和企业的待遇:

(a)生产所需投入物、货物和服务的采购,及其货物据以在国内市场或供出口而生产、营销或销售的条件;及

(b)国家和地方各级主管机关以及公有或国有企业在包括运输、能源、基础电信、其他生产设施和要素等领域所供应的货物和服务的价格和可用性。


也就是说,政府采购也好,国企采购也好,不歧视外资企业。

在实际操作中,我国政府和国企采购是不会排除外资参与的,当然实际上是不是倾向于国产,这个大家心中有答案,举个例子在中美关系形势变化下,你要说采购美国产品的时候纯从商业出发考虑,不考虑安全问题是不可能的。

但实际上国内学者统计到2018年的记录,中国却从来没有在这方面被其他国家申诉过。


我查询了国内学者对此的研究,简单的说,两个原因,

第一点是ITIF基金会的报告中提到的“国企基于商业考虑采购”的承诺是“中国特殊条款”,大多数国家都没有此承诺,

美国也没有,其实对中国并不公平。

像美国政府在采购方面对中国厂家限制就很严厉,中国航天科技,航天科工不可能拿到NASA的火箭发射合同,甚至都没有资格参与竞标,更不要说和SpaceX拥有平等的待遇,当然美国人也有理由,毕竟他们说自己入世时又没有做过相关承诺。

第二点是,又因为是中国的特殊条款,所以世贸组织并没有具体的规则来针对这一条进行管理和约束,所以中国加入WTO后,从来没有在此领域败诉过,实际上有国内学者查询了WTO的卷宗,直到2018年也没有发现有国家或者企业就这条对中国进行起诉,因为缺乏具体规则和过硬的证据。

这也是前WTO总干事拉米说的“中国没有欺骗…..(但中国)非常有效地使得WTO纪律并没有象以往约束老成员那样能够约束中国”。


当然即使这样,这一条中国近年来在不断想办法优化,以扩大对外资的吸引力,例如为保障外资企业平等参与政府采购,2020年1月1日实施的《外商投资法》明确规定,国家保障外商投资企业依法通过公平竞争参与政府采购活动。政府采购依法对外商投资企业在中国境内生产的产品、提供的服务平等对待。



类似的还有出口补贴显著减少,注意即使在美国ITIF基金会的报告中,

也列明了中国的承诺只是出口补贴要显著减少,并不是完全取消。

而在中国做出的入世承诺中,也明确写明了在取消WTO《补贴与反补贴措施协定》第3条规定的补贴的同时,中国会保留超过20个出口补贴项目,并且有的补贴项目还会在后续通知WTO,也就是说并不是完全取消出口补贴,而是会保留相当一部分。


在入世承诺中,我国对出口补贴的承诺只是部分取消:

3.12 出口补贴

需取消的补贴

我国承诺遵守WTO《补贴与反补贴措施协定》,逐步取消与规则不符的补贴措施。


在加入时取消所有属于《补贴与反补贴措施协定》第3条禁止的以出口实绩为条件而给予的补贴,如以出口实绩为基础优先获得外汇和贷款等补贴项目。

为此,在不迟于加入时,停止维持所有先前存在的出口补贴计划,并自加入时起,停止在此类计划下作出额外支付或支出,也不再免除税收或授予任何其他利益。这一承诺涵盖各级政府在法律上或事实上所给予的补贴。


自加入时起,取消所有属于《补贴与反补贴措施协定》第3条禁止的视使用国产货物替代进口货物情况而给予的补贴。

注:中国在议定书附件5B中提交了属《补贴与反补贴措施协定》第3条范围内的禁止性补贴清单及其取消时间表。

与此同时,中国保留约20个补贴项目,并在议定书附件5A中列明。我国可以保留和实施的补贴项目并不局限于这些项目,有些尚未通知WTO的补贴项目,中国将逐步收集有关信息,改进补贴的通知工作。

在可申诉的补贴方面不享受发展中成员的优惠待遇


在这里要说明下,出口退税并不是出口补贴,因为出口商品在对方国内还是要征税的。

争议点在于,中国的出口补贴是不是“显著的减少”了?

关于出口补贴,我们说几个事实,

第一点,如果在出口补贴方面,认为中国的做法有问题,

完全可以在WTO框架内进行上诉,中国一向维护全球多边机制,维护全球化的局面,中国对于WTO的判决是认账的,也是会执行的。

我国之前稀土资源大量廉价出口,造成了不少问题,之后我国在2010年采取了稀土出口配额制,结果被美国投诉到了世界贸易组织,最终中国败诉,结果中国商务部发布的《2015年出口许可证管理货物目录》,明确稀土出口执行出口许可证管理,仅需企业拿出口合同申领出口许可证即可。这也意味着稀土出口配额正式取消。

说实话,这其实是对保存我们宝贵的稀土资源是不利的,但还是执行了判决。




第二点,背后还有利益博弈的问题,在要求中国取消部分出口补贴的同时,欧盟和美国却坚持不承认中国市场经济地位,以此可以继续保持对部分中国产品征收反倾销关税的权利,而认定反倾销的方式,是通过和第三国替代价格进行比较,这对中国其实是不公平的。


这一点中国和欧美对待入世文本的理解不一致,中国认为是入世15年后自动获得市场经济地位,也就不再用第三国替代价格判定,在中国发布的入世承诺中文版中有这样的条款:

3.15 WTO成员对中国产品的反倾销条款
WTO成员承诺,在中国加入后15年内完全取消目前在对中国出口产品进行反倾销调查时使用第三国替代价格的做法。议定书规定,在此过渡期内,WTO成员仍可以对中国出口产品使用替代国价格计算倾销幅度,但是,只要接受调查的生产企业能够证明,其出口产品是在市场经济条件下生产的,则WTO成员应遵守WTO《反倾销协定》,采用被调查产业的国内生产成本计算倾销幅度。
上述过渡性条款的模式也适用于反补贴措施。


在中国加入世贸组织议定书(标准中文版全文)

第15条(d)条款中是这么写的:

一旦中国根据该WTO进口成员的国内法证实其是一个市场经济体,则(a)项的规定即应终止,但截至加入之日,该WTO进口成员的国内法中须包含有关市场经济的标准。

无论如何,(a)项(ii)目的规定应在加入之日后15年终止。

此外,如中国根据该WTO进口成员的国内法证实一特定产业或部门具备市场经济条件,则(a)项中的非市场经济条款不得再对该产业或部门适用。

上面提到的(a)项(ii)目是这么规定的。

(ii)如受调查的生产者不能明确证明生产该同类产品的产业在制造、生产和销售该产品方面具备市场经济条件,则该WTO进口成员可使用不依据与中国国内价格或成本进行严格比较的方法。


中国和欧盟和美国就市场经济地位问题进行了较长时间的争议,

分歧点在于中国认为当初协议是说入世15年后中国自动获得市场经济地位,而欧盟和美国则认为结合协议上下文并没有这个含义,所以到了2016年欧盟和美国都拒绝给予中国市场经济地位,这样可以继续以反倾销的理由对中国出口商品征收高关税。

不承认中国市场经济地位,欧美也有自己的理由,那就是说中国存在出口补贴和倾销,而判断倾销的标准是使用第三国替代价格计算,而不是与中国国内价格或成本进行严格比较,这明显对中国不利,中国对此是反对的,所以这是个利益博弈。


第三点,在利益博弈过程中,为了获取市场经济地位,

中国做出了让步,像纺织,服装和鞋类这种大金额的劳动密集型出口商品,中国都取消了出口补贴。这些产品的出口金额可不小,例如纺织品和服装,中国2020年出口金额就高达2912.2亿美元。

美国在2015年2月,针对中国在7个行业向本国出口企业提供的补贴向世界贸易组织(WTO)提起申诉。这些行业是:纺织、服装和鞋类;先进材料和金属;轻工业;特种化学品;医疗产品;五金建材;以及农业。

2016年中国和美国达成协议,中国取消了以上领域的出口补贴,媒体认为这是中国为了获取市场经济地位做出的让步。


当然有人说了,协议上明面上取消了,谁知道暗地里有没有继续做呢?

其实是这样的,如果继续这样做,至少在国家法律法规遵从层面,是贸易不合规的,继续这样做就会有合规风险,相比之前一定是会有改善的。而且中美都达成了协议,你说中国一点都不会执行,一点都不会改善,觉得有可能吗?中国对于自己签署的国际协议一向履行还是不错的。




再重复一下,中国从来没有在入世文件中承诺取消所有的出口补贴,即使是美国ITIF基金会的报告也只是说中国承诺出口补贴会显著减少,而不是取消。

中国也在入世后的确逐渐取消了一些行业的出口补贴。

但究竟是不是达到了“显著减少”的标准,如果有争议,是可以到WTO申诉的,中国对于WTO的判决,一向还是认账的,因为中国目前是国际多边体制的维护者,像上面七大行业的出口补贴,美国申诉到WTO一年后,中国和美国达成双边协议就取消了。


其实补贴这个东西,全球各国都在搞,比如一些发达国家对农产品的补贴,

美国给波音,特斯拉这些科技企业都有不少补贴,而这两家每年也从美国有出口的。

2020年10月,WTO就裁决美国非法补贴波音,允许欧盟对美国出口的40亿美元商品征税进行报复。这说明,有问题去WTO申诉就好,当然互相之间舆论打嘴仗也是免不了的。


最后,我想再说三个观点,

第一点是我们部分国人要改掉盲目的,不加验证的相信发达国家对我国的指责的毛病,国与国之间的互相指责,都是夹杂着大量的利益诉求在里面的,根本上就是利益博弈。

下意识的就站在对方的立场,宣传对方的观点,这只会对对方的利益有利,而对本国的利益不利。我们就不说中国和外国,就说全球任何两个国家,有一个国家是会很爽快的欣然接受另一个国家的指责的吗?

不会有这样的情况,就跟法庭上的双方辩护律师一样,一定会拼命想办法维护自身的利益。


就不说贸易争端这种和道义关联性不大的事情了,

就说那些道义和是非都非常明显的例子,

根据BBC的报道,美国众议院2012年6月18日全票表决通过,以立法形式向曾经排斥和歧视华人的做法道歉,这一道歉案2011年10月获得美国参议院的通过,但非常明确表明,立法道歉并不会向受到这一排华法案影响的美籍华裔家庭索赔提供依据。

嗯花了如此漫长的时间才正式道歉,而且还剥夺了华裔的索赔权,可见其对自身利益的维护。

再以中国二战劳工起诉日本公司奴役和强迫劳动,数千人被强迫劳动折磨致死,可以看下在漫长的历时一二十年甚至更久的起诉过程中,日本政府,法院和公司是如何拼命的为自己辩护,拒不承认中国劳工的索赔权,维护自己的利益的。


以上可以看出,国与国之间即使道义曲直非常明显的事情,也不会存在一方会欣然的爽快的接受对方观点的情况,都会想尽办法为自己的利益着想。

更何况中国和西方国家的交往,我们能对西方做出什么违反人类基本道义的事情的么,

难道我们还能不经联合国授权派兵到西方国家领土,或者派空军轰炸西方国家?我们和西方国家也没有领土争端,说白了主要还是经济利益冲突。

两个国家有利益博弈和争议,是很正常的事情,必须要学会站在本国的立场考虑问题。


第二点,西方并不在道义上比中国高,要学会甄别他们的舆论话语。

发达国家舆论宣传机器能力很强,因此他们会创造性的使用一些简单易懂的总结性语句进行传播,例如“中国违背入世承诺”“中国破坏国际秩序”“中国在非洲制造债务陷阱”之类,

这其中无一不是把中国放在道义低点的位置,而把自己放在道义高点的位置,

这些短语易于传播,通俗易懂,能对中国造成很大的舆论压力,但是却和事实有很大的背离,双方真正的道义位置也并非如此。

我们要学会去甄别哪些是对方无中生有的抹黑进行舆论战造势,

哪些是对方不合理的指责,比如中国其实做的不错但非说我们做的不好的,比如全球各国都做的不太好,包括他自己都做的不好但就是专挑中国来打击的,

哪些是属于合理的争议范围,双方可以通过双边或者国际框架下协商解决的,

而绝不是全盘的接受。


第三点,对于国际规则,由于规则以及各国实际情况的复杂性,没有任何一个国家是可以做到100%的不违规的,

就以WTO为例子,欧盟,美国,中国作为全球贸易大户都有各种被起诉和败诉记录,

世贸组织贸易争端申诉胜率一般很高,一般在90%左右,这意味着被起诉基本意味着败诉。

而美国是WTO历史上被起诉次数最多的国家,遥遥领先,当然被起诉的案件大部分败诉。

尤其是从2017年8月-2018年7月,美国被WTO成员国起诉次数高达17次,创下了12个月内单一成员被起诉次数的纪录。其中有两起案件分别是中国诉美国301关税案和232关税案,其余15起是其他WTO成员对美起诉。

欧盟国家则在累计被起诉次数上排全球第二位,欧盟也是大部分被起诉案件中败诉。

下图来自对外经济贸易大学教授崔凡的统计,从1995年1月-2019年12月的被诉次数,美国155次遥遥领先,欧盟85次排第二。

那么中国在WTO被起诉多少次呢?下图来自位于美国的研究机构ChinaPower的中文官网,从2002年-2019年,中国总共被申诉了44次,申诉别人21次。


美国,欧盟,中国都有违规被申诉的记录,而且中国次数还更少些。

不过更有意思的是,中国作为申诉方或被诉方时共参与过65次争端解决。这其中大部分(81.5%)是与美国(39次)和欧盟(14次)进行的。中国被诉的案件52.2%由美国发起,而中国发起的21次申诉中有76%都针对美国,主要就是和美国对着干。


中国是全球多边机制维护者,从联合国,到世界卫生组织,到世界贸易组织,你都能看出中国都是支持这些国际组织发挥作用,反对美国退群另外搞小团伙的,反而是美国国内有强大势力总是想闹着以退群来威胁国际组织按照自己希望的方式改变。

把中国说成是故意不遵守国际规则,不遵守承诺的低道义值国家,这在逻辑上就说不通,因为中国明显是全球化和多边体制的维护者而非破坏者。


如果中国真的频繁的,故意的,大量的违反国际规则和破坏自己的承诺,

一方面中国会在国际组织中遭遇世界各国的申诉,

而实际情况看主要压力其实就是来自美国

除了上文的ChinaPower统计的2002-2019年的数据外,我们也可以看下2012年12月发表的《国际经济与政治》上的文章《中国与世界贸易组织争端解决机制》,

统计 2002 -2011年10 月5 日,全球申诉过中国的 WTO 成员只有 5 个,其中美国对中国申诉 12 件,欧盟对中国申诉 5 件,墨西哥对中国申诉 3 件,加拿大对中国申诉 2 件,危地马拉对中国申诉 1 件,总共23件,美国就占了超过50%。

由于对中国申诉的多起案件其实是同一个议题,所以除了单独由欧盟提起的两起案件外,美国实际上参与了对中国申诉的所有案件,占比高达91%。


另一方面如果中国真的频繁故意违反WTO规则,说明中国应该会对目前的WTO主导的国际多边贸易体制非常不满才对,而事实上中国是明显的维护者。

像美国在特朗普政府时期,成为WTO的最大反对者,

以2020年为例子,2020年4月,一份针对美加两国贸易纠纷且对加拿大有利的裁决结果在世贸组织(WTO)出炉,但特朗普政府却发声明表示,没有遵守这份裁决的义务,实际上特朗普政府还多次威胁要退出WTO。


尤其是美国从2018年开始逐步对我国数千亿美元商品加征关税,对我国造成了较大的负面影响,损害了我国的利益,是完完全全的违反国际规则,

2020年9月,WTO也裁定美国对中国加征关税是违法贸易规则的,但美国对此表达强烈不满,甚至威胁要退出WTO,这并不只是特朗普政府的问题,美国现在已经是拜登政府了,也并没有打算取消关税执行判决,这也是在违反国际规则。

今天只是简单的聊聊中国和国际规则,国际秩序的关系,

总之我们要理解世界的复杂性,学会甄别他国的声音,并且站在中国的立场说话,是我们需要坚持做到的事情。

件被看作是 JavaScript 与网页之间交互的桥梁,当事件发生时,可以通过 JavaScript 代码(函数)执行相关的操作。例如,用户可以通过鼠标拖曳登录框,改变登录框的显示位置;或者在阅读文章时,选中文本后自动弹出分享、复制选项。本章将对 DOM 中的事件进行详细讲解。

事件处理


事件可被理解为是 JavaScript 侦测到的行为,这些行为指的就是页面的加载、鼠标单击页面、鼠标滑过某个区域、按下键盘等具体的动作,它对实现网页的交互效果起着重要的作用。在深入学习事件时,需要对一些非常基本又相当重要的概念有一定的了解。


  • 事件处理程序


事件处理程序指的就是 JavaScript 为响用户行为所执行的程序代码。例如,用户单击 button 按钮时,这个行为就会被 JavaScript 中的click 事件侦测到;然后让其自动执行,为 click 事件编写的程序代码,如在控制台输出“按钮被单击了”。


  • 事件驱动


事件驱动是指,在 Web 页面中 JavaScript 的事件,侦测到的用户行为(如鼠标单击、鼠标移入等),并执行相应的事件处理程序的过程。

事件绑定


事件绑定指的是为某个元素对象的事件绑定事件处理程序。在 DOM 中提供了3种事件的绑定方式。下面将针对以3种事件绑定方式的语法以及各自的区别进行详细讲解。

行内绑定方式


事件的行内绑定式是通过HTML标签的属性设置实现的,具体语法格式如下。

<div onclick="alert('handle click')"></div>

在上述语法中,div 可以是任意的HTML标签,如 <button>、<input>标签等;事件是由 on 和事件名称组成的一个 HTML 属性,如单击事件对应的属性名为 onclick;事件的处理程序指的是 JavaScript 代码,如匿名函数等。

需要注意的是,由于开发中提倡 JavaScript 代码与 HTML 代码相分离。因此,不建议使用行内绑定事件。

动态绑定方式


动态的绑定方式很好地解决了JavaScript代码与HTML代码混合编写的问题。在JavaScript代码中,为需要事件处理的 DOM 元素对象,添加事件与事件处理程序。具体语法格式如下。

div.onclick=function handleClick () {
  console.log('handle click');
};

在上述语法中,事件的处理程序一般都是匿名函数或有名的函数。在实际开发中,相对于行内绑定来说,事件的动态绑定的使用居多。

行内绑定与动态绑定除了实现的语法不同以外,本质是相同的,都是给 DOM 元素绑定了一个 onclick 属性。

标准的绑定事件方式


为了给同一个 DOM 对象的同一个事件添加多个事件处理程序,DOM中引入了事件流的概念,可以让DOM对象通过事件监听的方式实现事件的绑定。由于不同浏览器采用的事件流实现方式不同,事件监听的实现存在兼容性问题。通常根据浏览器的内核可以划分为两大类,一类是早期版本的IE浏览器(如IE6~8),一类遵循W3C标准的浏览器(以下简称标准浏览器)。

接下来,将根据不同类型的浏览器,分别介绍事件监听的实现方式。


(1)早期版本的IE浏览器


在早期版本的IE浏览器中,事件监听的语法格式如下。

DOM对象.attachEvent(type,callback);

在上述语法中,参数 type 指的是为 DOM 对象绑定的事件类型,它是由 on 与事件名称组成的,如 onclick。。参数 callback 表示事件的处理程序。


(2)标准浏览器


标准浏览器包括IE8版本以上的IE浏览器(如IE9~11),新版的Firefox、Chrome等浏览器。具体语法格式如下。通过这种方式我们可以给元素注册多个事件处理函数,而 btn.onclick=fn 是赋值操作只能设置一个事件处理函数。

DOM对象.addEventListener(type, callback, [capture]);

在上述语法中,参数 type 指的是 DOM 对象绑定的事件类型,它是由事件名称设置的,如 click。参数 callback 表示事件的处理程序。参数 capture 默认值为 false,这个属性后面单独介绍,一般情况我们都使用它的默认值。

现在 IE 浏览器已经被淘汰,所以我们不需要再去记忆 attachEvent() 的用法,但是我们需要了解过去,过去在使用这种方式注册事件的时候需要处理浏览器的兼容性,下面我们演示下:

function addEventListener(element, type, listener) {
  // 能力检测: 就是要看当前的浏览器是否支持此标签对象的属性或是方法
  if (element.addEventListener) {
    element.addEventListener(type, listener, false);
  } else if (element.attachEvent) {
    element.attachEvent('on' + type, listener);
  } else {
    element['on' + type]=listener;
  }
}
  • 事件处理函数中的 this

在事件处理函数中的 this 指向当前触发该事件的 DOM 元素。

link.onclick=function handleLink () {
  photo.src=this.href;
  p.textContent=this.title;
  return false;
};

但是通过行内绑定注册的事件,调用的函数中 this 指向的是 window。

<button onclick="handle()">按钮</button>
<script>
  function handle () {
    // 此处的 this 指向 window
    console.log(this);
  }
</script>

行内绑定事件 onclick="handle()" 中的 "" 双引号内部其实可以看做是一个匿名函数,"" 双引号内部的这个匿名函数才是事件处理函数,在事件处理函数中又调用了 handle() 方法。

<!-- 此处的 this 指向的是触发事件的对象 button -->
<button onclick="handle(this)">按钮</button>
<script>
  function handle (btn) {
    // 此处的 this 指向 window
    console.log(btn);
  }
</script>

解除事件

绑定事件的元素可以解除绑定,例如:我们可以让按钮点击一次之后解除事件绑定。三种绑定事件的解除事件的方式不同,下面我们分别来介绍。

行内绑定事件和动态绑定事件本质上都是给 DOM 元素设置 onclick 属性,对应的解除绑定事件的方式都是把 onclick 属性重新设置为 null。

  • 解除行内绑定的事件

当按钮执行完点击事件的处理程序后立即解除事件的绑定

<button onclick="handle(this)">按钮</button>
<script>
  function handle (btn) {
    alert('Hello');
    btn.onclick=null;
  }
</script>
  • 解除动态绑定的事件
btn.onclick=function handle () {
	this.onclick=null;
};


  • 解除标准绑定事件的方式


标准绑定事件使用 addEventListener(type, callback, [capture]); 方法,对应的解除绑定使用的方法是 removeEventListener(type, callback, [capture]),需要注意的是,如果注册的事件需要解除的话,使用 addEventListener() 注册事件的时候,传入的 callback 不能是匿名函数,因为解除事件绑定的时候还需要引用这个函数。

const div=document.querySelector('#div');

div.addEventListener('click', handle);

function handle () {
  alert('hello');
  this.removeEventListener('click', handle);
}

事件流


我们已经会使用 addEventListener(type, callback, [capture]),方法给元素注册事件,但是这个方法的第三个参数的作用我们还不清楚,下面我们就来介绍该方法的第三个参数,这里我们需要先来学习 DOM 中的事件流(事件模型)。


DOM (文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为 DOM 事件流。


事件顺序有两种类型:事件捕捉和事件冒泡。


事件冒泡(Event Bubbling)


这是 IE 浏览器对事件模型的实现,也是最容易理解的。冒泡,顾名思义,事件像个水中的气泡一样一直往上冒,直到顶端。

从DOM 树型结构上理解,就是事件由叶子节点沿祖先结点一直向上传递直到根节点;从浏览器界面视图 HTML 元素排列层次上理解就是事件由具有从属关系的触发事件的元素一直传递到根元素直到文档对象。



addEventListener(type, callback, [capture]),该方法的第三个参数为 false 的时候设置触发事件的方式为事件冒泡,该参数默认为 false

一般情况下,我们都会使用事件冒泡的方式注册事件。


const outer=document.querySelector('#outer');
const inner=document.querySelector('#inner');

outer.addEventListener('click', function () {
  console.log('点击了 outer');
}, false);

inner.addEventListener('click', function () {
  console.log('点击了 inner');
}, false);

document.body.addEventListener('click', function () {
  console.log('点击了 body');
}, false);

document.addEventListener('click', function () {
  console.log('点击了 document');
}, false);

window.addEventListener('click', function () {
  console.log('点击了 window');
}, false);

执行结果:

使用行内绑定和动态绑定事件的方式默认使用的是事件冒泡。


事件捕获(Event Capturing)


Netscape 的实现,它与冒泡型刚好相反,由 DOM 树最顶层元素一直到触发事件的元素。



addEventListener(type, callback, [capture]),该方法的第三个参数为 true 的时候设置触发事件的方式为事件捕获。


const outer=document.querySelector('#outer');
const inner=document.querySelector('#inner');

outer.addEventListener('click', function () {
  console.log('点击了 outer');
}, true);

inner.addEventListener('click', function () {
  console.log('点击了 inner');
}, true);

document.body.addEventListener('click', function () {
  console.log('点击了 body');
}, true);

document.addEventListener('click', function () {
  console.log('点击了 document');
}, true);

window.addEventListener('click', function () {
  console.log('点击了 window');
}, true);

执行结果:


使用行内绑定和动态绑定事件的方式无法使用事件捕获。


DOM标准的事件模型


我们已经对上面两个不同的事件模型进行了解释和对比。DOM 标准同时支持两种事件模型,即事件捕获与事件冒泡,但是,事件捕获先发生。两种事件流都会触发 DOM 中的所有对象,从 document对象开始,也在 document 对象结束(大部分兼容标准的浏览器会继续将事件是捕捉/冒泡延续到window 对象)。


如图:首先是捕获传递事件,接着是冒泡传递,所以,如果一个处理函数既注册了捕获型事件的监听,又注册冒泡型事件监听,那么在 DOM 事件模型中它就会被调用两次。

DOM 标准的事件模型最独特的性质是,文本节点也会触发事件(在IE不会)。


事件委托


事件委托,通俗地来讲,就是把一个元素的处理事件的函数委托到另一个元素。

一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。


举个例子,比如一个宿舍的同学同时快递到了,一种方法就是他们都傻傻地一个个去领取,还有一种方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一一分发给每个宿舍同学。


在这里,取快递就是一个事件,每个同学指的是需要响应事件的 DOM 元素,而出去统一领取快递的宿舍长就是代理的元素,所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。


下面我们来做一个练习,为下面的每一个 li 注册点击事件,当点击当前 li 的时候打印 li 中的文本内容。

<ul id="list">
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
  ......
  <li>item n</li>
</ul>

首先我们用传统的方式来实现,先获取到页面上所有的 li,然后遍历所有的 li,给每一个 li 注册点击事件,这里使用 addEventListener() 注册事件的时候省略了第三个参数,默认为 false,事件冒泡的方式。

这样做不好的地方有两点,第一:我们需要为每一个 li 元素创建一个新的事件处理函数,每次创建都需要销毁时间和内存。第二:当点击按钮往 ul 中添加新的 li 元素的时候需要给新创建的 li 注册点击事件。

const lis=document.querySelectorAll('#list li');
    
lis.forEach(function (li) {
  li.addEventListener('click', function () {
    console.log(this.textContent)
  });
});

下面我们使用事件委托的方式优化上面的代码,把点击事件注册给父元素 ul,当点击 li 的时候通过事件冒泡把点击事件传递给父元素 ul。

const ul=document.querySelector('#list');
ul.addEventListener('click', function () {
  console.log('test');
  // 此处的 this 是注册事件的元素 ul
  console.log(this);
});

代码改完之后点击 li,这段代码确实可以执行,但是我们的目标是打印 li 之间的内容,而通过打印发现此处的 this 不是我们想要的当前点击的 li,而是注册事件的元素 ul。所以这里需要强调一点,在注册事件的时候,事件源是注册事件的对象。


那如何获取当前触发事件的元素 li 呢?当事件被触发的时候事件处理函数会接收一个参数,这个参数叫做事件对象,事件对象可以提供触发事件的时候相关的数据,下一小节详细介绍,这里我们先用事件对象解决当前的问题,事件对象中有一个 target 属性,这个属性就是当前触发事件的对象。

在 IE 浏览器中获取事件对象的方式不同,IE 中是通过 window.event 获取事件对象,以前在获取事件对象的时候还要处理浏览器兼容性问题,IE 浏览器现在已经被淘汰所以浏览器兼容性的处理我们就不再演示。


const ul=document.querySelector('#list');
// 事件参数(对象) e
ul.addEventListener('click', function (e) {
  // e.target 触发事件的元素
  console.log(e.target.textContent);
  // 注册事件的元素
  console.log(this);
});

到这里这个案例就完成了,我们再来扩展下这个案例,如果想要点击特定的 li 来触发事件该如何实现?

<ul id="list">
  <li>item 1</li>
  <li class="cls">item 2</li>
  <li class="cls">item 3</li>
  ......
  <li>item n</li>
</ul>

如上代码,如果想点击具有特性类样式或者特定 id 的元素触发事件,可以通过判断当前点击的元素 e.target 的类样式或者 id 属性进行判断。

if (e.target.className==='cls') {
	// ....
}

但是如果想像 CSS 选择器一样更加灵活的匹配的话,上面的判断不够灵活,这里可以使用 元素.matches(选择器) 来匹配特定元素。当元素匹配指定的选择器返回 true。

const ul=document.querySelector('#list');
ul.addEventListener('click', function (e) {
  // matches 方法,当元素匹配指定的选择器返回 true
  if (e.target.matches('.cls')) {
    console.log(e.target.textContent);
  }
});


利用事件冒泡的特性,将本应该注册在子元素上的处理事件注册在父元素上,这样点击子元素时发现其本身没有相应事件就到父元素上寻找作出相应。这样做的优势有:1. 减少内存消耗,避免重复创建相同事件处理函数,只需要把多个子元素的事件委托给父元素。2.随时可以添加子元素,添加的子元素会自动有相应的处理事件。

案例:购物车删除


  • 需求:
    • 使用事件委托优化移除购物车数据的功能
  • 代码:
const tbody=document.querySelector('tbody');
tbody.addEventListener('click', function (e) {
  // 注册事件的元素 tbody
  // console.log(this);
  // 触发事件的元素(你点击的那个元素)
  // console.log(e.target)
  // 判断元素是否是指定的元素
  // console.log(e.target.matches('.del'))

  if (e.target.matches('.del')) {
    e.target.parentNode.parentNode.remove();
  }
});


事件对象


每当触发一个事件,就会产生一个事件对象 event,该对象包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息。上一小节中我们使用事件对象获取触发事件的元素。


例如:鼠标操作产生的 event中会包含鼠标位置的信息;键盘操作产生的event中会包含与按下的键有关的信息。


所有浏览器都支持 event 对象,但支持方式不同,在标准 DOM 中 event 对象必须作为唯一的参数传给事件处理函数,在 IE 中 event 是 window 对象的一个属性。


  • 事件对象提供的常用成员


成员

描述

备注

type

触发的事件名称


eventPhase

事件流在传播阶段的位置


target

触发事件的元素


srcElement

target 的别名,老版本的 IE 中使用


clientX / clientY

基于浏览器的可视区域,鼠标坐标值

可配合固定定位,基于窗口定位

pageX / pageY

基于整个页面,页面滚动有关,鼠标在页面的坐标值

可配合绝对定位,基于页面定位

key

获取按键输入


preventDefault()

取消默认行为


stopPropagation()

阻止事件冒泡



案例:跟着鼠标飞的图片


  • 需求:
    • 当鼠标移动的时候让图片跟着鼠标走
  • 代码:
    • 因为要改变图片位置,所以让图片脱离文档流
    • 注册 mousemove 事件
    • 改变图片的坐标:鼠标坐标 - 图片大小的一半,让鼠标在图片的中央位置
const img=document.querySelector('#img');
document.addEventListener('mousemove', function (e) {
  // 鼠标位置 - 图片大小的一半
  img.style.left=e.clientX - 96 / 2 + 'px';
  img.style.top=e.clientY - 80 / 2 +  'px';
});

设置样式,让 body 的高度等于 1500px(垂直方向出现滚动条),滚动条下拉这时候移动鼠标,图片的纵向位置跟鼠标脱离。

原因是 clientX 和 clientY 获取的是鼠标在当前可视区域的位置。如果出现滚动条的话可以通过 pageX 和 pageY 获取鼠标在当前文档中的位置。

const img=document.querySelector('#img');
document.addEventListener('mousemove', function (e) {
  img.style.left=e.pageX - 96 / 2 + 'px';
  img.style.top=e.pageY - 80 / 2 +  'px';
});

这里获取图片大小的时候写的是具体值,将来图片替换后,还需要改变这里的大小。我们可以使用 getComputedStyle() 获取图片的大小。


const img=document.querySelector('#img');
img.addEventListener('load', function () {
  const style=window.getComputedStyle(img, null);
  const imgWidth=parseInt(style.width);
  const imgHeight=parseInt(style.height);
  document.addEventListener('mousemove', function (e) {
    img.style.left=e.pageX - imgWidth / 2 + 'px';
    img.style.top=e.pageY - imgHeight / 2 +  'px';
  });
});

注意:这里需要在 img 标签加载完毕后获取图片的大小,否则获取到的图片大小是 0,因为 load 事件代表图片被加载,否则的话代码从上到下执行到这个位置,图片还没有被下载回来,这个时候获取图片的大小是 0。

案例:键盘控制图片移动


  • 需求:
    • 按方向键盘控制页面上的图片往相应的方向移动。
  • 代码:
    • 让图片脱离文档流,翻转 180 的类样式,可以左右移动
    • 监听键盘按下的事件
    • 根据按下的方向键,控制图片的坐标改变 10 像素
#img {
  width: 100px;
  position: absolute;
  left: 0;
  top: 0;
}
.toLeft {
  transform: rotateY(180deg);
}
const img=document.querySelector('#img');
let x=0;
let y=0;
document.addEventListener('keydown', function (e) {
  switch (e.key) {
    case 'ArrowLeft':
      x -=10;
      img.classList.add('toLeft');
      break;
    case 'ArrowRight':
      x +=10;
      img.classList.remove('toLeft');
      break;
    case 'ArrowUp':
      y -=10;
      break;
    case 'ArrowDown':
      y +=10;
      break;
  }

  img.style.left=x + 'px';
  img.style.top=y + 'px';
});

案例:禁止弹出右键和选中文字

// contextmenu 鼠标右键事件
document.addEventListener('contextmenu', function(e) {
  // 禁止点击的默认行为,即显示上下文菜单
  e.preventDefault()
});
// 禁止选中文字事件
document.addEventListener('selectstart', function(e) {
  // 禁止选中文字的默认行为,即不能选中文字
  e.preventDefault()
})

案例:拖拽登录框

  • 需求:
    • 点击弹出登录框,显示登录框和遮罩层
    • 鼠标放到登录框的头部,显示可移动的鼠标样式
    • 单按下鼠标可以拖动登录看的位置,鼠标弹起移除拖动的功能
  • 代码:
    • 当鼠标按下弹出登陆框的a标签的时候,弹出两个层来
    • 单击关闭按钮的时候,隐藏这两个层
    • 当鼠标按下title这个盒子的时候,就能够获取鼠标在盒子中的坐标位置
    • 鼠标在文档中移动的时候,时时的获取坐标,减去在盒子中的坐标,将这个值赋值给login的left和top
    • 鼠标离开的时候,在清空事件处理程序,不要再去触发移动的事件中的事件处理程序了
const loginBg=document.querySelector('#bg');
const loginLink=document.querySelector('#link');
const loginBox=document.querySelector('#login');
const closeBtn=document.querySelector('#closeBtn');
const loginTitle=document.querySelector('#title');

loginLink.addEventListener('click', function () {
  loginBox.style.display='block';
  loginBg.style.display='block';
});
closeBtn.addEventListener('click', function () {
  loginBox.style.display='none';
  loginBg.style.display='none';
});

// 拖动事件的三个过程:鼠标按下 mousedowm,鼠标移动 mousemove,鼠标松开 mouseup
const style=window.getComputedStyle(loginBox, null);
// 模态框跟着鼠标走的原理
loginTitle.addEventListener('mousedown', function (e) {
  const loginLeft=parseInt(style.left);
  const loginTop=parseInt(style.top);
  // 步骤一:当鼠标按下时,需要立即得到鼠标在盒子中的坐标
  var x=e.pageX - loginLeft;
  var y=e.pageY - loginTop;
  // 为整个页面添加鼠标移动事件
  document.addEventListener('mousemove', move);

  function move(e) {
    // 步骤二:模态框的left和top等于鼠标在页面的坐标减去鼠标在盒子内的坐标
    // 注意:一定要加上px
    login.style.left=e.pageX - x + 'px';
    login.style.top=e.pageY - y + 'px';
  }
  // 步骤三:鼠标松开时取消整个页面的鼠标移动事件
  document.addEventListener('mouseup', function (e) {
    document.removeEventListener('mousemove', move);
  });
});

常用事件

在这之前我们已经使用过了单击事件、鼠标经过和鼠标离开的事件,浏览器给我们提供的事件种类非常多,下面我们列出一些常用的事件,使用的方式都是一样的。


  • 常用的事件


描述

事件名称

鼠标单击

click

鼠标双击

dblclick

鼠标移入

mouseover

鼠标移出

mouseout

鼠标移动

mousemove

获取焦点

focus

失去焦点

blur

键盘按下

keydown

键盘弹起

keyup

不能识别功能键 ctrl、alt 等

keypress

文本框的输入事件

input


案例:模拟 jd 搜索文本框,按 s 获取焦点


  • 需求:
    • 在文档中按 s 让文本框获得焦点,注册键盘事件判断是否按 s 键
    • 文本框获得焦点移除键盘事件
    • 文本框失去焦点注册键盘事件
  • 代码:
    • 元素.focus() 可以让元素获得焦点,同时触发 focus 事件
const search=document.querySelector('#search');

function hanldeFocus(e) {
  if (e.key==='s') {
    search.focus();
    e.preventDefault();
  }
}
document.addEventListener('keydown', hanldeFocus);

search.addEventListener('focus', function () {
  document.removeEventListener('keydown', hanldeFocus);
});

search.addEventListener('blur', function () {
  document.addEventListener('keydown', hanldeFocus);
});

案例:模拟输入快递单号文本框

  • 需求:
    • 文本框输入过程中,上面显示放大的输入内容
  • 代码:


作业

用键盘敲鼓的游戏


许愿墙-拖拽

轮事件是不同浏览器会有一点点区别,一个像Firefox使用DOMMouseScroll ,ff也可以使用addEventListener方法绑定DomMouseScroll事件,其他的浏览器滚轮事件使用mousewheel,下面我来给大家具体介绍。

Firefox使用DOMMouseScroll,其他的浏览器使用mousewheel。滚动事件触发时Firefox使用detail属性捕捉滚轮信息,其他的浏览器使用wheelDelta。不知道为何在该问题上其他厂商和微软的如此一致。Firefox可以使用addEventListener方法绑定DomMouseScroll事件。

elem.addEventListener(‘DOMMouseScroll’, func, false);IE和其他的主流浏览器可以使用传统的事件绑定模型。但不要使用IE专有的attachEvent方法,其他主流浏览器并不识别微软的这个方法。

Firefox 鼠标滚轮向上滚动是-3,向下滚动是3

IE 鼠标滚轮向上滚动是120,向下滚动是-120

Safari 鼠标滚轮向上滚动是360,向下滚动是-360

Opera 鼠标滚轮向上滚动是120,向下滚动是-120

Chrome 鼠标滚轮向上滚动是120,向下滚动是-120

有人在Safari下做了一些测试:”只是滚动一圈的话,值为+-0.1,如果滚动地稍微快点的话(多滚动几圈),这个值也会变大。 这是因为Mac OS下有鼠标滚轮加速功能。滚动一次,浏览器滚动1像素,滚动3次,浏览器却滚动30像素”。同时他也对Camino(基于Gecko的内核引擎)进行研究:“与Safari相似(+- 0.3 to +-Infinity),虽然使用了与firefox相同的内核引擎,但结果这个delta值却只在+-2.666666里浮动,无论滚动速度如何

IE/Opera属于同一类型,使用attachEvent即可添加滚轮事件

/*IE注册事件*/ 
if(document.attachEvent){ 
 document.attachEvent('onmousewheel',scrollFunc); 
}

Firefox使用addEventListener添加滚轮事件

/*Firefox注册事件*/ 
if(document.addEventListener){ 
 document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}

Safari与Chrome属于同一类型,可使用HTML DOM方式添加事件

window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome

其中除Firefox外其余均可使用HTML DOM方式添加事件,因此添加事件使用以下方式

/*注册事件*/ 
if(document.addEventListener){ 
 document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}//W3C 
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chromex

下面两个参数可以获取滚动的位置

document.documentElement.scrollTop:垂直方向

document.documentElement.scrollLeft:水平方向

放入监听事件后就可以在鼠标滑轮滚动时给一些元素设置浮动样式

如头条号的发表文章界面:

下滑前

下滑后