1

这是我的第一篇文章,在这里我想创建一个 chrome 扩展,当它被按下时,它会显示可以按下的链接,使用 AJAX 检索的链接。到目前为止它一直有效,唯一的问题是当它被点击任何链接时,有时它会出现两次甚至三次。谁能给出这个问题的解释和答案?

谢谢!

var links = [];
links.push("http://www.tenmanga.com/book/rss/id-16896.xml");
links.push("http://mangafox.me/rss/fairy_tail.xml");
links.push("http://feeds.feedburner.com/9gag?format=xml");

函数开始()

function start(){
    for (var i in links)
        getXML(links[i]);
    $(document).ready(function(){
    });


}

函数 getXML

function getXML(url){
    var test = $.ajax({
        type: "GET",
        url: url,
        dataType: "xml",
        success: function(xml){
            parse(xml);
bind();
        }
    });
    return test;
}

function bind(){
    $("a").click(function(e){
        chrome.tabs.create({url:$(this).attr("href")});
    });
}
function parse(xml){
    //$("#content").append();
    var title = $(xml).find('title').first().text();
    var createClickHandler = function(arg){
        return function(){ 
            open_item(arg); 
        };
    }
    $("#content").append(title+"<br>");
    $(xml).find('item').each(function(){
        var temp = document.createElement("a");
        var title = this.childNodes[1].textContent;
        var link = this.childNodes[3].textContent;
        temp.innerHTML = title;
        temp.setAttribute("href",link);
        $("#content").append(temp);
        $("#content").append("<br>");
    });
    $("#content").append("<br>");
}

从这里开始!

var start = start();
4

3 回答 3

1

单击元素时多次调用单击事件的唯一原因是,在该元素上注册了多个事件处理程序。每次您调用 bind 时,您所做的就是将事件绑定到“a”,所以我猜对于第一个链接,它的事件在几秒钟内触发一次两次,第三次触发三次。可能不是只使用 $('a' ) 将属性赋予页面中的所有“a”元素,您可以使用单独的 id 动态创建“a”。这必须结束奇怪的行为。

于 2012-12-02T13:36:42.317 回答
0

调用单击回调e.preventDefault();e的位置event,以便该事件不会冒泡,也不会触发其他任何事情。

在 ajax 返回后,每次成功时也不应调用 bind()。

于 2012-12-02T13:04:46.400 回答
0

不要在每个链接上绑定,而是执行以下操作一次:

$(document).on('click','a'
    function(e){
        chrome.tabs.create({url:$(this).attr("href")});
        return false;
    }
);

如果您在链接上没有其他锚点

于 2012-12-02T13:12:03.683 回答