0

一連のリンクを一覧表示し、現在のタブで選択したリンクを開きたいクロム拡張ブラウザー アクションがあります。これまでのところ、jqueryを使用してこれを持っています:

var url = urlForThisLink;
var li = $('<li/>');
var ahref = $('<a href="#">' + title + '</a>');
ahref.click(function(){
    chrome.tabs.getSelected(null, function (tab) {
        chrome.tabs.update(tab.id, {url: url});
    });
});
li.append(ahref);

それは部分的に機能します。現在のタブをナビゲートしますが、この方法で最後に作成されたリンクにのみナビゲートします。反復された一連のリンクに対してこれを行うにはどうすればよいですか?

4

2 に答える 2

2

@ jmort253の答えは、実際にはおそらくあなたのエラーの良い例です。forループ内で宣言されていますが、 で宣言されurlているため、関数スコープがありvarます。したがって、クリック ハンドラー クロージャーはループ外のスコープの変数にバインドされておりfor、クロージャーのすべてのインスタンスは同じ値を使用します。最後のもの。

Chrome がletキーワードをサポートすると、代わりにそれを使用できるようになり、ループの本体にスコープされるため、var正常に機能します。それまでの間、関数でクロージャを作成して新しいスコープを作成する必要があります。urlfor

function makeClickHandler(url) {
    return function() { ... };
}

forループ内で次のように言います。

for (var i = 0; i < urls.length; i++) {
    var url = urls[i]; 
    ...    
    ahref.click(makeClickHandler(url));
    ...
}
于 2012-10-14T08:37:05.287 に答える
0

あなたのコード例では、リンクが 1 つしかないように見えます。代わりに、実際のリンクのコレクションがあると仮定しましょう。その場合、for ループを使用してそれらを反復処理できます。

// collection of urls
var urls = ["http://example.com", "http://domain.org"];

// loop through the collection, for each url, build a separate link.
for(var i = 0; i < urls.length; i++) {

    // this is the link for iteration i
    var url = urls[i]; 

    var li = $('<li/>');
    var ahref = $('<a href="#">' + title + '</a>');
    ahref.click( (function(pUrl) {
        return function() {
            chrome.tabs.getSelected(null, function (tab) {
                chrome.tabs.update(tab.id, {url: pUrl});
            });
        }
    })(url));
    li.append(ahref);
}

元の回答を書いているときにスコープを完全に忘れていたので、Matthew Gertner の回答に基づいてクロージャーを使用するように更新しました。基本的に、クリック イベント ハンドラーで、url 変数を、別の関数を返す匿名の 1 引数関数に渡します。返された関数は無名関数に渡された引数を使用するため、その状態は、for ループの次の反復で url の値が変更されるという事実の影響を受けません。

于 2012-10-14T01:50:06.380 に答える