【问题标题】:calling function from jQuery with Django not working correctly使用 Django 从 jQuery 调用函数无法正常工作
【发布时间】:2011-04-27 21:33:23
【问题描述】:

我正在尝试创建一个根据用户条件搜索用户的页面。然后它通过 AJAX 响应将结果加载到不同的 DIV:

function search_friends() {
    $("#search-results").show();
    $("#loading1").show();
    var q = $("#id_q").val();
    var type = $("#id_search_type").val();
    $("#loading1").hide();
    $("#results").load("/search/friends/?ajax&q="+encodeURIComponent(q)+"&search_ty­pe="+encodeURIComponent(type));
    return false;
}

在这个新的结果 DIV 中,我为每个用户提供了可以将他们添加为朋友的链接。这个结果 DIV 中的每个链接都有一个每个用户 userID 的 ID 和一个 user_link 类。当登录的用户单击链接时,我希望它弹出一个确认框,然后通过 AJAX 发送请求。但是,我无法像我想要的那样通过 AJAX 提交链接。我的代码如下:

{% for u in users %}
<div id="results">
    <img src="{{ u.profile_pic }}" class="xsmall-pic" /> <a href="/{{ u.username }}/">{{ u.username }}</a><br />
    <span class="small-date">{{ u.get_full_name }}</span>
    <span class="floatR" id="user_{{ u.id }}_link"><a href="#" id="{{ u.id }}" class="user_link">Add as friend</a></span>
</div>{% endfor %}

<script type="text/javascript" language="javscript">
    $(document).ready(function() {
        var csrf_token = "{{ csrf_token }}";
        $(".user_link").bind('click',function() {
            request_friend($(this).id,csrf_token)
        });
        $("#search-friends-form").submit(search_friends);

    });
</script>

在一个外部 JavaScript 文件中,我有以下内容:

function confirm_request()

    return confirm("Are you sure you want to request this user as a friend?");
}

function request_friend(id,token)
    if (confirm_request())
    {
        var data1 = {to_friend: id,csrfmiddlewaretoken: token};
        $.post('/users/requests/friends/'+id+'/?ajax', 
                data1, function(json) {
                    $("#user_"+id+"_link").html(json.status);
                }, "json");
                return false;
    }
    else
    {
        return;
    }
}

感谢您的帮助,因为我对 Javascript 的了解并不那么好。

EDIT 通过 AJAX 调用的 Python 函数

def search_for_friends(request):
users = False
friends = False
return_page = 'users/friend_search.html'
ajax = 'ajax' in request.GET
try:
    if 'q' in request.GET:
        form = FriendSearchForm(request.GET)
        if form.is_valid():
            if form.cleaned_data['search_type'] == 'username':
                users = CustomUser.objects.exclude(pk=request.user.id).filter(username__icontains=form.cleaned_data['q'])
            elif form.cleaned_data['search_type'] == 'name':
                users = CustomUser.objects.filter(Q(first_name__icontains=form.cleaned_data['q']) | Q(last_name__icontains=form.cleaned_data['q']))
            elif form.cleaned_data['search_type'] == "email":
                users = CustomUser.objects.filter(email__icontains=form.cleaned_data['q'])
            else:
                pass
        else:
            pass
    else:
        form = FriendSearchForm()
    if users != False:
        users = users
        error = False
    if users == "":
        users = ""
        error = "No users match the search term provided"
    if ajax:
        show_results = True
        context = RequestContext(request,{'users':users,'form':form,'show_results':show_results})
        return render_to_response('users/friend_search_results.html',context_instance=context)
    context = RequestContext(request,{'users':users,'form':form,'error':error})
    return render_to_response(return_page,context_instance=context)
except:
    form = FriendSearchForm()
    context = RequestContext(request,{'form':form})
    return render_to_response(return_page,context_instance=context)

【问题讨论】:

  • 你应该修正你的格式,然后描述什么不起作用。
  • 如果你指的是它在帖子中的格式,我已经尽力了。它比一开始要好得多。就什么不起作用,当单击结果 DIV 中的每个链接时,它根本没有做任何事情。它应该像在 $(".user_link").bind() 函数中那样调用 request_friends 函数
  • 它是否向服务器发出请求?请求是否成功?输出根本不是您所期望的吗?我们需要它如何不工作的详细信息。
  • 不,它根本没有做任何事情。我在 Firefox 中使用 firbug,当我单击 AJAX 加载部分中的任何链接时,它没有显示任何发生的事情。
  • 加载时是否抛出错误?您的两个函数似乎都没有打开波浪形括号,这应该会引发错误。当您单击 .user_link 时,您是否被带到“#”锚点?

标签: javascript ajax django jquery


【解决方案1】:

如果您不想在 AJAX 响应中包含 JavaScript,您可以让 .load() 的完成事件负责设置点击事件:

var url = "/search/friends/?ajax&q="+encodeURIComponent(q)+"&search_ty­pe="+encodeURIComponent(type);
$("#results").load(url, function() {
    var csrf_token = "{{ csrf_token }}";
    $(".user_link").bind('click',function() {
        request_friend($(this).id,csrf_token)
    });
});

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,您是否希望确保点击处理程序适用于通过稍后的 AJAX 调用加载的链接?

    在 jQuery 中,使用一次$('.user_link').live('click', function() {}) 处理程序将点击事件处理程序分配给所有当前和未来的链接。

    【讨论】:

      【解决方案3】:

      除非您明确告诉 jQuery 对其进行评估,否则从您的 AJAX 调用返回的 Javascript 不会被评估。这是通过在 AJAX 调用中指定 dataType 来完成的,即 .load() doesn't support

      this answer 所示,您应该使用jQuery.get()$.ajax 并指定您的数据类型:

      $.ajax({
        type: "GET",
        url: "yourPage.htm",
        dataType: "html"
      });
      

      【讨论】:

      • $.load 函数正在工作。它是带有 $.post 方法的 javascript 函数,它什么都不做。它甚至没有调用函数 request_friend
      • 将此添加到您的 javascript 正下方 $(document).ready(function() {: alert("I am being evaluated!");。您不会看到弹出窗口。这意味着 Javascript 在通过 AJAX 加载后不会被评估。
      • 好吧,我知道当通过 AJAX 加载一部分时,$(document).ready 部分实际上并没有做任何事情。我想弄清楚的是如何允许这些链接通过 jQuery 调用一个函数,而不必为每个链接放置一个 onclick 甚至处理程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多