javascript - e.preventDefault 仍然会在浏览器的新选项卡中加载 anchor 链接

标签 javascript jquery json ajax

我基本上有一个ajax调用,它调用一个REST API,它为我提供所有名称的列表,并且我有另一个与之匹配的REST API。例如,

/list gives me: list1,list2,list3

/api/list1.json gives me: json of list1..

但是我有我的代码,可以循环遍历所有列表并调用/api/list1.json

我希望 JSON 在 a 时显示在 div 中onclick 事件通过抓取 href 发生相应地无需重新加载页面。但现在,因为这也是一个有效的链接,浏览器只会带我去那里。

这是我的代码:

$(function() {
   $.ajax({
     dataType: 'json'
     url: '/lists',
       success: function (data) {


if (data != null) {
                     var html = '<ul>';
                      $.each(data.apis, function (i, item) {
                           //click event
                           $('a').click(function(e) {
             e.preventDefault();
          });


                            html += '<li class="res">';
                            html += '<div class="hed"><h2><a href="/api/' + item + '.json">' + item + '</a></h2></div>';
                            html += '</li>';
                        });

                        html += '</ul>';

                        $('#exDiv').empty();
                        $('#exDiv').append(html);
                    }
                },
                error: function () {
                    alert('Error');
                },
                contentType: 'application/json'
            });
         $('a').click(function(e) {
             e.preventDefault();
          });


        });

显然我还添加了e.preventDefault()但它仍然会触发指向新选项卡的链接。

Link to e.preventDefault()

最佳答案

这些是动态添加的 anchor 标记。当您将单击事件处理程序添加到 anchor 标记时,它们不存在。因此,当您单击这些 anchor 时,它们将绕过您的 jquery 事件处理程序并执行默认情况下通常执行的操作。( further explanation )您在 $.each 函数中再次拥有相同的代码,如果您调用了它,该代码可能会起作用在你的 $('#exDiv').append(html); 之后线。但当你调用它时,它们仍然不存在。

根据您使用的 jQuery 版本,您应该使用“on”或“live”。如果您使用的是 1.7 或更高版本,请使用“on”。

试试这个:

$(function() {
    $.ajax({
        dataType: 'json'
        url: '/lists',
        success: function (data) {
            if (data != null) {
                var html = '<ul>';
                $.each(data.apis, function (i, item) {
                    html += '<li class="res">';
                    html += '<div class="hed"><h2><a href="/api/' + item + '.json">' + item + '</a></h2></div>';
                    html += '</li>';
                });
                html += '</ul>';
                $('#exDiv').empty();
                $('#exDiv').append(html);
            }
        },
        error: function () {
            alert('Error');
        },
        contentType: 'application/json'
    });

    $(document).on('click', 'a', function(e) {
        e.preventDefault();
    });
});

如果您使用的是 1.6 或更早版本,您的点击事件处理程序应如下所示:

$('a').live('click', function(e) {
    e.preventDefault();
});  

关于javascript - e.preventDefault 仍然会在浏览器的新选项卡中加载 anchor 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34343427/

相关文章:

java - 如何转换 moxy json 输出?

javascript替换多个字符

javascript - 在 `.attr()` 范围之外使用 jQuery `.each()` - 可能吗?

Javascript 应用程序 - 泄漏内存

javascript - 如何禁用来自移动站点的所有媒体查询

javascript - 如何处理 json

c# - 使用 JSON.NET 反序列化字典

Javascript:根据另一个数组对大型多维数组重新排序

javascript - 每当输入字段焦点消失时,如何立即替换输入字段中的前导零?

javascript - jquery中的触发事件和绑定(bind)