4

검색 창 근처의 확장 프로그램 버튼을 클릭하여 새 창을 여는 중입니다. 아직 열지 않은 경우에만 새 창을 열려고합니다. 그럴 경우, 나는 오래된 것을 보여주고 싶다.Google 크롬 확장 : 한 번만 창 만들기

여기 내 코드이지만 작동하지 않습니다.

var v = null; 
    var vid = null; 
    chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.windows.getAll({}, function(list) { 
     // check if already exists 
     for(window in window_list) 
     if(window.id == vid) { window.focus(); return; } 

     chrome.windows.getCurrent(function(w) { 
     v = chrome.windows.create({'url': 'my_url', 'type': 'panel', 'focused': true}); 
     vid = w.id; 
     }); 
    }); 
    }); 

누군가가 해결 방법을 설명해 주시겠습니까?

vvid 값은 응용 프로그램을 닫은 후에 (스크립트 실행이 끝난 후) 삭제되지만 어떻게 해결할 수 있습니까? 가능한 경우 localStorage 또는 쿠키를 사용하지 않습니다.

창을 만들 때 tabId 속성을 지정하려고 시도했지만 작동하지 않습니다. chrome.windows.onRemoved.addListener 기능을 사용해 보았지만 작동하지 않습니다.

답변

5
  1. 다른 변수 이름을 변경 window.
  2. 변수 이름이 일치해야합니다. window_listlist은 다른 것입니다.
  3. window.focus() 대신 chrome.windows.update을 사용하십시오. 후자가 작동하지 않기 때문입니다.
  4. chrome.windows.get을 사용하면 창 목록을 유지하는 대신 창 존재 여부를 확인할 수 있습니다.
  5. 새 창에 대한 자세한 내용은 콜백 chrome.windows.create에서 확인할 수 있습니다. 올바른 방법으로이 방법을 사용 :

코드 :

chrome.windows.get(vid, function(chromeWindow) { 
    if (!chrome.runtime.lastError && chromeWindow) { 
     chrome.windows.update(vid, {focused: true}); 
     return; 
    } 
    chrome.windows.create(
     {'url': 'my_url', 'type': 'panel', 'focused': true}, 
     function(chromeWindow) { 
      vid = chromeWindow.id; 
     } 
    ); 
}); 

또는 대신 윈도우가 존재하는지 여부를 확인하는, 바로 창을 업데이트하고, 오류가 발생하면, 새로운 열 :

chrome.windows.update(vid, {focused: true}, function() { 
    if (chrome.runtime.lastError) { 
     chrome.windows.create(
      {'url': 'my_url', 'type': 'panel', 'focused': true}, 
      function(chromeWindow) { 
       vid = chromeWindow.id; 
      }); 
    } 
}); 
+0

T 작동 대체 코드입니다 행크스. 나는 시도했지만 작동하지 않습니다 ... – auino

+0

@auino 전체 코드가 손상되었고, 내 대답을 업데이트하고 "// 나머지 코드"를 확장했습니다 –

+0

안녕하세요. 거기에 하나의 버그가 있습니다. for (for) 대신 for for simple 루프를 사용하십시오. 때로 인덱스 번호를 id로 취합니다. for (j = 0; j

-1
chrome.windows.getAll({}, function(window_list) { 
    var extWindow = ''; 
    window_list.forEach(function(chromeWindow) { 
     //Check windows by type 
     if (chromeWindow.type == 'panel') { 
      extWindow = chromeWindow.id; 
      //Update opened window 
      chrome.windows.update(extWindow, {focused: true}); 
      return; 
     } 
    }); 

    if (extWindow == '') { 
     //Open window 
     chrome.windows.create(
      { 
       'url'  : 'my_url', 
       'type'  : 'panel', 
       'focused' : true 
      }, 
      function(chromeWindow) { 
       extWindow = chromeWindow.id; 
      } 
     ); 
    } 
}); 

그것은 나를

+0

이 수정 프로그램에 대한 더 자세한 설명을 제공 할 수 있습니까? – Necreaux

+0

코드에서 "잘못된"코드와 다른 점을 설명하는 것이 가장 좋습니다. 아마도 몇 가지 의견만으로는 충분하지 않습니다. 특히 이미 비슷한 대답이 이미 있기 때문에 - 당신의 방식은 어떻게 다른데, 왜/언제 더 좋은가? 그러나, 나는 downvote에 동의하지 않는다 - 그것은 쓸모가 없다. – Xan

+0

사실, 다시 생각해 볼 수 있습니다. 특정 실험 플래그가 설정되어 있지 않으면이 방법으로 열리는 창은 유형 ""패널 ""을 유지한다고 생각하지 않습니다. – Xan

관련 문제