我正在使用python创建一个jQuery函数:
jQuery = ("$('%(other_id)').click(function() { "
" if ($(this).is(':checked')) { "
" $('%(text_id)').show() "
" } "
" else {"
" $('%(text_id)').hide()"
" }"
" });")
我必须将变量插入other_id
和text_id
。我看到$
符号用于字符串模板(不知道它做了什么)所以我用双重$
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()
,因为我在字符串中有括号。为什么我一直将'
作为一些不受支持的格式字符?
答案 0 :(得分: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)
其中toggle_field.js
是jQuery代码段的Jinja模板版本:
$('#{{ other_id }}').click(function() {
if ($(this).is(':checked')) {
$('#{{ text_id }}').show()
}
else {
$('#{{ text_id }}').hide()
}
});
答案 1 :(得分:0)
不考虑代码生成,而是考虑采用数据驱动的方法。静态定义以下两个函数,最好是在所有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);
}
}
然后注册你的事件处理程序,收集一个Python的id列表,并通过JSON将它提供给javascript。
import json
ids = [('cboxid1','textboxid1'),('cboxid2','textboxid2')]
json_ids = json.dumps(ids)
script = 'register_check_show_events({});'.format(json_ids)
通常,如果您只通过JSON在Python和JS层之间传递 data 而不是动态生成javascript代码,那么您的代码将更清晰,更易于维护。