Javascript innerhtml不适用于twig标签

时间:2014-10-15 10:51:59

标签: javascript jquery twig innerhtml

我在twig中有一个函数,它从db中选择一些值并显示一个selectbox。我想改变div的内容。问题是使用innerHTML {{创建一个没有引号的新行,这显示为错误。它没有得到选择框,因为它没有引号。

$(document).ready(function() {
               $type = $("select[name='dtl[USER_TYPE]']");

               $type.change(function() {

                   if ($(this).val() == "AUTOR") {
                       var content = '{{ mm.select(holdersdata, data.USER_TYPE_OBJECT_KOD, 'dtl[USER_TYPE_OBJECT_KOD]')  }}';
                       document.getElementById("kodi").innerHTML = '"'+ content + '"';
                   }
               });
           });

macros.twig

<select data-placeholder="{{ translate('ZGJIDH_NJE') }}" name="{{ name }}" class="form-control input-sm chosen-select">
        <option {% if not options.allowNull %}disabled{% endif %} selected value>{{ translate('ZGJIDH_NJE') }}</option>
        {% for f in dataset %}
            <option value="{{ f[kodField] }}" {% if f[kodField] | trim == selectedVal %}selected{% endif %}>
                {% if f[labelField] %}
                    {{ f[labelField] }} {% if f[kodField] %}&mdash; ({{ f[kodField] }}){% endif %}
                {% else %}
                    {{ f[kodField] }}
                {% endif %}
            </option>
        {% endfor %}
    </select>

EDIT 这在控制台中显示。 {{创建一个没有引号的新行:

 var content = "        
    <select data-placeholder="Zgjidh nje..." name="dtl[USER_TYPE_OBJECT_KOD]" class="form-control input-sm chosen-select">
        <option disabled selected value>Zgjidh nje...</option>
            </select>

2 个答案:

答案 0 :(得分:0)

问题是你的twig语法破坏了javascript语法。请参阅下文,只需将'更改为"

即可
               if ($(this).val() == "AUTOR") {
                   var content = '{{ mm.select(holdersdata, data.USER_TYPE_OBJECT_KOD, 'dtl[USER_TYPE_OBJECT_KOD]')  }}';
                   document.getElementById("kodi").innerHTML = '"'+ content + '"';
               }

正确的代码:

           if ($(this).val() == "AUTOR") {
               var content = "{{ mm.select(holdersdata, data.USER_TYPE_OBJECT_KOD, 'dtl[USER_TYPE_OBJECT_KOD]')  }}";
               document.getElementById("kodi").innerHTML = '"'+ content + '"';
           }

由于输出的内容,JS也在破坏。你可以通过扩展树枝来解决这个问题:

$filter = new Twig_SimpleFilter('escape_for_js', function ($string) {
    $needles= array(
       "\n",
       "\r",
       '"',
    );
    $replaces = array(
      '',
      '',
      '\"',
    );
    return str_replace($needles, $replaces, $string);
});

将此过滤器添加到树枝中:

$twig = new Twig_Environment($loader);
$twig->addFilter($filter

使用此过滤器:

var content = "{{ mm.select(holdersdata, data.USER_TYPE_OBJECT_KOD, 'dtl[USER_TYPE_OBJECT_KOD]') | escape_for_js }}";

有关延长树枝here

的详情

答案 1 :(得分:0)

无需自己延长Twig。只需使用json_encode

var content = {{ mm.select(holdersdata, data.USER_TYPE_OBJECT_KOD, 'dtl[USER_TYPE_OBJECT_KOD]') | json_encode }};

注意缺少报价。 json_encode会为你添加它们。