2011-06-17 2 views
1

Google Chrome用のページアクション拡張を作成しています。この拡張機能は、ロード後に次のスクリプトを検索ページに挿入します。スクリプトは、クラス "f_foto"(通常は10個のアイテム)のすべての出現を見つけた後、それぞれの最初のリンクを見つけ、これらのhrefを配列に入れてから、配列を繰り返して各リンクの新しいウィンドウを開き、結果。それがやるべきことです。新しいウィンドウが読み込まれたときにスクリプトを再開する方法

最後の部分を除いて、このコードですべて正常に機能します。新しいウィンドウが新しいタブで開きます(私にはタブ権限があります)が、スクリプトの終了後にのみロードが完了します。新しいウィンドウはそれぞれ同じタブの前のウィンドウに上書きされます。内容を最初に調べることができればOKです。したがって、スクリプトが終了したときにデバッガを使用せずに実行すると、新しいタブには配列の最後の項目が含まれ、フォーカスは新しいタブに表示されます。私が見る限り、handleResponseは決して呼び出されません。

DOMインスペクタで実行してwindow.openで停止すると、タイトルに「空白について」と表示され、読み込み中であることを示す回転するものが表示されます。 detailWin=window.open(profileLinks[i], "Detail Window");が実行された後でも、コードをステップしてdetailWinは未定義のままです。私はwindow.onload = handleResponse;detailWin.onload =handleResponse;に置き換えようとしましたが、この場合detailWinは定義されていません。

新しいウィンドウが読み込まれたときに発生するイベントリスナーを追加して、handleResponseを実行する必要があります。はい?いいえ?

//PEEK.JS// 
var req; 
var detailWin; 
var profileLinks = new Array(); 
function handleResponse() 
{ 
// var contentDetail = document.getElementsByClassName("content"); 
    alert("Examine Detail Page Here"); 
}; 

//drag off the f_foto class 
var searchResult = document.getElementsByClassName("f_foto"); 
alert("Found Class f_foto "+searchResult.length+" times."); 

//collect profile links 
for (var i = 0; i<searchResult.length; ++i) 
{ 
    var profileLink=searchResult[i].getElementsByTagName("a"); 
    profileLinks[i]=profileLink[0].href; 
// alert(i+1+" of "+searchResult.length+" "+profileLinks[i]+" length of "+profileLinks[i].length); 
} 
for (var i = 0; i<searchResult.length; ++i) 
{ 

//DYSFUNCTIONAL CODE: New window finishes loading only after script completes, how to execute handleResponse? 

    detailWin=window.open(profileLinks[i], "Detail Window"); 
    window.onload = handleResponse; 
} 

答えて

1

オプション#1:two separated content scripts作る - 検索ページに1つだけ、唯一のプロフィールページに1つ。検索スクリプトは、唯一のオープンプロフィールリンク、プロファイルスクリプトは、それを処理します(あなたのhandleResponse()内のコードが含まれています)

オプション#2あなただけに、すべてのプロファイルページにプロファイルスクリプトを挿入したくないいくつかの理由のためにした場合あなたが検索ページから自分自身を開いた場合、コンテンツスクリプトからウィンドウを開くのではなく、新しいタブでプロファイルリンクを開いてプロフィールスクリプトを挿入するように求める背景ページにメッセージを送信する必要があります。

まだ2つのコンテンツスクリプトがあります。 (ページだけを検索するために注入された)

search.js

//PEEK.JS// 
var req; 
var detailWin; 

//drag off the f_foto class 
var searchResult = document.getElementsByClassName("f_foto"); 
alert("Found Class f_foto "+searchResult.length+" times."); 

//collect profile links 
for (var i = 0; i<searchResult.length; ++i) 
{ 
    var profileLink=searchResult[i].getElementsByTagName("a"); 
    profileLinks[i]=profileLink[0].href; 
// alert(i+1+" of "+searchResult.length+" "+profileLinks[i]+" length of "+profileLinks[i].length); 
} 
for (var i = 0; i<searchResult.length; ++i) 
{ 
    //tell bkgd page to open link 
    chrome.extension.sendRequest({cmd: "openProfile", url: profileLinks[i]}); 
} 

profile.js(開いたページをプロファイルするために注入されます)

var contentDetail = document.getElementsByClassName("content"); 
alert("Examine Detail Page Here"); 

background.html :

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if(request.cmd == "openProfile") { 
     chrome.tabs.create({url: request.url}, function(tab){ 
      //profile tab is created, inject profile script 
      chrome.tabs.executeScript(tab.id, {file: "profile.js"}); 
     }); 
    } 
}); 

オプション#3:プロファイルウィンドウを作成する必要はありませんか?必要なのは、ページソースで何かを見つけることだけであれば、ただload that page through ajaxであり、それを解析することができます(バックグラウンドページで行う必要があります)。

+0

IFRAMEにロードする別のオプションはありませんか? –

+0

非常にエレガント、ありがとうございます。配列をバックグラウンドページに渡してprofileLinksへの参照として渡すことはできますか?それとも、profileLinks [i]を繰り返してjson構造を構築する必要がありますか? – Jerome

+0

@Jeromeあなたは配列を渡すことができます – serg

関連する問題