多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > jscript > 搜狗云輸入法JS文件剖析(三)

搜狗云輸入法JS文件剖析(三)

來源:程序員人生   發布時間:2014-06-16 04:35:59 閱讀次數:3089次
這篇主要分析imeBindInput函數。

現在才發現,網上的解壓代碼有些問題,由于我沒研究過代碼的壓縮算法,對于解壓也不是很熟悉,所以暫時沒精力去精確還原全部代碼,既然這篇文章分析的是imeBindInput函數,那么就直接從內存里面把代碼請出來吧:
imeBindInputfunction imeBindInput(a) {
try {
var b = a.getElementsByTagName("input");
for (var i = 0; i < b.length; i++) {
if (b[i].type == "text") {
b[i].imebind = true;
b[i].onkeyup = null;
b[i].onkeydown = null;
b[i].onkeypress = null;
b[i].onfocus = null;
b[i].onblur = null;
b[i].onclick = null;
if (document.addEventListener) {
b[i].addEventListener("keyup", imeInput, true);
b[i].addEventListener("keydown", imeKeyDown, true);
b[i].addEventListener("keypress", imeKeyPress, true);
} else if (document.attachEvent) {
b[i].detachEvent("onkeydown", b[i].onkeydown);
b[i].detachEvent("onkeyup", b[i].onkeyup);
b[i].detachEvent("onkeypress", b[i].onkeypress);
b[i].detachEvent("onfocus", b[i].onfocus);
b[i].detachEvent("onblur", b[i].onblur);
b[i].attachEvent("onkeyup", imeInput);
b[i].attachEvent("onkeydown", imeKeyDown);
b[i].attachEvent("onkeypress", imeKeyPress);
} else {
var c = b[i].onkeyup ? b[i].onkeyup : function () {};
b[i].onkeyup = function () {c();imeInput();};
var d = b[i].onkeydown ? b[i].onkeydown : function () {};
b[i].onkeydown = function () {d();imeKeyDown();};
var f = b[i].onkeypress ? b[i].onkeypress : function () {};
b[i].onkeypress = function () {f();imeKeyPress();};
}
}
}
var g = a.getElementsByTagName("textarea");
for (var i = 0; i < g.length; i++) {
g[i].imebind = true;
g[i].onkeyup = null;
g[i].onkeydown = null;
g[i].onkeypress = null;
g[i].onfocus = null;
g[i].onblur = null;
g[i].onclick = null;
if (document.addEventListener) {
g[i].addEventListener("keyup", imeInput, true);
g[i].addEventListener("keydown", imeKeyDown, true);
g[i].addEventListener("keypress", imeKeyPress, true);
} else if (document.attachEvent) {
g[i].detachEvent("onkeydown", g[i].onkeydown);
g[i].detachEvent("onkeyup", g[i].onkeyup);
g[i].detachEvent("onkeypress", g[i].onkeypress);
g[i].detachEvent("onfocus", g[i].onfocus);
g[i].detachEvent("onblur", g[i].onblur);
g[i].attachEvent("onkeyup", imeInput);
g[i].attachEvent("onkeydown", imeKeyDown);
g[i].attachEvent("onkeypress", imeKeyPress);
} else {
var c = g[i].onkeyup ? g[i].onkeyup : function () {};
g[i].onkeyup = function () {c();imeInput();};
var d = g[i].onkeydown ? g[i].onkeydown : function () {};
g[i].onkeydown = function () {d();imeKeyDown();};
var f = g[i].onkeypress ? g[i].onkeypress : function () {};
g[i].onkeypress = function () {f();imeKeyPress();};
}
}
if (a.addEventListener) {
a.addEventListener("keydown", imeBodyKeyDown, true);
a.addEventListener("mousedown", imeBodyMouseDown, true);
} else if (a.attachEvent) {
a.attachEvent("onkeydown", imeBodyKeyDown);
a.attachEvent("onmousedown", imeBodyMouseDown);
a.attachEvent("onactivate", imeBodyActive);
} else {
var l = a.onmousedown ? a.onmousedown : function () {};
a.onmousedown = function () {l();imeBodyMouseDown();};
}
var m = a.getElementsByTagName("iframe");
for (var i = 0; i < m.length; i++) {
try {
if (m[i].contentDocument) {
var a = m[i];
ime_iframe_arr.push(a);
a.imebind = true;
var a = a.contentDocument;
imeBindInput(a);
} else if (m[i].contentWindow.document) {
var a = m[i];
ime_iframe_arr.push(a);
a.imebind = true;
var a = a.contentWindow.document;
imeBindInput(a);
}
} catch (e) {
}
}
} catch (e) {
}
}
先從大局入手: 可以看出,綁定的地方有:1.type=text的輸入框2.textarea3.iframe另外對頂層元素(這里是document)進行事件綁定:1.如果是標準瀏覽器則綁定keydown/mousedown2.如果是ie瀏覽器則追加activate事件3.其它的則僅僅追加mousedown事件PS:這個函數采用了try語句,看來作者對這一塊操作也不是很有信心啊,呵呵~~先來看看最簡單的text輸入框是怎么綁定事件的吧。
b[i].imebind = true;
b[i].onkeyup = null;
b[i].onkeydown = null;
b[i].onkeypress = null;
b[i].onfocus = null;
b[i].onblur = null;
b[i].onclick = null;
if (document.addEventListener) {
b[i].addEventListener("keyup", imeInput, true);
b[i].addEventListener("keydown", imeKeyDown, true);
b[i].addEventListener("keypress", imeKeyPress, true);
} else if (document.attachEvent) {
b[i].detachEvent("onkeydown", b[i].onkeydown);
b[i].detachEvent("onkeyup", b[i].onkeyup);
b[i].detachEvent("onkeypress", b[i].onkeypress);
b[i].detachEvent("onfocus", b[i].onfocus);
b[i].detachEvent("onblur", b[i].onblur);
b[i].attachEvent("onkeyup", imeInput);
b[i].attachEvent("onkeydown", imeKeyDown);
b[i].attachEvent("onkeypress", imeKeyPress);
} else {
var c = b[i].onkeyup ? b[i].onkeyup : function () {};
b[i].onkeyup = function () {c();imeInput();};
var d = b[i].onkeydown ? b[i].onkeydown : function () {};
b[i].onkeydown = function () {d();imeKeyDown();};
var f = b[i].onkeypress ? b[i].onkeypress : function () {};
b[i].onkeypress = function () {f();imeKeyPress();};
}
首先對輸入框追加imebind屬性接著講輸入框的鍵盤、焦點、點擊事情全取消了(僅僅針對<span click=”…”>click me</span>這種寫法),至于為什么,我也沒法理解,感覺這樣不是改變了原有元素事件了嗎,吃力而且不討好。最后又是根據不同的瀏覽器器進行事件綁定,按理說應該對此進行封裝,但是沒有辦法,針對IE又特殊照顧了一下(先detachEvent刪除了事件),至于為什么,再次無法理解,看來自己在事件綁定方面的能力太差了,比如說分不清b[i].onkeyup = null和b[i].detachEvent("onkeyup", b[i].onkeyup); 的區別。好吧,先稍微總結一下。主要對輸入框進行三項事件綁定:keyup=>imeInputkeydown=>imeKeyDownkeypress=>imeKeyPress- 呃,干嘛keyup對應的不是imeKeyUp?接下來是textarea元素,按理說區別應該是回車的處理。大概掃了一眼,發現代碼是和text輸入框一樣的,也是綁定了三個事件。

最后是iframe的綁定,這時候主要就是利用imeBindInput對自身的遞歸調用了。
if (m[i].contentDocument) {
var a = m[i];
ime_iframe_arr.push(a);
a.imebind = true;
var a = a.contentDocument;
imeBindInput(a);
} else if (m[i].contentWindow.document) {
var a = m[i];
ime_iframe_arr.push(a);
a.imebind = true;
var a = a.contentWindow.document;
imeBindInput(a);
}
對這代碼有些無語,但為了執行速度,也只好這樣了。
要是我就寫成:
var i= m[i];
if(var a=i.contentDocument || i.contentWindow.document)
ime_iframe_arr.push(i);
i.imebind = true;
imeBindInput(a);
}
OK,現在回來總結一下。這個函數主用用于對參數(一開始為document)底下(包括iframe)的普通輸入框(type=text的input和textarea)進行三個鍵盤事件綁定(keyup/keydown/keypress),最后對參數的keydown/mousedown/activate事件進行綁定(IE綁3個,標準的綁2個,其它的綁一個 - 有些復雜啊~~~)
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------

上一篇 紅網CEO舒斌:原創是網站生存之道

下一篇 Access入門教程 13.3 確定分組級別和排序次序

分享到:
------分隔線----------------------------
為碼而活
積分:4237
15粉絲
7關注
欄目熱點
關閉
程序員人生
主站蜘蛛池模板: 亚洲 自拍 另类 欧美 综合 | 无码中文av有码中文av | 日本精品久久久久护士 | 经典三级第一页 | 一区二区三区四区在线不卡高清 | 亚洲高清视频在线观看 | 欧美成人性色生活18黑人 | 国产精品久久久精品视频 | japanesefree高清日本护士 | 欧美色成人 | 免费亚洲网站 | 一级做a爰片欧美一区 | 精品久久久久久 | 国产精品嫩草影院视频 | 亚洲一本| 久久久亚洲欧洲国产 | free日韩性公交车上xxhd | 5月丁香婷婷 | 影视精品网站入口 | 色综合久久久高清综合久久久 | 亚洲v日本 | 一级视频免费观看 | 狂野欧美性猛交xxxx巴西 | 日本精品一区二区三本中文 | 久久精品一级 | 国内精品免费一区二区三区 | 亚洲视频www | 97午夜理伦影院在线观看 | 亚洲图片另类 | 欧美激情校园春色 | 91精品一区国产高清在线 | 91亚洲精品国产第一区 | 天堂在线xw | 欧美性区 | www.在线观看.com | 国产高清国内精品福利99久久 | 免费成人视屏 | 亚洲国产欧美在线人成精品一区二区 | 一级黄色欧美 | 性欧美孕妇xxxx | 欧美最新一区二区三区四区 |