0

PythonでオンザフライでjQuery関数を作成しています:

jQuery = ("$('%(other_id)').click(function() { "
              "    if ($(this).is(':checked')) { "
              "        $('%(text_id)').show()     "
              "    } "
              "    else {"
              "       $('%(text_id)').hide()"
              "    }"
              " });")

と に変数を挿入する必要がother_idありtext_idます。記号が文字列テンプレートに使用されていることがわかり$ます(ただし、それが何をするかはわかりません)ので、double- $s($$)でエスケープします

jQuery = ("$$('%(other_id)').click(function() { "
              "    if ($$(this).is(':checked')) { "
              "        $$('%(text_id)').show()     "
              "    } "
              "    else {"
              "       $$('%(text_id)').hide()"
              "    }"
              " });")

しかし、私はまだこれをフォーマットすることはできません:

>>> choice_id = 'foo'
>>> text_choice_id = 'bar'
>>> jQuery = ("$$('%(other_id)').click(function() { "
                  "    if ($$(this).is(':checked')) { "
                  "        $$('%(text_id)').show()     "
                  "    } "
                  "    else {"
                  "       $$('%(text_id)').hide()"
                  "    }"
                  " });")
>>> jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }

Traceback (most recent call last):
  File "<pyshell#123>", line 1, in <module>
    jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }
ValueError: unsupported format character ''' (0x27) at index 15

一重引用符をエスケープした後:

>>> jQuery = ("$$(\'%(other_id)\').click(function() { "
                  "    if ($$(this).is(\':checked\')) { "
                  "        $$(\'%(text_id)\').show()     "
                  "    } "
                  "    else {"
                  "       $$(\'%(text_id)\').hide()"
                  "    }"
                  " });")
>>> jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }

Traceback (most recent call last):
  File "<pyshell#125>", line 1, in <module>
    jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }
ValueError: unsupported format character ''' (0x27) at index 15

string.format()文字列内に括弧があるため、試すことができません。'サポートされていない形式の文字が表示され続けるのはなぜですか?

4

2 に答える 2

6

フォーマッタ タイプがありません:

%(other_id)s

s括弧の後に注意してください。値を文字列として補間したい。代わりに、動作するバージョンを次に示します。

jQuery = ("$('#%(other_id)s').click(function() { "
                  "    if ($(this).is(':checked')) { "
                  "        $('#%(text_id)s').show()     "
                  "    } "
                  "    else {"
                  "       $('#%(text_id)s').hide()"
                  "    }"
                  " });")

ドル記号は%- スタイルの文字列形式では意味がありません。ID#セレクターを追加しました。:-)

個人的には、"""代わりに三重引用符を使用します。

jQuery = """\
$('#%{other_id}s').click(function() {
    if ($(this).is(':checked')) {
        $('#%(text_id)s').show()
    }
    else {
        $('#%(text_id)s').hide()
    }
});
"""

とにかく、これを Jinja テンプレートに入れて (Flask を使用しているため)、代わりにそれをレンダリングします。

jquery = render_template('toggle_field.js', other_id=choice_id, text_id=text_choice_id)

jQuery スニペットのtoggle_field.jsJinja テンプレート バージョンは次のとおりです。

$('#{{ other_id }}').click(function() {
    if ($(this).is(':checked')) {
        $('#{{ text_id }}').show()
    }
    else {
        $('#{{ text_id }}').hide()
    }
});
于 2013-02-04T23:09:50.593 に答える
0

コード生成の代わりに、データ駆動型のアプローチを検討してください。次の 2 つの関数を静的に定義します。できれば、すべての html ファイルに含める js ファイルで定義します。

function toggle_if_checked(checkbox, toggleable) {
    var cbox = $(checkbox), tgl = $(toggleable);
    tgl.toggle(cbox.is(':checked'));
}

function register_check_show_events(elist) {
    var i, cboxselector, textselector;
    function handler(e) {
        toggle_if_checked(e.target, e.data);
    }
    for (i = 0; i < elist.length; i++) {
        cboxselector = '#'+elist[0];
        textselector = '#'+elist[1];
        $(cboxselector).on('click', null, textselector, handler);
    }
}

次に、イベント ハンドラーを登録するために、ID の Python リストを収集し、JSON を介して JavaScript で使用できるようにします。

import json

ids = [('cboxid1','textboxid1'),('cboxid2','textboxid2')]
json_ids = json.dumps(ids)
script = 'register_check_show_events({});'.format(json_ids)

一般に、 JavaScript コードを動的に生成するのではなく、JSON を介して Python レイヤーと JS レイヤーの間でデータを渡すだけの場合、コードはよりクリーンで維持しやすくなります。

于 2013-02-05T00:02:18.590 に答える