Flask应用程序在外部文件中不执行javascript

时间:2014-05-21 16:52:42

标签: javascript jquery python flask

我的HTML文件包含我的CSS和JS。在创建我的烧瓶应用程序时,我决定将CSS和JS分开以分隔静态目录中的文件。

当我在一个HTML文件中包含所有内容时,一切都按预期工作,但当CSS和JS在单独的文件中时,JS的某些部分不会执行。

这是我在HTML文件中导入的内容:

<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script type="text/javascript" src="{{ url_for('static', filename='scripts/main.js') }}"></script>
    <link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.4.2/pure-min.css">
    <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
</head>

这是独立JS文件的内容:

$('#user_button').click(function(event) {
    $("#user_id").html($('option:selected').html());
    $('.button_div').show();
});

var prodData = [];
var boughtProds = [];

$('.prod_button').click(function(event) {

    if (boughtProds.indexOf($(this).data('name')) == -1) {
        prodData.push({
            name: $(this).data('name'),
            price: $(this).data('price'),
            quantity: 1,
        });
        boughtProds.push($(this).data('name'));
    } else {
        prodData[boughtProds.indexOf($(this).data('name'))].quantity = prodData[boughtProds.indexOf($(this).data('name'))].quantity + 1;
    }

    var total = 0;
    for (var x in prodData) total += prodData[x].price * prodData[x].quantity
    total = Math.round(total * 100) / 100
    var subtotal = '<tr><td></td><td>Subtotal</td><td>$' + total + '</td></tr>';

    var allProds = '';
    $.each(prodData, function(k, v) {
        allProds = allProds + '<tr><td>' + v.name + '</td><td>' + v.quantity + 'x</td><td>@ $' + v.price + ' each</td></tr>\n';

    });

    $('.table_contents > tbody').html(allProds);
    $('.table_contents > tfoot').html(subtotal);

});

$(document).ready(
    function() {
        $('.button_div').hide();
    })

奇怪的是这个函数在文档加载上正常工作:

 $(document).ready(
        function() {
            $('.button_div').hide();
        })

并且此功能不起作用:

$('#user_button').click(function(event) {
    $("#user_id").html($('option:selected').html());
    $('.button_div').show();
});

但更奇怪的是,当一切都在一个HTML文件中时,一切都有效。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您需要在<script type="text/javascript" src="{{ url_for('static', filename='scripts/main.js') }}"></script>标记之外移动<head>(例如,移到<body>的末尾),或者您需要将$('#user_button').click(...);放在$(document).ready(...);内}。

正在发生的事情是您的浏览器在处理您的<head>标记时开始加载外部脚本文件。加载文件后,浏览器会立即执行该文件,将click事件绑定到#user_button。这是在处理您的<body>代码之前发生的,因此#user_button还不是DOM的一部分。

如果你试图检查$('#user_button'),你会发现它是空的。

console.log($('#user_button'));

此输出

[]

答案 1 :(得分:2)

我也遇到过类似的问题。在检查网络时,静态js正在从缓存加载。 当我关闭缓存时,它开始工作。 因此,您需要在开发过程中重新启动调试服务器或关闭缓存。