1

これは私の最初の投稿です。ここでは、Chrome 拡張機能を作成したいと考えていました。これを押すと、押すことができるリンク、AJAX を使用して取得されたリンクが表示されます。これまでのところ機能していましたが、唯一の問題は、リンクをクリックしたときで、2 回または 3 回表示されることもありました。誰かがこの問題に説明と答えを与えることができますか?

ありがとうございました!

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' にバインドしているので、最初のリンクではイベントが 1 秒で 2 回、3 回目で 3 回発生すると思います。単に $('a' を使用する代わりに) ページ内のすべての 'a' 要素に属性を割り当てると、個別の ID で動的に 'a' を作成できます。それは奇妙な振る舞いを終わらせなければなりません。

于 2012-12-02T13:36:42.317 に答える
0

instead of binding on each link, do the following once:

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

if you have no other anchors on link

于 2012-12-02T13:12:03.683 に答える
0

イベントがバブルアップせず、他の何かをトリガーしないように、クリック コールバックe.preventDefault();eisを呼び出します。event

また、ajax が返された後、成功するたびに bind() を呼び出すべきではありません。

于 2012-12-02T13:04:46.400 に答える