【问题标题】:javascript function not getting calledjavascript函数没有被调用
【发布时间】:2011-12-30 23:07:47
【问题描述】:

在 Django 模板中,我有一个函数

function show_graph(i){
    $("#"+i+"seegraph").click(function(){
        $("#"+i+"graph").show();

    var qaa = {{ question_ids }};

    var qid = qaa[i-1];
        jQuery.ajax({
            url: "/canvas/recreatechart/",
            type: "get",
            data: {qid: qid },
            success: function(response){
                var resp = jQuery.parseJSON(response);
                alert("chart1"+i);
                show_graph("chart1"+i, resp['chart_type'], resp['series_names'], JSON.stringify(resp['data1']), resp['answer'], resp['stories1'], resp['colors'], resp['stacked'], resp['title1']);

                show_graph(resp['second_graph']+i,resp['chart_type'], resp['series_names'], resp['data2'], resp['answer'], resp['stories2'], resp['colors'], resp['stacked'], resp['title2']);
            }

        });

    });
}

并立即在 show_graph 内发出警报,我从中推断出 show_graph 没有被调用,但我不知道为什么。

我的控制台没有任何错误,当我尝试在第一次调用中逐个提醒每个参数时,它们都按预期显示,尽管“data1”显示为“object Object”,类型为“object”(当我对data1进行字符串化时,它按预期出现了,虽然我不知道这是否意味着什么)。

请注意,data1 是一个字典数组,其值是数组的数组。所以,稍微复杂点,不知道js能不能解析结构。

这就是我的函数没有被调用的原因吗?如果不是,那是什么?如果是这样,我该如何修复它(鉴于这是我必须传递数据的格式)。如何找到问题所在?

编辑:我还想指出,我只是测试了一些简单的东西,比如 [5] 来代替 data1,因为我担心这会弄乱函数调用,但我仍然没有收到来自 show_graph 的警报,所以我认为毕竟不是这样。

【问题讨论】:

  • 你希望它在哪里被调用?
  • 我不明白你的问题。
  • 我没听懂,为什么在成功的ajax调用中递归调用show_graph?并调用它两次?
  • “递归”是指“两次”吗?我调用它两次是因为我希望它在两个不同的 div 中生成一个图表。
  • 不,递归。您已经在一个名为show_graph 的函数中。你有一个名为show_graph不同的函数吗?

标签: javascript jquery html django-templates django-views


【解决方案1】:

也许您的 Ajax 失败了(由于许多可能的原因之一),所以它没有调用成功回调?尝试添加一个error: 回调,看看它是否被调用。

至于[object Object] 位,这是警报对象的副作用。 alert() 将其参数转换为字符串,默认的 Object toString 方法返回 "[object Object]"。使用 console.log(或直接在调试器中检查值)来避免这个问题。

【讨论】:

  • 不,我得到一个 200 并且成功函数中的警报即将出现。
  • 我很困惑为什么你要从回调中调用父函数,以及为什么你要传入未使用的额外参数。在任何情况下,请尝试在您的成功函数中将 show_graph 更改为 alert 以查看这些行是否失败。
【解决方案2】:

您已经在一个名为 show_graph 的函数中。它不是调用您想要的函数,而是调用自身,并将另一个单击操作添加到...一个不匹配任何内容的 jquery 选择器。所以重命名你的内部函数,一切都应该工作。

【讨论】:

    【解决方案3】:

    您是否有多个名为show_graph() 的函数?函数的意图是从 ajax 成功回调中调用自身吗?

    你发布的函数有一个参数i

    function show_graph(i){ ... }
    

    在函数中,您似乎将i 视为一个数字,例如,在您说qaa[i-1] 的位置。但随后在您的 ajax 调用中,您的成功回调调用 show_graph 如下所示:

    show_graph("chart1"+i, resp['chart_type'], resp['series_names'], JSON.stringify(resp['data1']), resp['answer'], resp['stories1'], resp['colors'], resp['stacked'], resp['title1']);
    

    我不知道你是否打算让它调用自己,但你不是传入单个数字参数,而是传入很多参数。 (当然,如果您使用 arguments 对象,JavaScript 允许您这样做,但在您的情况下,您将一个字符串作为第一个参数传递,但正如我在上面所说的,该函数将其视为一个数字。)

    【讨论】:

      【解决方案4】:

      我认为问题在于,show_graph 将点击事件附加到元素

      当click事件发生时,调用click的回调,执行ajax调用。

      在成功的 ajax 调用中,您再次调用 show_graph,期望它完全执行,但没有。它只是附加了另一个点击事件监听器(考虑找到一个元素)

      因此,您的 show_graph 不应绑定点击事件。

      【讨论】:

        【解决方案5】:

        一些想法......

        您的函数show_graph(i) 需要一个参数。在您在选择器中使用它的方式(如$("#"+i+"seegraph"))中,我们可以假设i 指的是字符串或数字。稍后,您将通过调用向show_graph 发送一个列表来代替i

        show_graph("chart1"+i, resp['chart_type'], resp['series_names'], JSON.stringify(resp['data1']), resp['answer'], resp['stories1'], resp['colors'], resp['stacked'], resp['title1']);

        听起来您可能在某处需要显示图表的另一个函数(可能是第二个show_graph,而此函数创建图表?

        【讨论】:

          猜你喜欢
          • 2018-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多