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 ...
随机推荐
- jps的用法及常见问题介绍
1.jps的作用 jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command. 2 ...
- Linux Shell脚本经典案例
开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的,在函数中变量 ...
- 用JetBrains PyCharm 2017.2创建运行Django程序
在JetBrains PyCharm 2017.2里选择 文件(F) 新项目 点击 三角形 运行 修改Urls.py """S14Djngo URL Configur ...
- GIT → 11:Git 工作流与实战演练
GIT → 11:Git 工作流与实战演练
- 提升mysql服务器性能(HA MMM MHA MaxScale)
原文:提升mysql服务器性能(HA MMM MHA MaxScale) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/detai ...
- python基础--字符编码以及文件操作
字符编码: 1.运行程序的三个核心硬件:cpu.内存.硬盘 任何一个程序要是想要运算,肯定是先从硬盘加载到当前的内存中,然后cpu根据指定的指令去执行操作 2.python解释器运行一个py文件的步骤 ...
- Appium_Python_Client介绍
一.Appium_Python_Client介绍 Appium的实用方法都藏在Client的源码里,对于driver和webelement实例,均有对应的元素查找方法(webelement查找的是下面 ...
- Ubuntu 服务器默认的root账号是没有激活的,需要用初装的用户账号给root设置管理密码
user@ubuntu12:~$ sudo password root //用sudo修改账户 1.根据提示输入当前用户的密码: 2.修改成功之后你就可以使用root账号了,可以使用su root 命 ...
- Python实例 分割路径和文件名
import os.path # 常用函数有三种:分隔路径,找出文件名.找出盘符(windows系统),找出文件的扩展名. # 根据你机器的实际情况修改下面参数. spath = " D: ...
- 助力深度学习!阿里开源可插拔 GPU 共享调度工具
根据 Gartner 对全球 CIO 的调查结果显示,人工智能将成为 2019 年组织革命的颠覆性力量.对于人工智能来说,算力即正义,成本即能力,利用 Docker 和 Kubernetes 代表云原 ...