好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 突破canvas語法限制 讓他支持鏈式語法

突破canvas語法限制 讓他支持鏈式語法

熱門標簽:地圖標注自己去過的地方 標準智能外呼系統 平頂山電子地圖標注怎么修改 電銷機器人視頻 江蘇高頻外呼系統線路 高德地圖標注錯誤怎么修改 洛陽市伊川縣地圖標注中心官網 搜狗星級酒店地圖標注 會聲會影怎樣做地圖標注效果
先來看一段正常的canvas畫圖語法:

復制代碼
代碼如下:

ctx.arc(centerX,centerY,radius,0,PI*2,true);
ctx.shadowColor = 'rgba(0,0,0,0.5)';
ctx.shadowBlur = "10";
ctx.fill();
ctx.beginPath();
ctx.shadowColor = 'rgba(0,0,0,0)';
ctx.moveTo(centerX-radius,centerY);
ctx.lineTo(centerX-radius,centerY - 50);
ctx.lineTo(centerX+radius,centerY - 50);
ctx.lineTo(centerX+radius,centerY);
// ctx.lineTo(centerX-radius,centerY);
ctx.fill();
ctx.beginPath();
ctx.fillStyle = 'rgba(255,0,0,1)';
ctx.arc(centerX,centerY-50,radius,0,PI*2,true);
ctx.fill();

我對canvas原生語法不爽的有兩點:1是每句前面都有寫ctx(即canvas的context2d對象),2是每個函數或屬性都要占一行,浪費空間。

我對jQuery的鏈式語法很欣賞,比如:

復制代碼
代碼如下:

$('#div1').show(300).html(p).delay(3000).slideUp(300).remove();

所以,我也想用這種語法來進行canvas繪圖:

復制代碼
代碼如下:

ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();

有個辦法就是模擬一個context2d對象,這個對象支持所有的原生context2d方法,但又支持鏈式。

不過,代碼不能太多,多了就沒人喜歡用了。

下面就是完整的代碼段,這個“類”我取名為XtendCanvas(又是以X開頭的喲):

復制代碼
代碼如下:

// 讓canvas支持鏈式語法,來自十年燈
~function () {var pro = ['save','restore', 'scale', 'rotate', 'translate', 'transform', 'createLinearGradient', 'createRadialGradient', 'getLineDash', 'clearRect', 'fillRect', 'beginPath', 'closePath', 'moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'arcTo', 'rect', 'arc', 'fill', 'stroke', 'clip', 'isPointInPath', 'measureText', 'clearShadow', 'fillText', 'strokeText', 'strokeRect', 'drawImage', 'drawImageFromRect', 'putImageData', 'createPattern', 'createImageData', 'getImageData', 'lineWidth','strokeStyle','globalAlpha','fillStyle','font','shadowOffsetX','shadowOffsetY','shadowBlur','shadowColor','lineCap','lineJoin','miterLimit'];
function XtendCanvas (canvas) {

var ctx = canvas.getContext('2d'),
fn = function(){},
fnP = fn.prototype;
for(var j = 0,p=pro[0];p;p=pro[j++]) {
fn.prototype[p] = function (p) {
return function () {
var args = Array.prototype.slice.call(arguments);
// console.log(args);
if(typeof ctx[p] == 'function') {
ctx[p].apply(ctx,args);
} else {
ctx[p] = args+'';
}
return fnP;
};
}(p);
}
return new fn;
};
window.XtendCanvas = XtendCanvas;
}();

使用方法很簡單,給他傳一個canvas對象,他就會返回一個類似context2d的對象,你可以像普通的context2d一樣使用,但不同的是,他支持鏈式語法了:

復制代碼
代碼如下:

var cvs = document.getElementById('cvs');
var ctx = XtendCanvas(cvs);
ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();

這樣一來你就可以把所有操作都放在一句話里,你也可以隨時中斷,做其他的事,然后繼續。

這段代碼并不是對canvas的增強,只是單純的讓他支持鏈式語法了。但勝在代碼少,可以嵌入到任何JS庫中,在此我希望能得到你的一個“推薦”

代碼中肯定有值得改進的地方,大家可以自行完善。但——吃水不忘挖井人,希望大家記得我,最重要的是思路,對吧?下面就是思路:
大家可以看到,代碼中最長的部分,是那個保存方法名的數組pro,核心代碼反而很短。為什么我要建這么一個數組呢?

本來我也想直接從CanvasRenderingContext2D繼承所有原生方法,但每個瀏覽器下面遍歷這個CanvasRenderingContext2D,結果都不一致。如果我把他們直接繼承,那么當你想用chrome中的方法套在firefox里執行,就會報錯。

所以我只是把CanvasRenderingContext2D中的通用的,無異議的方法與屬性名提取了出來,沒辦法,只有建一個固定的數組——大家可以自行決定往里面添加你的方法。

方法與屬性提取出來了,接著就是把原生的方法加在我的新對象上。我建了一個叫fn的空函數,放置我的方法。

由于數組中的這些元素既有函數,也有屬性,所以我在循環中判斷了他是否是一個函數,如果是函數,就帶參數執行;不是函數——那么就肯定是屬性了,就把參數賦給這個屬性。

這樣大家在碰到設置canvas屬性的時候,就不用中斷鏈了,直接把屬性值當參數傳進去就行了,比如:

復制代碼
代碼如下:

ctx.strokeStyle('#f00')

最后,關鍵的關鍵,就是返回fn,這招是從jQuery學來的,是支持鏈式語法的關鍵。

這段中用到了匿名函數,閉包,原型,以及我以前文章講過的奇怪的for循環。

說起來好像挺簡單的,不過我實在是想了很久,希望對大家有用。

在寫代碼的過程中,我發現chrome的做法很不錯,他有一串以set開頭的函數,如setStrokeColor,setLineCap等函數,給他們傳參數,就可以替代對應的strokeStyle和lineCap等屬性,也就是說,他的canvas里面就全是函數而沒有屬性了那樣的話我就不用判斷是函數還是是屬性了。但firefox里面沒有這些,所以我還是只能用前面的思路。

我也把那一串set函數給放出來吧

復制代碼
代碼如下:

var bak = ['setTransform','setAlpha', 'setCompositeOperation', 'setLineWidth', 'setLineCap', 'setLineJoin', 'setMiterLimit', 'setLineDash','setShadow','setStrokeColor','setFillColor'];

他們的用處一看就懂。你也可以選擇一些加入前面代碼的pro數組中。

最后,我很奇怪我的代碼怎么會沒有高亮了。。。如果你都看到最后了,那么還是給個推薦吧,讓我也虛榮一把

標簽:廣東 松原 果洛 阿克蘇 蚌埠 常德 廣西 鄂爾多斯

巨人網絡通訊聲明:本文標題《突破canvas語法限制 讓他支持鏈式語法》,本文關鍵詞  突破,canvas,語法,限制,讓他,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《突破canvas語法限制 讓他支持鏈式語法》相關的同類信息!
  • 本頁收集關于突破canvas語法限制 讓他支持鏈式語法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 骚虎视频在线免费观看| 被?到爽??流漫画双男主视频| 做a小视频| 91久久婷婷国产麻豆精品电影 | 日本人与zoxxxx另类| 成年人性生活片| 秋霞日韩久久理论电影| 午夜黄色福利| 特级全黄一级毛片| 动态图gif图27报| 色吊丝国产永久免费网址| 英语课代表说不能再深了| 97热久久成人免费频精品2| 秋霞午夜限制土鳖免费观看| 免费看18污黄| 羞羞视频| chinese国产hdsex水滴360| 色欲狠狠躁天天躁无码中文字幕| 成人番茄社区app| 欧美抽搐一进一进一出| sao货叫贱点h| 511yc午夜精品福利| 小荡货你好湿好紧好爽H| 好男人社区在线影视www | 客厅玩朋友娇妻HD完整版视频| 护士系列最好看的av| 差差漫画登录页面弹窗在线观看| 久久调教视频| 好大好湿好硬顶上来好爽视频| 二级韩国片完整版日韩电影| 免费看黄色一级片| 粗了大了整进去好爽视频| 亚洲精品午夜无码一区二区三麻豆| 91??丨PORNY丨白浆| 麻豆调教| 人与畜禽CORPORATION外网| 日本精品网站| 男男高H怀孕生子产乳文| 狠狠人妻久久久久久综合蜜桃动图| 不停的撞击着娇妻的屁股 | 国产免费黄|