2

好的,我正在重新编辑我的帖子,因为我认为它可能会更清楚。

我有一个带有gridview 等的ASP.net 页面。

在 gridview 的结果行上是一个图像,单击该图像会打开一个模式弹出窗口(基本上是单击时显示的隐藏 div)。

该模式看起来是由一些带有 2 列表的 ajax/json 动态填充的,第 1 列只是文本行,第 2 列是空下拉列表和复选框的组合。(这些都在主页加载后添加到 DOM )。

我正在尝试在用户单击它们时通过 ajax/json 填充清单,并且我只希望仅在第一次单击时发生这种情况,并且无论用户在之后单击该下拉列表多少次(甚至在失去焦点并返回后)我不想看到更多相同的重复出现。

这是单击下拉列表时当前工作的代码,即填充下拉列表。问题是如果我失去焦点然后重新单击下拉菜单,它会重新填充重复列表:

<code> 
    $('#FSSiteName').live('focus', function () {
        var $this = $(this);
        getFSSites();
        //i thought the below line would stop it happening again when i click on the dropdown
    $this.unbind('focus');
});

 function getFSSites() {
            var ddSites = $("#FSSiteName");
            $.ajax({
                type: "POST",
                url: "Circuits_OrderManagementTracker.aspx/getTheSitesList",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    var xmlDoc = $.parseXML(response.d);
                    var xml = $(xmlDoc);
                    var FSSitesReturned = xml.find("Table");

                    $.each(FSSitesReturned, function (index, FSSitesReturned) {
                        dbname = $(this).find("SiteNames").text()
                        ddSites.append('<option>' + dbname + '</option>');
                    });
                },
                failure: function (msg) {
                    alert(msg);
                }
            });
        }
</code>

我已根据您的好自己的建议更改为下面的代码,但是当我执行下面的操作时,我的下拉列表不再被填充,我也尝试了 .one() 广告相同的效果。

<code>
         $('#FSSiteName').on('click', function () {
            var $this = $(this);
            //run your alert here if it´s necessary
            //alert('Focused for the first time :)');
            getFSSites();
            //unbind the event to prevent it from being triggered again
            $this.off('click');
         });
</code>

希望这对任何希望提供帮助的人来说更清楚一些。

4

4 回答 4

1

live()与is相反,die()两者都已弃用,您应该使用on()andoff来代替。

于 2013-03-19T19:41:02.750 回答
1

使用 on 和 off 很简单。

on() -> 添加事件处理程序 off() -> 删除事件处理程序

$("#item li").on('click', function () {
    $(this).text('ITEM CLICKED')
    alert('CLICKED');

    //remove the event
    $(this).off("click")
});

看这个例子:http: //jsfiddle.net/jMxxa/

开启和关闭的 Jquery 文档:

开: http ://api.jquery.com/on/ 关: http ://api.jquery.com/off/

于 2013-03-19T20:31:16.183 回答
0

同意 Varnie 的评论,使用 .one 而不是 .live()。

$('#FSSiteName').one('focus', function () {
        getFSSites();
 });

Live() 旨在与动态添加到 DOM 的元素一起使用;页面首次在浏览器中加载时不存在的元素。由于您的元素有一个 id 选择器,而不是一个类选择器,我假设您根本不需要使用 .live()/.on() 。

于 2013-03-19T19:45:00.850 回答
0

大家好,感谢您的帮助,这确实是我作为学习者所了解的最好的网站之一。

我自己提出了一个似乎可以解决问题的解决方案,但是对于编码如此陌生,如果我做了一些不理想的事情并且有更好更简单的解决方案,我将不胜感激。

我重新编辑了我的 OP 以更清楚地看到上面并且仍然存在,但是我更改了一些代码以仅检查下拉列表是否为空并且它可以正常工作,请参阅:

<code>
         $('#FSSiteName').live('click', function () {
             var $this = $(this);
             //Check if the dropdown has any options and if no add some
             if ($this.find('option').length <= 1) {
                 getFSSites();
             }
             else {
                //Do Nothing!!
             }            
         });

</code>
于 2013-03-20T10:26:21.347 回答