PDA

View Full Version : حرفه ای: تایپ فقط انگلیسی و کاراکترهای خاص بدون تغییر زبان کیبورد



bftarane
پنج شنبه 15 خرداد 1393, 16:22 عصر
سلام.
با جستجویی که انجام دادم کدهایی پیدا کردم که کاربر فقط بتونه انگلیسی تایپ کنه در تکست باکس و اگه مثلاً زبان کی بورد فارسی بود بهش پیغام میده که زبان کیبورد رو انگلیسی کنید
ولی چطور میشه در input فقط انگلیسی و کاراکترهای خاص تایپ بشه چه زبان کی بورد فارسی باشه و چه انگلیسی؟
خیلی ممنون

bftarane
پنج شنبه 15 خرداد 1393, 19:53 عصر
در این لینک http://hasheminezhad.com/kblayout
لطفاً اون قسمت
تعریف صفحه کلیدهای جدید:

رو بخونید، اونجا یه سری کد قرار داده شده، چطور میشه معادل اون کدها به انگلیسی رو پیدا کرد؟ من اصلاً متوجه این قسمت نمی شم.
و آیا از این طریق میشه کاری که در پست 1 گفتم عملی بشه؟

hakan648
جمعه 16 خرداد 1393, 10:55 صبح
var isirikey = [
0x0020, 0x0021, 0x061B, 0x066B, 0xFDFC, 0x066A, 0x060C, 0x06AF,
0x0029, 0x0028, 0x002A, 0x002B, 0x0648, 0x002D, 0x002E, 0x002F,
0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, 0x06F6, 0x06F7,
0x06F8, 0x06F9, 0x003A, 0x06A9, 0x003E, 0x003D, 0x003C, 0x061F,
0x066C, 0x0624, 0x200C, 0x0698, 0x064A, 0x064D, 0x0625, 0x0623,
0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
0x0653, 0x0650, 0x0643, 0x062C, 0x005C, 0x0686, 0x00D7, 0x0640,
0x200D, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x067E, 0x062F, 0x062E,
0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
];

for (var i = 32; i < isirikey.length + 32; i++) {
console.log(
//en
String.fromCharCode(i),

//fa
String.fromCharCode(isirikey[i - 32]));
}

Test
http://jsfiddle.net/DevJv/

bftarane
جمعه 16 خرداد 1393, 12:41 عصر
من که نتونستم نتیجه ای در jsfiddle ببینم
ولی فکر کنم طبق کد این کدها برای انگلیسی باشن درسته؟

0x066C, 0x0624, 0x200C, 0x0698, 0x064A, 0x064D, 0x0625, 0x0623,
0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
0x0653, 0x0650, 0x0643, 0x062C, 0x005C, 0x0686, 0x00D7, 0x0640,
0x200D, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x067E, 0x062F, 0x062E,
0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
اینها که نه کدهای اسکی هستند نه یونیکد. از کجا اینا به دست می یان؟

من فایل kblayout.js رو هم به صورت زیر تغییر دادم

keyboardLayout['fa'] = [
0x0020, 0x0021, 0x061b, 0x066b, 0xfdfc, 0x066a, 0x060c, 0x06af, 0x0029, 0x0028, 0x002a, 0x002b, 0x0648, 0x002d, 0x002e, 0x002f,
0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, 0x06f8, 0x06f9, 0x003a, 0x06a9, 0x003e, 0x003d, 0x003c, 0x061f,
0x066c, 0x0624, 0x200c, 0x0698, 0x064a, 0x064d, 0x0625, 0x0623, 0x0622, 0x0651, 0x0629, 0x00bb, 0x00ab, 0x0621, 0x0654, 0x005d,
0x005b, 0x0652, 0x064b, 0x0626, 0x064f, 0x064e, 0x0670, 0x064c, 0x0653, 0x0650, 0x0643, 0x062c, 0x005c, 0x0686, 0x00d7, 0x0640,
0x200d, 0x0634, 0x0630, 0x0632, 0x06cc, 0x062b, 0x0628, 0x0644, 0x0627, 0x0647, 0x062a, 0x0646, 0x0645, 0x067e, 0x062f, 0x062e,
0x062d, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635, 0x0637, 0x063a, 0x0638, 0x007d, 0x007c, 0x007b, 0x00f7, 0x200c
];
langCycle.push({lang: 'fa', direction: 'rtl'});


keyboardLayout['en'] = [
0x066C, 0x0624, 0x200C, 0x0698, 0x064A, 0x064D, 0x0625, 0x0623,
0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
0x0653, 0x0650, 0x0643, 0x062C, 0x005C, 0x0686, 0x00D7, 0x0640,
0x200D, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x067E, 0x062F, 0x062E,
0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
];
langCycle.push({ lang: 'en', direction: 'ltr' });
و به تکست باکس خاصیت lang="en" رو اضافه کردم ولی جواب نمی ده. لطفاً بیشتر راهنمایی کنید.

hakan648
جمعه 16 خرداد 1393, 13:09 عصر
فکرکنم تصور اشتباهی داشتم که شما کد رو بررسی میکنید یا با جاوا اسکریپت آشنایی دارید.

خروجی کدی که نوشتم در کنسول نمایش داده میشد ولی الان در لینک زیر خروجی در HTML نمایش داده می شود.

Test2
http://jsfiddle.net/DevJv/1/

کدی که کپی کردید ( قسمتی از کدی که من از سایتی که خودتون معرفی کردید برداشتم، ) کدهای حروف فارسی هستند.


اینها که نه کدهای اسکی هستند نه یونیکد. از کجا اینا به دست می یان؟
چجوری تشخیص داید؟

این ها کدهای Hexِ یونیکد هستند.

برای نمونه، حرف "چ" که در جدول فوق دارای کد 0x0686 است را در لیست کامل کرکترهای یونیکد (http://unicode-table.com/en/#0686)مشاهده کنید.

bftarane
جمعه 16 خرداد 1393, 13:55 عصر
نه من با جاوااسکریپت آشنایی چندانی ندارم. ولی تصور اشتباهی نداشتید که کد رو بررسی می کنم. به هر حال درک و دانش انسانها با هم متفاوته. اگه تسلط داشتم صددرصد اینجا نمی پرسیدم.

bftarane
جمعه 16 خرداد 1393, 16:59 عصر
خوب دوستان
معادل ها رو که پیدا کردیم

حالا در اون مقاله که گفتم همچین جمله ای نوشته شده

سپس برای اضافه کردن این زبان به چرخه زبانهای موجود در هنگام فشار دادن کلیدهای Ctrl+Space کد زیر را به انتهای این فایل اضافه کنید:








langCycle.push('xx');






ولی من نمی خوام زبان انگلیسی به لیست زبانها اضافه بشه بلکه می خوام زبان Default باشه در این صورت فکر میکنم باید در این قسمت تغییراتی داده بشه

addEvent(document, "keypress", function(e){
var target = e.target || e.srcElement;
if(!isTextField(target)) return;
var key = e.which || e.charCode || e.keyCode;

//read layout language from lang attribute
var lang = (target.getAttribute('lang') || '').match(/^[a-zA-Z]{2}/) || '';
if(!lang){
if(!langCycle.length) return true;
lang = getLangFromCycle(0);
}
این طور که متوج میشم از کد می یاد تشخیص میده زبان انگلیسی هست یا نه اگه نباشه true بر می گردونه، بنابراین فکر کردم کافیه

if(!lang)
رو تبدیل به
if(lang)
کنم تا جواب بگیرم ولی این نتیجه نداد، لطفاً کمک کنید.

hakan648
جمعه 16 خرداد 1393, 18:42 عصر
از پاسخ قبلی تا الان کد کتابخانه ای که لینک دادید رو بررسی کردم و با دانش اندکی که دارم یک کدی نوشتم که تقریبا صحیح عمل میکند.

روش کار به این صورت است که زمانی که کلیدی فشرده شد، کد اون کلید ذخیره میشه و در هر بار رویداد onkeypress ( زمانی که یک حرف به المنت اضافه میشه )، اگر حرف وارد شده اسکی نبود (چیزی جز انگلیسی)، از شماره کلیدی که در رویداد قبلی دریافت کردیم برای محاسبه حرف مورد نظر استفاده میکنیم. در حالی که اگر حرف وارد شده اسکی بود، همون حرف به المنت اضافه میشه.

دلیل دریافت کد از رویداد onkeydown هم بخاطر این است که در رویداد onkeypress به شماره کلید فشرده شده دسترسی نداریم.

توجه کنید که شماره کلید (keyCode) با شماره کرکتر (charCode) متفاوت است. charCode به کد حرف وارد شده اشاره دارد و به همین دلیل نمیشه از طریق اون حرف انگلیسی رو بدست آورد ( با فرض اینکه ممکنه کاربر به هر زبونی متن بنویسه )
اما با بدست آوردن شماره کلید، براحتی میشه حرف معادل اون رو از روی کیبورد ( به هر زبونی ) بدست آورد.

برای بدست آوردن کد معادل یک کلید، از این صفحه میتونید استفاده کنید:
Javascript Char Codes (Key Codes) - Cambia Research (http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes)

کد زیر تقریبا برای همه ی حروف بجز تعداد کمی از آن ها صحیح کار میکند و بجز چند خط، شباهت دیگری با کتابخانه ای که اول معرفی کردید ندارد.


<textarea rows="15" cols="40" id="testtextarea"></textarea>

var textBox = document.getElementById("testtextarea");

var keyCode,
isDown;

textBox.onkeydown = function (e) {
keyCode = e.keyCode;
isDown = true;
};

textBox.onkeyup = function (e) {
keyCode = null;
isDown = false;
};

textBox.onkeypress = function (e) {
var target = window.event ? e.srcElement : e.target;
var charCode = window.event ? e.keyCode : e.charCode;

console.log("plg ", keyCode, getChar(e), String.fromCharCode(getChar(e)));

//Do nothing for ASCII chars
if (charCode < 255)//0x00FF
return;

var finalCharCode = getChar(e);

try {
var newEvent;

// webkit, Chrome
if (/ Chrome\//.test(navigator.appVersion)) {
newEvent = document.createEvent('TextEvent');
newEvent.initTextEvent('textInput', true, true, window, String.fromCharCode(finalCharCode));
// webkit, other
} else if (typeof (e.initKeyboardEvent) != 'undefined') {
newEvent = document.createEvent("KeyboardEvent");
newEvent.initKeyboardEvent("keypress", true, true, window, finalCharCode, 0, false, false, false, false);
newEvent.charCode = finalCharCode;
// Gecko
} else {
newEvent = document.createEvent("KeyEvents");
newEvent.initKeyEvent("keypress", false, true, document.defaultView, false, false, false, false, 0, finalCharCode);
}
if (newEvent.isTrusted != undefined && !newEvent.isTrusted) {
throw "not trusted";
}
target.dispatchEvent(newEvent);
e.preventDefault();
} catch (err) {
try {
if (window.event) {
// Windows
e.keyCode = finalCharCode;
} else {
throw err;
}
} catch (err) {
try {
// Gecko after banning fake key emission (FF 1.0.6 to FF 1.5.0.1)
// Try inserting at cursor position
pnhMozStringInsert(target, String.fromCharCode(finalCharCode));
e.preventDefault();
} catch (err) {
// Everything else, simply add to the end of buffer
target.value += String.fromCharCode(finalCharCode);
e.preventDefault();
}
}
}

};

// Inserts a string at cursor
function pnhMozStringInsert(elt, newtext) {
var posStart = elt.selectionStart;
var posEnd = elt.selectionEnd;
var scrollTop = elt.scrollTop;
var scrollLeft = elt.scrollLeft;

elt.value = elt.value.slice(0, posStart) + newtext + elt.value.slice(posEnd);
var newpos = posStart + newtext.length;
elt.selectionStart = newpos;
elt.selectionEnd = newpos;
elt.scrollTop = scrollTop;
elt.scrollLeft = scrollLeft;
elt.focus();
}

//jQuery.getChar.js
//https://github.com/bpeacock/key-to-charCode
function getChar(e) {
/*** Convert to Char Code ***/
//var code = e.which;
var code = keyCode;

//Ignore Shift Key events & arrows
var ignoredCodes = {
16: true,
37: true,
38: true,
39: true,
40: true,
20: true,
17: true,
18: true,
91: true
};

if (ignoredCodes[code] === true) {
return false;
}

//These are special cases that don't fit the ASCII mapping
var exceptions = {
186: 59, // ;
187: 61, // =
188: 44, // ,
189: 45, // -
190: 46, // .
191: 47, // /
192: 96, // `
219: 91, // [
220: 92, // \
221: 93, // ]
222: 39, // '
//numeric keypad
96: '0'.charCodeAt(0),
97: '1'.charCodeAt(0),
98: '2'.charCodeAt(0),
99: '3'.charCodeAt(0),
100: '4'.charCodeAt(0),
101: '5'.charCodeAt(0),
102: '6'.charCodeAt(0),
103: '7'.charCodeAt(0),
104: '8'.charCodeAt(0),
105: '9'.charCodeAt(0)
};

if (exceptions[code] !== undefined) {
code = exceptions[code];
}

var ch = String.fromCharCode(code);

/*** Handle Shift ***/
if (e.shiftKey) {
var special = {
1: '!',
2: '@',
3: '#',
4: '$',
5: '%',
6: '^',
7: '&',
8: '*',
9: '(',
0: ')',
',': '<',
'.': '>',
'/': '?',
';': ':',
"'": '"',
'[': '{',
']': '}',
'\\': '|',
'`': '~',
'-': '_',
'=': '+'
};

if (special[ch] !== undefined) {
ch = special[ch];
}
}
else {
ch = ch.toLowerCase();
}

return ch.charCodeAt(0);
}


Test
http://jsfiddle.net/4sSkK/1/



در آخر عذر خواهی میکنم اگه جواب کاملی ندادم خدمتتون و تاپیکتون رو شلوغ کردم.
ظاهرا قبلا تو how2learnasp.net کمک بیشتری ازمون برمیومد و شمارو هم اذیت نمیکردیم :)

bftarane
دوشنبه 19 خرداد 1393, 10:46 صبح
اگه با این ارور در کنسول مواجه شدید
Uncaught TypeError: Cannot set property 'onkeydown' of null
ممکنه این لینک بهتون کمک کنه، به من که کمک کرد.
http://stackoverflow.com/questions/16912605/typeerror-cannot-set-property-onkeydown-of-undefined