【问题标题】:Changing the language of the form更改表单的语言
【发布时间】:2014-03-18 17:27:27
【问题描述】:

我有一个默认语言设置为英语的表单。在页面顶部,我有 4 种不同语言(英语、法语、意大利语、德语)的链接,我想要做的是,一旦用户单击其中一种语言,它就会将表单中输入标签的文本更改为特定语言。我已将语言存储在 4 个单独的文本文件中,但在我的 JavaScript 中有些东西不起作用。我个人认为这是一个语法错误,或者可能是一个我没有注意到的小编码错误。

HTML

<header>
        <ul id="languageChoice">
            <li class="rbord"><a name="deutsche" id="deutsche">Deutsche</a></li> 
            <li class="rbord"><a name="italiano" id="italiano">Italiano</a></li>
            <li class="rbord"><a name="Francais" id="francais">Francais</a></li>
            <li class="rbord"><a name="English" id="english">English</a></li>
        </ul>
    </header>
    <form method="GET" action="#" id="add1">
        <table>
            <tr><td class = "field"><label for="firstName">First Name:</label></td><td><input id="firstName" size=10 name="firstName"></td></tr>
            <tr><td class = "field"><label for="lastName">Last Name:</label></td><td><input id="lastName" size=15 name="lastName"></td></tr>
            <tr><td class = "field"><label for="address1">Address 1:</label></td><td><input id="address1" size=25 name="address1"></td></tr>
            <tr><td class = "field"><label for="address2">Address 2:</label></td><td><input id="address2" size=25 name="address2"></td></tr>
            <tr><td class = "field"><label for="city">City:</label></td><td><input id="city" size=20 name="city"></td></tr>
            <tr><td class = "field"><label for="province">Province:</label></td><td><input id="province" size=20 name="province"></td></tr>
            <tr><td class = "field"><label for="postalCode">Postal Code:</label></td><td><input id="postalCode" size=7 name="postalCode"></td></tr>
        </table>
    </form>

文本文件示例 (english.txt)

First Name:,Last Name:,Address 1:,Address 2:,City:,Province:,Postal Code:

Javascript

function init(){
var language = document.getElementsByTagName("a");

for (var i = 0, i < language.length; i++){
    language[i].onclick = processRequest;
}
}

function processRequest(e) {
evt = e || window.event;
target = evt.target || evt.srcElement;
request.onreadystatechange = displayData;
request.open('GET', target.id+".txt", true);
request.send(null);
}

function displayData() {
if (request.readyState == 4 && request.status == 200)
    var fields = request.responseText.split(",");
    var labels = document.getElementsByTagName("label");

    for (var i = 0, i < labels.length; i++){
        labels[i].innerText = fields[i];
    }
}


window.onload = init();

【问题讨论】:

    标签: javascript forms


    【解决方案1】:

    您尚未创建 ajax 请求。记得把javascript放在页面末尾,改成

    var request;
    function init() {
        var language = document.getElementsByTagName("a");
        for (var i = 0; i < language.length; i++) {
            language[i].onclick = processRequest;
        }
    }
    
    function processRequest(e) {
        evt = e || window.event;
        target = evt.target || evt.srcElement;
        request = new XMLHttpRequest();
        request.onreadystatechange = displayData;
        request.open('GET', target.id + ".txt", true);
        request.send(null);
    }
    
    function displayData() {
        if (request.readyState == 4 && request.status == 200) {
            var fields = request.responseText.split(",");
            var labels = document.getElementsByTagName("label");
            for (var i = 0; i < labels.length; i++) {
                labels[i].innerText = fields[i];
            }
        }
    }
    

    【讨论】:

    • 我编辑的代码工作正常,但是在这里发布时出现了一些错误,现在你可以尝试一下
    • 解决方案是什么?这里,request 变量是全局变量。您之前没有传递request 变量吗?问题是 javascript 在文档中的位置吗?
    • request 是一个全局变量。在此代码中,processRequest 函数在 displayData 函数之前被调用。否则,在 processRequest 函数内部调用 displayData 函数,并在创建 ajax 请求后 request = new XMLHttpRequest(); request.onreadystatechange = displayData; @showdev
    • 是的,+1 我同意。这些似乎与我建议的更改非常相似。我只是想知道是什么具体解决了 OP 的问题。
    【解决方案2】:

    还有一个错误:Can't find variable: request

    “请求”变量未定义。

    function processRequest(e) {
        evt = e || window.event;
        target = evt.target || evt.srcElement;
        var request = new XMLHttpRequest();             <<-- added this
        request.onreadystatechange = displayData(request);
        request.open('GET', target.id+".txt", true);
        request.send(null);
    }
    

    此外,您可能希望重组displayData() 函数以接受传递的request 变量并根据请求状态/状态有条件地继续。否则,fields 未定义:'undefined' is not an object (evaluating 'fields[i]')

    function displayData(request) {
        if (request.readyState == 4 && request.status == 200) {
            var fields = request.responseText.split(",");
            var labels = document.getElementsByTagName("label");
    
            for (var i = 0; i < labels.length; i++) {
                labels[i].innerText = fields[i];
            }
        }
    }
    

    编辑:

    此外,如果您的 javascript 位于页面的 &lt;head&gt; 部分,请将您的 init 函数调用更改为:window.onload = init;(不带括号)。否则,init 函数将在文档加载之前立即执行。

    【讨论】:

    • 不幸的是,即使进行了这些更改,它仍然无法正常工作。警报仍然在任何地方都有效。可能是我的窗口加载还是我如何设置所有功能?我真的不知道了:(
    • 我建议您检查浏览器的错误控制台。它有助于追踪 javascript 错误。让我知道你在那里看到了什么。
    • 在 Firefox 中绝对没有显示任何错误。可能是我没有正确调用我的文本文件吗?我用表单中的相同 ID 保存了它们,所以我可以将 .txt 添加到我的 javascript..
    【解决方案3】:

    如果您在上面发布的代码正是您使用的代码,请检查您的 for 循环并更正参数

    for (var i = 0, i < labels.length; i++)
    

    【讨论】:

    • +1 同意。使用分号代替逗号。 SyntaxError: Unexpected token '&lt;'
    • 这有点帮助,但并不完全。我的警报现在显示了,但表单仍然没有更改语言。
    • 无论我把它们放在哪里,开始或结束,我的提醒都能正常工作。所以我猜这排除了语法错误......
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多