草庐IT

javascript - 键入时如何将文本框输入语言更改为波斯语

coder 2024-05-11 原文

我在一个网站上工作,用户应该在其中用不同的语言填写一些字段。 我不希望用户使用 Alt+Shift 组合键更改他们的书写语言,而是希望输入语言自动更改为波斯语或英语。

有什么办法吗?

最佳答案

使用以下脚本:

if (typeof HTMLElement!="undefined" && ! HTMLElement.prototype.insertAdjacentElement) {    
HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode) {
    switch (where) {
        case 'beforeBegin':
            this.parentNode.insertBefore(parsedNode,this)
            break;
        case 'afterBegin':
            this.insertBefore(parsedNode,this.firstChild);
            break;
        case 'beforeEnd':
            this.appendChild(parsedNode);
            break;
        case 'afterEnd':
            if (this.nextSibling)
                this.parentNode.insertBefore(parsedNode,this.nextSibling);
            else
                this.parentNode.appendChild(parsedNode);
            break;
    }
}

HTMLElement.prototype.insertAdjacentHTML = function (where,htmlStr) {
    var r = this.ownerDocument.createRange();
    r.setStartBefore(this);
    var parsedHTML = r.createContextualFragment(htmlStr);
    this.insertAdjacentElement(where,parsedHTML)
}

HTMLElement.prototype.insertAdjacentText = function (where,txtStr) {
    var parsedText = document.createTextNode(txtStr)
    this.insertAdjacentElement(where,parsedText)
}
}

var FarsiType = {
// Farsi keyboard map based on Iran Popular Keyboard Layout
farsiKey: [
    32, 33, 34, 35, 36, 37, 1548,   1711,
    41, 40, 215,    43, 1608,   45, 46, 47,
    48, 49, 50, 51, 52, 53, 54, 55,
    56, 57, 58, 1705,   44, 61, 46, 1567,
    64, 1616,   1584,   125,    1609,   1615,   1609,   1604,
    1570,   247,    1600,   1548,   47, 8217,   1583,   215,
    1563,   1614,   1569,   1613,   1601,   8216,   123,    1611,
    1618,   1573,   126,    1580,   1688,   1670,   94, 95,
    1662,   1588,   1584,   1586,   1740,   1579,   1576,   1604,
    1575,   1607,   1578,   1606,   1605,   1574,   1583,   1582,
    1581,   1590,   1602,   1587,   1601,   1593,   1585,   1589,
    1591,   1594,   1592,   60, 124,    62, 1617
],
Type: true,
counter: 0,
ShowChangeLangButton: 1,    // 0: Hidden / 1: Visible
KeyBoardError: 0,           // 0: Disable FarsiType / 1: Show Error
ChangeDir: 2,           // 0: No Action / 1: Do Rtl-Ltr / 2: Rtl-Ltr button
UnSupportedAction: 0        //0: Disable FarsiType / 1: Low Support
}

FarsiType.enable_disable = function(Dis) {
var invis, obj;

if (!Dis.checked)  {
    FarsiType.Type = true;
    disable = false;
    color = 'darkblue';
} else {
    FarsiType.Type = false;
    disable = true;
    color = '#ECE9D8';
}

if (FarsiType.ShowChangeLangButton == 1) { 
    for (var i=1; i<= FarsiType.counter; i++) {
        obj = document.getElementById('FarsiType_button_' + i);
        obj.disabled = disable;
        obj.style.backgroundColor = color;
    }
}
}

FarsiType.Disable = function() {
FarsiType.Type = false;
var Dis = document.getElementById('disableFarsiType')
if (Dis != null) {
    Dis.checked = true;
}

if (FarsiType.ShowChangeLangButton == 1) { 
    for (var i=1; i<= FarsiType.counter; i++) {
        obj = document.getElementById('FarsiType_button_' + i);
        obj.disabled = true;
        obj.style.backgroundColor = '#ECE9D8';
    }
}
}

FarsiType.init = function() {

var Inputs = document.getElementsByTagName('INPUT');
for (var i=0; i<Inputs.length; i++) {
    if (Inputs[i].type.toLowerCase() == 'text' && (Inputs[i].lang.toLowerCase() == 'fa' || Inputs[i].lang.toLowerCase() == 'fa-ir')) {
        FarsiType.counter++;
        new FarsiType.KeyObject(Inputs[i], FarsiType.counter);
    }
}

var Areas = document.getElementsByTagName('TEXTAREA');
for (var i=0; i<Areas.length; i++) {
    if (Areas[i].lang.toLowerCase() == 'fa' || Areas[i].lang.toLowerCase() == 'fa-ir') {
        FarsiType.counter++;
        new FarsiType.KeyObject(Areas[i], FarsiType.counter);
    }
}

var Dis = document.getElementById('disableFarsiType')
if (Dis != null) {
    FarsiType.enable_disable (Dis);
    Dis.onclick = new Function( "FarsiType.enable_disable (this);" )
}
}

FarsiType.KeyObject = function(z,x) {

GenerateStr = "";
if (FarsiType.ShowChangeLangButton == 1) {
    GenerateStr = GenerateStr + "<input type='button' id=FarsiType_button_"+x+" style='border: none; background-color:darkblue; font-size:11; color:white; font-family:tahoma; padding: 1px; margin: 1px; width: auto; height: auto;' value='FA' />&nbsp;";
}
if (FarsiType.ChangeDir == 2) {
    GenerateStr = GenerateStr  + "<input type='button' id=FarsiType_ChangeDir_"+x+" style='border: none; background-color:darkblue; font-size:11; color:white; font-family:tahoma; padding: 1px; margin: 1px; width: auto; height: auto;' value='RTL' />"
}
z.insertAdjacentHTML("afterEnd", GenerateStr);

if (FarsiType.ShowChangeLangButton == 1) { 
    z.bottelm = document.getElementById ('FarsiType_button_' + x);
    z.bottelm.title = 'Change lang to english';
}
if (FarsiType.ChangeDir == 2) {
    z.Direlm = document.getElementById ('FarsiType_ChangeDir_' + x); 
}

z.farsi = true;
z.dir = "rtl";
z.align = "right";

z.style.textAlign = z.align;
z.style.direction = z.dir;

setSelectionRange = function(input, selectionStart, selectionEnd) {
    input.focus()
    input.setSelectionRange(selectionStart, selectionEnd)
}

ChangeDirection = function() {
    if (z.dir == "rtl") {
        z.dir = "ltr";
        z.align = "left";
        z.Direlm.value = "LTR";
        z.Direlm.title = "Change direction: Right to Left"
    } else {
        z.dir = "rtl";
        z.align = "right";
        z.Direlm.value = "RTL";
        z.Direlm.title = "Change direction: Left to Right"
    }
    z.style.textAlign = z.align;
    z.style.direction = z.dir;
    z.focus();
}

ChangeLang = function(e, ze) {
    if(ze)
        z = ze;

    if (FarsiType.Type) {
        if (z.farsi) {
            z.farsi = false;
            if (FarsiType.ShowChangeLangButton == 1) { 
                z.bottelm.value = "EN";
                z.bottelm.title = 'Change lang to persian';
            }
            if (FarsiType.ChangeDir == 1) {
                z.style.textAlign = "left";
                z.style.direction = "ltr";
            }
        } else {
            z.farsi = true;
            if (FarsiType.ShowChangeLangButton == 1) { 
                z.bottelm.value = "FA";
                z.bottelm.title = 'Change lang to english';
            }
            if (FarsiType.ChangeDir == 1) {
                z.style.textAlign = "right";
                z.style.direction = "rtl";
            }
        }
        z.focus();
    }
    
    if (e.preventDefault) e.preventDefault();
    e.returnValue = false;
    return false;
}

Convert = function(e) {

    if (e == null)
        e = window.event;

    var key = e.which || e.charCode || e.keyCode;
    var eElement = e.target || e.originalTarget || e.srcElement;

    if (e.ctrlKey && key == 32) {
        ChangeLang(e, z);
    }

    if (FarsiType.Type) {
        if (
            (e.charCode != null && e.charCode != key) ||
            (e.which != null && e.which != key) ||
            (e.ctrlKey || e.altKey || e.metaKey) ||
            (key == 13 || key == 27 || key == 8)
        ) return true;

        //check windows lang
        if (key > 128) {
            if (FarsiType.KeyBoardError == 0) {
                FarsiType.Disable();
            } else {
                alert("Please change your windows language to English");
                return false;
            }
        }

        // If Farsi
        if (FarsiType.Type && z.farsi) {

            //check CpasLock
            if ((key >= 65 && key <= 90&& !e.shiftKey) || (key >= 97 && key <= 122 ) && e.shiftKey) {
                alert("Caps Lock is On. To prevent entering farsi incorrectly, you should press Caps Lock to turn it off.");
                return false;
            }

            // Shift-space -> ZWNJ
            if (key == 32 && e.shiftKey)
                key = 8204;
            else
                key = FarsiType.farsiKey[key-32];

            key = typeof key == 'string' ? key : String.fromCharCode(key);

            // to farsi
            try {
            
                var docSelection = document.selection;
                var selectionStart = eElement.selectionStart;
                var selectionEnd = eElement.selectionEnd;

                if (typeof selectionStart == 'number') { 
                    //FOR W3C STANDARD BROWSERS
                    var nScrollTop = eElement.scrollTop;
                    var nScrollLeft = eElement.scrollLeft;
                    var nScrollWidth = eElement.scrollWidth;

                    eElement.value = eElement.value.substring(0, selectionStart) + key + eElement.value.substring(selectionEnd);
                    setSelectionRange(eElement, selectionStart + key.length, selectionStart + key.length);
    
                    var nW = eElement.scrollWidth - nScrollWidth;
                    if (eElement.scrollTop == 0) { eElement.scrollTop = nScrollTop }
                } else if (docSelection) {
                    var nRange = docSelection.createRange();
                    nRange.text = key;
                    nRange.setEndPoint('StartToEnd', nRange);
                    nRange.select();
                }

            } catch(error) {
                try {
                    // IE
                    e.keyCode = key
                } catch(error) {
                    try {
                        // OLD GECKO
                        e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, eElement);
                    } catch(error) {
                        //OTHERWISE
                        if (FarsiType.UnSupportedAction == 0) {
                            alert('Sorry! no FarsiType support')
                            FarsiType.Disable();
                            var Dis = document.getElementById('disableFarsiType')
                            if (Dis != null) {
                                Dis.disabled = true;
                            }
                            return false;
                        } else {
                            eElement.value += key;                  
                        }
                    }
                }
            }

            if (e.preventDefault)
                e.preventDefault();
            e.returnValue = false;
        }
    }
    return true;
}

if (FarsiType.ShowChangeLangButton == 1) { z.bottelm.onmouseup = ChangeLang; }
if (FarsiType.ChangeDir == 2) { z.Direlm.onmouseup = ChangeDirection; }
z.onkeypress = Convert;
}

if (window.attachEvent) {
window.attachEvent('onload', FarsiType.init)
} else if (window.addEventListener) {
window.addEventListener('load', FarsiType.init, false)
}    

现在您所要做的就是创建一个文本框并将其 Lang 属性设置为“fa-IR”。

<input type="textbox" name="text1" Lang="fa-IR" />

<asp:TextBox ID="txt_name" runat="Server" Lang="fa-IR" />

加载您的页面,大功告成!

关于javascript - 键入时如何将文本框输入语言更改为波斯语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18041312/

有关javascript - 键入时如何将文本框输入语言更改为波斯语的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

随机推荐