You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目中下拉菜单mousedown事件跨浏览器表现不一致的解决方法

解决Firefox中下拉选项点击触发第二次mousedown事件的问题

这个问题我之前也碰到过,Firefox在下拉菜单的事件处理逻辑上和Chrome确实有差异——当你点击下拉选项时,mousedown事件会向上冒泡到父容器#div_id_res_person_1,从而触发了第二次AJAX请求。下面给你几个简单可行的解决方案:

方案一:阻止下拉选项的事件冒泡

通过事件委托给动态加载的<option>元素绑定mousedown事件,并阻止它向上冒泡,这样父容器的mousedown就不会被触发了。在你的现有代码后面添加这段代码即可:

// 阻止option的mousedown事件冒泡到父容器
$("#div_id_res_person_1").on("mousedown", "option", function(e) {
    e.stopPropagation();
});

原理:当用户点击下拉选项时,这个事件会先被option的处理函数捕获,然后调用stopPropagation()阻止它继续向上传递到父div,从而避免触发你的AJAX逻辑。

方案二:在父容器的事件中过滤点击目标

修改你原来的mousedown处理函数,判断当前点击的目标是不是<option>元素,如果是就直接返回,不执行AJAX请求:

$("#div_id_res_person_1").mousedown(function (e) {
    // 如果点击的是下拉选项,直接终止执行
    if ($(e.target).is("option")) {
        return;
    }

    $("#id_res_person_1").empty();
    $("#id_res_person_1").append("<option>" + '---------' + "</option>")
    var value_1 = $("#id_report_division").val();
    var value_2 = $("#id_report_sector").val();
    var value_3 = $("#id_report_department").val();
    var url = $("#PostForm").attr("data-person-url");
    console.log("a")
    $.ajax({
        url: url,
        data: {
            'divizija': value_1,
            'sektor': value_2,
            'odjel': value_3
        },
        success: function (data) {
            $("#id_res_person_1").html(data);
        }
    });
});

原理:通过e.target获取当前点击的DOM元素,判断它是不是<option>,如果是就跳过后续的AJAX逻辑,只在用户点击下拉框本身(展开菜单时)才执行数据加载。

方案三:改用click事件绑定到下拉框本身

考虑把事件绑定从父div转移到下拉框#id_res_person_1上,并且改用click事件(click事件在Firefox中不会在选择选项时重复触发):

$("#id_res_person_1").click(function () {
    $("#id_res_person_1").empty();
    $("#id_res_person_1").append("<option>" + '---------' + "</option>")
    var value_1 = $("#id_report_division").val();
    var value_2 = $("#id_report_sector").val();
    var value_3 = $("#id_report_department").val();
    var url = $("#PostForm").attr("data-person-url");
    console.log("a")
    $.ajax({
        url: url,
        data: {
            'divizija': value_1,
            'sektor': value_2,
            'odjel': value_3
        },
        success: function (data) {
            $("#id_res_person_1").html(data);
        }
    });
});

注意:如果担心重复触发,可以加一个判断,比如只有当下拉框的选项为空(或者只有默认的分隔符选项)时才执行AJAX,避免重复请求。

我个人推荐方案一,它改动最小,而且逻辑清晰,不会影响你原来的代码结构。

内容的提问来源于stack exchange,提问作者MarkoZg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:39:05