JavaScript--兼容问题总结
以下兼容主要面向IE8以上的兼容。
一.window.navigator浏览器信息
<script>
console.log(window.navigator);
// 用户浏览器的类型 到底是 谷歌还是火狐,ie等
console.log(window.navigator.userAgent);
// 判断浏览器所在的系统平台类型 ,window还是mac
console.log(window.navigator.platform);
</script>
二.查找页面元素的几种方式
<script>
window.onload = function () {
// 无兼容问题放心使用
// 1) 通过id查找元素,获取到匹配的第一个id元素
// var btn = document.getElementById('btn');
// console.log(btn);
// 2) 通过标签名称查找元素,获取到的是伪数组
// var buttons = document.getElementsByTagName('button');
//// 伪数组不能调用数组里的全部方法和属性
//// console.log( buttons.push("123") ); // 报错
// console.log( buttons ); // 了解:兼容问题 ie 9+
// 3) 通过类名查找元素,获取到的是伪数组 ie 9+
// var btnClass = document.getElementsByClassName("btn-class");
// console.log(btnClass); // 4) 通过name属性查找元素,获取到的是伪数组
// name标准用法应该是表单的,如提交表单数据时,name是作为数据的key
// var btnName = document.getElementsByName('btn-name');
// console.log(btnName); // 5) 通过合法的css选择器去查找到第一个元素
// var query1 = document.querySelector("#btn");
// var query1 = document.querySelector("[name='btn-name']");
// console.log(query1);
//
// 6) 通过合法的css选择器去查找到所有元素(做手机项目的时候常用)
// var query2 = document.querySelectorAll("#btn"); // 不推荐用这种方式找id
var query2 = document.querySelectorAll(".btn-class");
console.log(query2); }
</script>
三.innerText、innerHTML、textContent兼容问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
/**
* innerHTML
* 全部浏览器都兼容
* innerText firefox45+后支持
* ie,chrome,opera,safari,firefox45+
* textContent ie9+
* firefox,chrome, ie9+
*
* */
window.onload = function () {
var btns = document.getElementsByTagName('button');
var uls = document.getElementsByTagName('ul');
btns[0].onclick = function () {
// 如果innerText获取到不是undefined,说明兼容innerText
if( uls[0].innerText !== undefined ){
uls[0].innerText = "123";
}else{
// 其他情况:如低版本获取用另一种方式修改
uls[0].textContent = "低版本火狐修改";
}
} }
</script>
</head>
<body>
<button>换一换新闻</button>
<ul>
<li>牛大</li>
<li>拉面的老板去参加比赛了</li>
</ul>
</body>
</html>
四.注册事件的三种方式、解绑事件的兼容方式、阻止事件传播(冒泡)
1.注册事件的三种方式
<script>
window.onload = function () { /**
* 一、事件三要素
* 事件源
* 事件类型
* 事件处理程序
*
*
* 二、注册事件三种方式
* 第一种:
* 事件源.on事件类型 = 事件处理程序
* 第二种: ie8不支持
* 事件源.addEventListener('事件类型',事件处理程序,false)
* 第三种: chrome、Firefox、Safari、ie11都不支持,ie6~10支持
* 事件源.attachEvent('on事件类型',事件处理程序)
*
* */
var btn = document.getElementById('btn'); // 第一种:快速注册事件
// btn.onclick = function () {
// alert("我们给按钮添加了一个事件");
// } // 第二种:事件监听 不支持ie8
// 事件源.addEventListener('事件类型',事件处理程序) false是事件冒泡(默认) true是事件捕获
btn.addEventListener('click',function () {
alert("我们给按钮添加了一个事件");
}); btn.addEventListener('click',function () {
alert("AAAAAAA");
},false); // 第三种:事件监听 Chrome、Firefox、Safari,ie11都不支持,ie6~10支持
// btn.attachEvent('onclick',function () {
// alert("我们给按钮添加了一个事件");
// });
// btn.attachEvent('onclick',function () {
// alert("我们给按钮添加了一个事件2222");
// });
// btn.attachEvent('onclick',function () {
// alert("我们给按钮添加了一个事件3333");
// }); }
</script>
事件注册兼容处理:
<script>
/*
谷歌和ie8注册方式不同,
所以我们要进行判断支持哪种注册方式,就使用哪种注册方式添加事件
*/
function myEventListener(element,type,fn) {
if( element.addEventListener ){
element.addEventListener(type,fn);
}else if( element.attachEvent ){
element.attachEvent("on"+type,fn);
}else{
element["on"+type] = fn;
}
}
myEventListener(btn,'click',function () {
alert("兼容版的事件注册方式");
});
</script>
2.解绑事件的兼容方式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload = function () {
/**
* 一、事件三要素
* 事件源
* 事件类型
* 事件处理程序
*
*
* 二、注册事件三种方式
* 第一种:
* 事件源.on事件类型 = 事件处理程序
* 第二种: ie8不支持
* 事件源.addEventListener('事件类型',事件处理程序,false)
* 第三种: chrome不支持
* 事件源.attachEvent('on事件类型',事件处理程序)
*
*
* 三、事件解绑
* 第一种:
* 事件源.on事件类型 = null
* 第二种: ie8不支持
* 事件源.removeEventListener('事件类型',事件处理程序,false)
* 第三种: chrome不支持
* 事件源.detachEvent('on事件类型',事件处理程序)
*
*
* */
var btn = document.getElementById('btn');
var btn2 = document.getElementById('btn2');
// 事件注册兼容方式
function myEventListener(element,type,fn) {
// 主流浏览器注册方式
if( element.addEventListener ){
element.addEventListener(type,fn,false);
//
}else if( element.attachEvent ){
element.attachEvent("on"+type,fn);
}else{
element["on"+type] = fn;
}
}// 事件解绑兼容方式
function myRemoveEventListener(element,type,fn) {
if( element.removeEventListener ){
element.removeEventListener(type,fn,false);
}else if( element.detachEvent ){
element.detachEvent("on"+type,fn);
}else{
element["on"+type] = null;
}
} function fn() {
alert("兼容版的事件注册方式");
}
myEventListener(btn,'click',fn);
// 独立fn是为了浏览器能区分每个事件注册
btn2.onclick = function () {
myRemoveEventListener(btn,'click',fn);
} console.log( btn.addEventListener );
console.log( btn.attachEvent ); }
</script>
</head>
<body>
<button id="btn">按钮</button>
<button id="btn2">解绑事件</button>
</body>
</html>
3.阻止事件传播(冒泡)兼容
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#yeye{
width: 500px;
height: 500px;
background-color: #f24b4b;
}
#baba{
width: 400px;
height: 400px;
background-color: #44c28d;
}
#erzi{
width: 300px;
height: 300px;
background-color: #6e8cd5;
}
</style>
<script>
window.onload = function () { /**
*
*
* 事件捕获:
* 浏览器就好像盲人一样,要找某个元素,其实挨个挨个问的方式去找
* 这个过程我们叫事件的捕获过程.
* // 从外到里,直到找到目标
*
* 事件冒泡:
* 找到到目标后,其实还有一个回馈的过程,逐级往上传播
* 这个过程我们叫事件的冒泡过程.
* // 从里到外,直到传到window
*
* 注意:
* 我们一般都是事件冒泡的方式注册事件的
*
*
* 事件的三个阶段 1. 捕获阶段
2. 当前目标阶段
3. 冒泡阶段
事件对象.eventPhase属性可以查看事件触发时所处的阶段 *
* */ var yeye = document.getElementById("yeye");
var baba = document.getElementById("baba");
var erzi = document.getElementById("erzi"); erzi.onclick = function (event) {
event = event || window.event;
if(event.stopPropagation) {
// ie9+ 其余全支持
event.stopPropagation();
}else{
// 全部兼容,火狐不兼容
event.cancelBubble = true;
}
console.log("儿子", event);
}
baba.onclick = function (event) {
event = event || window.event;
if(event.stopPropagation) {
// ie9+ 其余全支持
event.stopPropagation();
}else{
// 全部兼容,火狐不兼容
event.cancelBubble = true;
}
console.log("爸爸", event);
}
yeye.onclick = function (event) {
event = event || window.event;
if(event.stopPropagation) {
// ie9+ 其余全支持
event.stopPropagation();
}else{
// 全部兼容,火狐不兼容
event.cancelBubble = true;
}
console.log("爷爷", event);
}
}
</script>
</head>
<body>
<div id="yeye">
<div id="baba">
<div id="erzi"></div>
</div>
</div>
</body>
</html>
五.event事件对象兼容问题
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
/**
*
* 事件对象兼容写法:
* event IE不兼容 window.event火狐(Firefox 不支持)
* event = event || window.event;
*
* 事件目标元素兼容写法:
* event.target IE9.0版本才开始支持
* event.srcElement 火狐(Firefox 不支持)
* event.target = event.target || event.srcElement;
*
*
* */ window.onload = function () {
var btn = document.getElementById('btn');
btn.onclick = function (event) {
// console.log(event);
// console.log(window.event);
event = event || window.event; // 短路写法
event.target = event.target || event.srcElement; // 短路写法
// event.target
console.log( event.target );
console.log( event.srcElement );
} }
</script>
</head>
<body>
<button id="btn">按钮</button>
</body>
</html>
六.兼容ie8的获取样式函数
注意点
// window.getComputedStyle(box,null) -- box 是目标标签
// 这种写法是获取到计算完成的样式,所以这种写法能获取到各种样式表
// 甚至可以获取到继承过来的属性和默认样式
console.log(boxStyle);
console.log(boxStyle.width);
console.log(boxStyle["width"]);
console.log(boxStyle['padding-left']);
console.log(boxStyle['paddingLeft']); // 推荐驼峰写法
console.log(box.style.width);*/ //兼容IE6~8
// console.log(box.currentStyle); // if(window.getComputedStyle) {
// var boxStyle = window.getComputedStyle(box,null);
// }else if(box.currentStyle){
// var boxStyle = box.currentStyle;
// }
// console.log(boxStryle);
封装函数
/**
* 获取样式函数
* @param element 要获取的样式的对象
* return 目标css样式对象
* */
function getStyle(element) {
if(window.getComputedStyle) {
return window.getComputedStyle(element,null);
}else if(element.currentStyle){
return element.currentStyle;
}
}
应用例子--缓动动画函数:
/**
* 获取样式函数
* @param element 要获取的样式的对象
* return 目标css样式对象
* */
function getStyle(element) {
if(window.getComputedStyle) {
return window.getComputedStyle(element,null);
}else if(element.currentStyle){
return element.currentStyle;
}
} /**
* 动画函数
* @param element html标签
* @param attr 标签属性
* @param target 目标参数
* */
function animate(element,obj) {
clearInterval(element.timer);
element.timer = setInterval(function () {
var flag = true;
for(var attr in obj){
// 在for in 的内部要区别开到底是透明度还是像素px的变化
if( attr == "opacity") {
var current = getStyle(element)[attr];
var target = obj[attr];
current = current * 100;
target = target * 100;
// Math.round() 函数返回一个数字四舍五入后最接近的整数值。
current = Math.round(current);
var step = (target - current) / 10;
current += current <= target ? Math.ceil(step):Math.floor(step);
if(current != target) {
flag = false;
}
// element.style.left等
element.style[attr] = current / 100;
}else if(attr == "zIndex"){
element.style[attr] = obj[attr];
} else{
var current = parseInt(getStyle(element)[attr]);
var target = obj[attr];
var step = (target - current) / 10;
current += current <= target ? Math.ceil(step):Math.floor(step);
if(current != target) {
flag = false;
}
// element.style.left等
element.style[attr] = current+ "px";
}
}
if(flag) {
clearInterval(element.timer);
}
},40);
}
七.pageX、pageY还有event、clientX、clientY等兼容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.box {
width: 200px;
height: 200px;
background-color: pink;
margin-top:1000px;
margin-left:100px;
margin-bottom:100px;
position: absolute;
/*left: 100px;*/ }
.txt {
color: red;
font-size: 20px;
}
</style>
</head>
<body>
<div class="box" id="box">
width: 200px<br>
height: 200px<br>
background-color: pink<br>
margin-top:1000px<br>
margin-left:100px<br>
margin-bottom:100px<br>
<h2 class="txt" id="txt" ></h2>
</div> </body>
</html>
<script>
/*封装event*/
var eventTool = {
getEvent : function (event) {
return event || window.event;
}, getClienX: function (event) {
return this.getEvent(event).clientX;
},
getClienY: function (event) {
return this.getEvent(event).clientY;
},
getPageY : function () {
// pageY = 页面滚动出去垂直距离 + 事件在当前视口的距离
return (window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop || 0) + this.getClienY(event);
}, getPageX : function () {
// pageX = 页面滚动出去横向距离 + 事件在当前视口的距离
return (window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft || 0) + this.getClienX(event);
} }
var box = document.getElementById('box');
var txt = document.getElementById('txt');
box.onclick = function (event) {
// ie8下event兼容
// var event = eventTool.getEvent(event);
// console.log(event);
// pageY = 页面滚动出去垂直距离 + 事件在当前视口的距离
// console.log(window.pageYOffset + event.clientY);
// console.log(window.pageYOffset);
// console.log(event.pageY); console.log(eventTool.getPageY(event));
txt.innerHTML = eventTool.getPageX(event);
// txt.innerHTML += eventTool.getClienY(event);
// txt.innerHTML = "pageX:"+event.pageX+"<br> pageY:"+event.pageY; // 获取window滚动条滚动的距离window.pageYOffset/scrollY的别名 window.pageXOffset/ scrollX的别名 }
</script>
封装写法
eventTool.js
/*封装eventTool*/
var eventTool = {
getEvent : function (event) {
return event || window.event;
}, getClienX: function (event) {
return this.getEvent(event).clientX;
},
getClienY: function (event) {
return this.getEvent(event).clientY;
},
getPageY : function () {
// pageY = 页面滚动出去垂直距离 + 事件在当前视口的距离
return (window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop || 0) + this.getClienY(event);
}, getPageX : function () {
// pageX = 页面滚动出去横向距离 + 事件在当前视口的距离
return (window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft || 0) + this.getClienX(event);
} }
封装方法2:
my.js
function $(id) {return document.getElementById(id);}
function show(obj) { obj.style.display = "block";}
function hide(obj) { obj.style.display = "none";}
function scroll() {
if(window.pageYOffset != null) // ie9+ 和其他浏览器
{
return {
left: window.pageXOffset,
top: window.pageYOffset
}
}
else if(document.compatMode == "CSS1Compat") // 声明的了 DTD
// 检测是不是怪异模式的浏览器 -- 就是没有 声明<!DOCTYPE html>
{
return {
left: document.documentElement.scrollLeft,
top: document.documentElement.scrollTop
}
}
return { // 剩下的肯定是怪异模式的
left: document.body.scrollLeft,
top: document.body.scrollTop
}
}
使用例子--返回顶部小火箭:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
width: 2000px;
}
.top{
position: fixed;
right: 50px;
bottom: 100px;
display: none;
} </style>
<script src="my.js"></script>
<script>
window.onload = function () {
var goTop = $("gotop");
window.onscroll = function () {
scroll().top > 0 ?show(goTop) : hide(goTop);
leader = scroll().top; // 把减去的头部给起始位置
console.log(scroll().top);
} var leader = 0,target = 0 ,timer = null;
goTop.onclick = function () {
target = 0;
timer = setInterval(function () {
leader = leader + (target - leader) / 10;
window.scrollTo(0,leader); // 去往页面的某个位置
if(leader == target) {
clearInterval(timer);
}
},20);
}
}
</script>
</head>
<body>
<div id="gotop" class="top">
<img src="data:images/Top.jpg" alt="">
</div>
<p>我是顶部</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是内容部分</p>
<p>我是底部</p>
</body>
</html>
目前暂时那么多,遇到就更新!
JavaScript--兼容问题总结的更多相关文章
- JavaScript 兼容各大浏览器阻止冒泡事件
JavaScript 兼容各大浏览器阻止冒泡事件 function stopEvent(event) { //阻止冒泡事件 //取消事件冒泡 var e = arguments.callee.call ...
- Javascript兼容和CSS兼容总结
javascript部分 1. document.form.item 问题问题:代码中存在 document.formName.item(“itemName”) 这样的语句,不能在FF下运行解决方法: ...
- JavaScript 兼容处理IE67之 !"a"[0]
IE67对字符串进行取值需要使用charAt()方法,不能直接通过数组方式的坐标访问: <!DOCTYPE html> <html> <head> <meta ...
- JavaScript 兼容 Array.prototype.slice.call
IE9之前的IE版本的HTMLCollection以及NodeList不是Object的子类. 在通过Array.prototype.slice.call进行数组化的时候,IE9之前的IE版本会抛出异 ...
- ie7下的javascript兼容
<a href="javascript:;" onclick="functionone();"></a> <script> ...
- Front End中Javascript兼容问题收集(转)
1 select标签,就有诸多不兼容: A. cloneNode方法,对于非IE浏览器没有问题,对于IE浏览器, 遇到的问题包括: 1)option selected的会clone不过去,然后 ...
- javascript 兼容各个浏览器的事件
- Javascript兼容各浏览器的日期转换
var date = new Date(Date.parse("2015-09-05".replace(/-/g,"/")));'2015-09-05'是无法被 ...
- web前端 javascript 兼容低版本 IE 6 7 8复合写法
1. 返回检测屏幕宽度(可视区域) function client() { if(window.innerWidth != null) // ie9 + 最新浏览器 { return { width: ...
- 【JavaScript兼容】关于IE8及以下无法通过getElementsByClassName()方法获得元素的解决方法
try{ var a = document.getElementsByClassName("cla"); console.log(a); }catch(ex){ var array ...
随机推荐
- 【agc013d】AtCoder Grand Contest 013 D - Piling Up
题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不 ...
- anaconda安装使用
Conda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换 下载:https://mirrors.tuna.tsinghua.edu.cn/a ...
- Linux中如何安装mysql数据库
安装mysql 1.解压源码压缩包 如果服务器可以上网也可以采用在线安装方式,在线安装操作简单具体见下面在线安装步骤 进入源码压缩包所在目录输入#tar -zxvf mysql-5.6.17-linu ...
- Django部署,Django+uWSGI+nginx+Centos部署
说明:系统是在windows上开发的,使用django1.11.4+python3.6.3开发,需要部署在centos6.4服务器上. 第一步:在Centos6.4上安装Python3.6.2 安装请 ...
- 入门servlet:request获取请求体数据
@WebServlet("/RequestDemo5") public class RequestDemo5 extends HttpServlet { protected voi ...
- 线性求所有数模p的乘法逆元
推理: 假如当前计算的是x在%p意义下的逆元,设$p=kx+y$,则 $\Large kx+y\equiv 0(mod\ p)$ 两边同时乘上$x^{-1}y^{-1}$(这里代表逆元) 则方程变为$ ...
- CF 578B "Or" Game
传送门 解题思路 题意大概是给你一个数列,可以进行k次操作,每次操作可以选择一个数乘x,问操作后的或的最大值.根据位运算,位数越高答案越优,所以贪心的使这k次操作全都放到一个数上,这样的结果肯定较优. ...
- HDU6187 Destroy Walls
把这道题放了很久才来更新blog,似乎越来越懒了啊. 我们发现他给的城堡的坐标非常有趣啊,都是无理数. 对于其他所有点的坐标都是有理数的情况下,一个坐标为无理数的点绝对特别. 特别之处就是:经 ...
- 解决Cesium1.50对gltf2.0/3dtiles数据读取的问题
问题说明 Cesium 1.50(2018/10/01)版本打开3dtiles可能会出现加载不上导致渲染停止的错误. 错误说明为:RuntimeError: Unsupported glTF Exte ...
- matplotlib无法显示中文
import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi']mpl.rcParams['font.serif'] = ['K ...