从Btools 1.0.4版本就开始一点点做起了日语输入法,并在1.0.5中作为一个隐藏功能上线了,在1.0.5中你可以按住Ctrl、Shift、Alt中任意一个键并按Esc就可以开启,但只有简单的输入假名功能。
Btools版和JS程序版有个本质的区别就在它的假名生成函数和假名存储变量。
下面开始贴一些示例代码。
假名生成函数
JS程序版:
if(!imba97_ON) return; // 如果程序为关闭状态 结束运行
if(imba97_F==null||imba97_F==undefined) return; // 如果不存在输入框则结束运行
imba97_F.blur(); // 失去焦点
var key=e.which; // 获取按键的值
var s=imba97_TEXT.text(); // 获取假名框已有的字符
var us=imba97_UN.text(); // 获取英文字符框已有的字符
var fs=imba97_F.val(); // 获取输入框已有的字符
if(key==16){imba97_cu();return;} // 如果是左Shift则运行切换平假名片假名函数
// 如果是退格则退格(又废话),如果英文字符框有内容则先删除英文字符框的内容并让按键储存的键-1s喵喵喵???如果没有了则删除假名框内容
if(key==8&&(s.length!=0||us.length!=0)){e.preventDefault();if(imba97_UN.text()!=''){var n=us.substring(0,us.length-1);imba97_UN.text(n);imba97_UT=n;imba97_S[imba97_N];imba97_N--}else{var n=s.substring(0,s.length-1);imba97_TEXT.text(n);};return;}
// 如果是回车则把人型自走输入法输入框的内容放进网页输入框,并运行清除函数
if(key==13){e.preventDefault();imba97_F.val(fs+s);$('#imba97_text').text('');imba97_clear();return;}
// 如果是a到z或者减号按键
if(key>64&&key<91||key==189)
{
e.preventDefault(); // 取消默认键盘事件
if(imba97_K[key]==undefined) return; // 如果按键存储没有相应按键则结束运行
if(imba97_K[key][0]) // 判断是否直接输出 1:有直接输出的字符,0:有假名可以输出
{
if(imba97_UN.text()!='') // 如果英文字符框有字符(第一次判断一定为假,所以你想看运行顺序请直接跳到下面的else语句)
{
// 开启分支
switch(imba97_N)
{
case 1:
// 如果按键相等并且按键不等于n和长音,则输出促音
if(key==imba97_S[0]&&key!=78&&key!=189)
{
// 判断平假名片假名
var tsu=imba97_T==1?'っ':'ッ';
imba97_TEXT.text(s+tsu);
return;
}
// 如果输入的第二个字符不等于未定义
if(imba97_K[imba97_S[0]][key]!=undefined)
{
// 将第二个的值存到按键存储
imba97_S[1]=key;
// 如果输入第二个字符后有直接输出
if(imba97_K[imba97_S[0]][key][0])
{
// 输出英文字符
imba97_UT+=imba97_K[imba97_S[0]][key][1];
imba97_UN.text(imba97_UT);
imba97_N++;
return;
}
else
{
// 如果没有直接输出,则输出相应假名
imba97_TEXT.text(s+imba97_K[imba97_S[0]][key][imba97_T]);
imba97_clear();
return;
}
}
else
{
return;
}
break;
case 2:
// 输入第三个字符后如果imba97_K相应的值不等于未定义
if(imba97_K[imba97_S[0]][imba97_S[1]]==undefined||imba97_K[imba97_S[0]][imba97_S[1]][key]!=undefined)
{
// 这里并没啥用,因为目前所有最多都是输出三个字符就能输出假名,留作以后说不定会有4字符,其实以后打算用递归
if(imba97_K[imba97_S[0]][imba97_S[1]][key][0])
{
// 没卵用
imba97_N++;
return;
}
else
{
// 输出到人型自走输入法文本框
imba97_TEXT.text(s+imba97_K[imba97_S[0]][imba97_S[1]][key][imba97_T]);
imba97_clear();
return;
}
}
else
{
return;
}
break;
}
}
else
{
// 如果英文字符框没字符
if(imba97_K[key]!=undefined) imba97_S[imba97_N]=key;else return; // 如果按键不等于未定义 则存储按键值 否则结束运行(等等 这儿是干嘛用的。。。)
imba97_UT+=imba97_K[key][1]; // 输出英文字符
imba97_UN.text(imba97_UT);
imba97_N++;
return;
}
}
else
{
// 如果没直接输出的字符了,就是说可以输出假名
switch(imba97_N)
{
// 如果目前正在输入第二个字符
case 1:
if(imba97_K[imba97_S[0]][key]==undefined) return;
imba97_TEXT.text(s+imba97_K[imba97_S[0]][key][imba97_T]);
imba97_clear();
return;
break;
// 如果目前正在输入第三个字符
case 2:
if(imba97_K[imba97_S[0]][imba97_S[1]][key]==undefined) return;
imba97_TEXT.text(s+imba97_K[imba97_S[0]][imba97_S[1]][key][imba97_T]);
imba97_clear();
return;
break;
}
}
if(imba97_K[key][imba97_T]!=undefined) $('#imba97_text').text(s+imba97_K[key][imba97_T]); // 这里是五个元音、长音的一次♂性按键输入字符
}
Btools版:
// nihongo.key = K;
// 按下按键后执行:nihongo.key = getKey(e.keyCode);
// 每次按键会调用这个函数,并将keyCode传进来
function getKey(e) {
var char = String.fromCharCode(e).toLowerCase(); // 获取按键字母
var val = nihongo.text.val(); // 获取输入框的值
// 促音的判断,如果输入的字母大于0个并且输入的字母不是“n”
if(nihongo.arufa.length > 0 && char !== 'n') {
// 如果前一个字母和现在输入的字母相等
if(nihongo.arufa[nihongo.arufa.length - 1] === char) {
// 重新写入输入框的值,把前面那个字符变为“っ”
nihongo.text.val(val.substring(0, nihongo.pos - 2) + (nihongo.isKatagana ? 'ッ' : 'っ') + char + val.substring(nihongo.pos, val.length));
// 重新定位光标
nihongo.text.get(0).setSelectionRange(nihongo.pos, nihongo.pos);
nihongo.arufa = char; // 因为还需要后面的值 所以让已输入的直接等于 char
return K[e] || nihongo.key; // 返回最后按的值
}
}
nihongo.arufa += char; // 按键的字母
// 如果有这个按键对应的值不等于undefined
if(nihongo.key[e] !== undefined) {
// 如果是个数组
if(Array.isArray(nihongo.key[e])) {
// 获取假名
var hira = nihongo.isKatagana ? nihongo.key[e][1] || nihongo.key[e][0] : nihongo.key[e][0];
// 获取左半部分,从0开始到(光标位置-输入字母个数)
var str_l = val.substring(0, nihongo.pos - nihongo.arufa.length);
// 获取有半部分,从光标位置到最后
var str_r = val.substring(nihongo.pos, val.length);
// 重新与假名拼接并输出(简单来说就是把字母替换为假名)
nihongo.hiragana = str_l + hira + str_r;
nihongo.text.val(nihongo.hiragana);
// 重新定义光标位置为光标原来位置+假名长度-字母长度
var pos = nihongo.pos + hira.length - nihongo.arufa.length;
nihongo.text.get(0).setSelectionRange(pos, pos);
// 清空字母并返回原始的K
nihongo.arufa = '';
return K;
}
// 如果不是数组,说明还需要按其他键,返回当前按键下的对象
return nihongo.key[e];
} else {
// 如果没定义 则清除上一个按下的字母
nihongo.arufa = nihongo.arufa.substring(nihongo.arufa.length - 1, nihongo.arufa.length);
// 返回新按下键的对象,如果没有啧返回本身
return K[e] || nihongo.key;
}
}
假名存储变量
JS程序版:
var K=new Array();
K[65]=[0,'あ','ア'];
K[75]=[1,'k'];
K[75][65]=[0,'か','カ'];
JS程序版的假名存储是一个数组,其中“[65]”、“[75][65]”的意思是数组下标同时也是键盘的keyCode值,A键是65,K键是75,所以按下后获取到keyCode值就能获取数组的值。数组等号后面也是一个数组,第一位的0和1代表了是否能输出假名了,如果是0就再判断是平假名还是片假名输出相应的假名,如果是1则输出后面的字母,说明这次输入还没结束。
Btools版:
var K = {
65: ['あ', 'ア'],
75: { 65: ['か', 'カ']}
}
而Btools版就有些区别了,假名存储在一个对象中,65、75还是代表keyCode,然后把最终要输出的假名放在数组内,根据判断当前按键下的值是不是个数组来判断是否输出。
以上可以说是在核心方面改变,输入模式和存储变量更简洁了,删除输入框内的字符时不必先关掉输入法,因为直接就是在输入框输入了。
在还未发布的Btools 1.0.6版本中,做了一些改动:
加入开关提示,快捷键改为Ctrl+M
在任意输入框开启后即可输入
其实开关的快捷键还是Ctrl、Alt、Shift任意一个加M键都可以。以后可能还会加入一些彩蛋啥的哈哈哈哈,好了就酱。
※阅读原文 是 Btools浏览器插件其他功能的演示视频。