Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在带有Django模板标记的文件上运行JSHint?_Javascript_Django_Jshint - Fatal编程技术网

Javascript 如何在带有Django模板标记的文件上运行JSHint?

Javascript 如何在带有Django模板标记的文件上运行JSHint?,javascript,django,jshint,Javascript,Django,Jshint,我想在我所有的Javascript源文件上运行JSHint,但其中有几个有一些嵌入的Django模板标记。JSHint在这个标记上抛出大量错误 有没有一种方法可以 告诉JSHint忽略此标记 使用一些伪数据运行Djnago模板解析器,以生成呈现的js文件的所有排列,然后对其运行JSHint 我想我可以编写一堆代码来完成#2,但我想知道是否有更简单的方法。根据标记,您可以通过JavaScript注释“隐藏”Django标记。我们这样做,例如: // {% if cond %} someJavaSc

我想在我所有的Javascript源文件上运行JSHint,但其中有几个有一些嵌入的Django模板标记。JSHint在这个标记上抛出大量错误

有没有一种方法可以

  • 告诉JSHint忽略此标记
  • 使用一些伪数据运行Djnago模板解析器,以生成呈现的js文件的所有排列,然后对其运行JSHint

  • 我想我可以编写一堆代码来完成#2,但我想知道是否有更简单的方法。

    根据标记,您可以通过JavaScript注释“隐藏”Django标记。我们这样做,例如:

    // {% if cond %}
    someJavaScriptCode();
    // {% else %}
    somethingElse();
    // {% endif %}
    
    // {% include "script.js" %}
    

    唯一的问题是,您必须以一个空行启动script.js,否则
    /
    将吃掉您在那里的第一行合法JavaScript代码。我写了一个简单的助手,可以自动帮我完成这个任务。

    你也可以使用这个丑陋的解决方案。jslint认为“stuff=”是评论的一部分

    var stuff;
    /* {{ '*' + '/' }}
    stuff = {{ variable_containing_json_object_or_list }};                      
    // */
    

    就我个人而言,我在通过jslint工具传递django javascript模板时遇到了3个问题:

    控制结构 它们可以很容易地隐藏在javascript注释中,正如Anton Kovalyov提出的:

    // {{ if some_flag }}
    console.log("Conditional log");
    // {{ endif }}
    
    字符串变量 显而易见的解决方案是用双引号将django标记括起来。但是,值得记住的是,如果变量内容没有正确转义,则生成的代码可能无效:

    var javascript_var = "{{ context_var|escapejs }}";
    
    序列化为json的复杂结构 埃德温的把戏奏效了:

    var javascript_var;
    /* {{ '*' + '/' }}
    javascript_var = {{ context_json_string_var }};                      
    // */
    
    如果在html模板中包含javascript源模板,则可以在其中声明“getter”函数并从javascript脚本访问它:

    <script type="text/javascript">function getIt() { return {{ context_var }}; };</script>
    <script type="text/javascript">{% include 'script.js' %}</script>
    

    我发现使用--extract标志会起作用。它还可以删除模板中可能包含的任何html代码

    jshint --extract=always your_template_file.html
    

    实际上,有一种规范的方法可以从JSHint中隐藏Django标记(或任何其他内容):

    /* jshint ignore:start */
    javascript_var = {{ context_json_string_var }};
    /* jshint ignore:end */
    
    JSLint的情况也一样:

    /*ignore jslint start*/
    javascript_var = {{ context_json_string_var }};
    /*ignore jslint end*/
    

    所以,这让我克服了95%的问题,这是一个很好的简单解决方案,但现在我担心错误,或者更恰当地说是遗漏错误,因为我正在测试IF的两个分支。你在实践中发现过这个问题吗?是的,我确实有这个问题。但最终避免了它,因为我以Django模板仅用于获取动态数据的方式重构了我们的应用程序。其他一切都是CDN上的原始JavaScript。对不起,我不知道这是否有用-\在本例中,如何处理单个变量include,例如,
    {{variable\u name}}
    ?我们仅在字符串中使用Django变量。我们有一个更复杂的对象(只有一个),它实际上包含了我们需要的所有东西,我们将其字符串化,然后对其进行解析。类似这样:
    var data=“{{jsonData|parse}”
    
    /*ignore jslint start*/
    javascript_var = {{ context_json_string_var }};
    /*ignore jslint end*/