1

重複の可能性:
Javascript の文字列としての変数名

私がやろうとしているのは、いくつかの情報を編集するための入力フィールドを用意することです。各フィールド (テキスト ボックスとチェックボックスの組み合わせ) が変更されると、AJAX が情報を更新し、変更をプロファイル ボックスに表示するように設定しています (サーバーの負荷は低く、ここでは効率を気にしません)。ユーザーが Escape キーを押した場合、テキスト ボックスの値を元の値に戻す必要があります (気が変わったフィールドを編集していた場合)。変数の問題に遭遇したテキストボックスについて-配列または隠しフィールドを使用できることは知っていますが、このバージョンを機能させる方法を知りたいです:)

変数を設定しました:

 var first_name = "' || i.instructor_fname || '";

入力フィールドがあります:

<input type="text" id="first_name" value="' || i.instructor_fname ||'">

およびエスケープ機能:

if (e.keyCode == 27) { 
   if (document.activeElement.id != "" ) {
       $("#" + document.activeElement.id)
                 .val(document.activeElement.id);
   }
}

first_name の場合、出力は first_name です。テキスト ボックスが正しく設定されているため、値が正しく設定されています。「first_name」を変数としてではなく、文字列として読み取っているようです。リテラルを結合するいくつかの組み合わせを試しましたが、まだうまくいきません。そこに何かアイデアはありますか?繰り返しますが、これには他の手法を使用できることはわかっていますが、これを理解することは他のプロジェクトに役立つようです。

4

4 に答える 4

1

よくわかりませんが、おそらく document.activeElement.id で eval() を呼び出す必要があります。

于 2012-07-26T20:58:24.797 に答える
0

どちらも理解できるかどうかはわかりませんが、これはどれくらい近づいていますか?

http://jsfiddle.net/PXcD8/

html:

<input type="text" id="foobar">

js:

$(function()
{
    $(':text').each(function()
    {
        var text = $(this);
        text.keyup(function(event)
        {
            if (event.which == 27)
                reset_textbox();
        });

        reset_textbox();

        function reset_textbox()
        {
                text.val(text.attr('id'));            
        }
    });
});

これにより、テキストフィールドのテキストが、最初は id と同じ値に設定され、ユーザーがエスケープを押してフォーカスしたときに設定されます。

于 2012-07-26T21:14:20.060 に答える
0

別の解決策を探している場合は、入力にdefault-value属性を単純に含めてみませんか。

<input type="text" id="first_name" value="' || i.instructor_fname ||'"
    default-value="' || i.instructor_fname ||'" />

次に、Escape キー ハンドラー内で

if (e.keyCode == 27) if (document.activeElement.id != "" ) {
    var e = $("#" + document.activeElement.id);
    e.val(e.attr('default-value'));
}

個人的には、これは JavaScript 変数をあちこちに配置するよりも少しエレガントでクリーンな感じがします。

加えて...

default-valueが入力要素の初期と常に一致すると仮定して実装を考えると、サーバーがページのマークアップをレンダリングする方法を変更する必要さえありません。つまり、元の入力要素を引き続きレンダリングします ( default-value属性を差し引いたもの)。

<input type="text" id="first_name" value="' || i.instructor_fname ||'" />​

必要なのは、次の起動スクリプトだけです

$(document).ready(function() {
    $('input').each(function() {
        var e = $(this);
        e.attr('default-value', e.val());
    });
})
于 2012-07-26T21:45:09.837 に答える
0

より適切な解決策は、field_id -> valueマップを作成することです。これは、オブジェクトを使用して簡単に実行できます。

var field_values = {
    first_name: "' || i.instructor_fname || '",
    last_name: "...',
    // ...
};

次に、ブラケット表記を使用するだけで値を取得できます。

$("#" + document.activeElement.id)
    .val(field_values[document.activeElement.id]);

実行されたハンドラーが変更する要素にバインドされていると仮定すると、コードは次のように単純になります。

$(this).val(field_values[this.id]);
于 2012-07-26T21:26:48.900 に答える