2015-12-22 2 views
-1

похоже на этот вопрос How to retrieve the element where a contextmenu has been executed , но я не могу получить ничего от этого, пожалуйста, помогите мне.Как получить элемент, в котором было выполнено контекстное меню, если у меня есть только фоновый скрипт?

var clickedEl; 
document.addEventListener("mousedown", function(event){ 
     //right click 
     if(event.button == 2) { 
      clickedEl = event.target; 
     } 
     }, true); 
var imageSourceUrl; 
function getClickHandler() { 
    "use strict"; 

    return function (info, tab) { 

if(tab.url.indexOf('https://vk.com') > -1){ 
     if(clickedEl.parentNode.href.indexOf('photo') > -1){ 
     var photoalbumid = clickedEl.parentNode.href.substring(clickedEl.parentNode.href.lastIndexOf("o")+1); 

      var getphoto = new XMLHttpRequest(); 

      getphoto.open('GET', 'https://api.vk.com/method/photos.getById?photos=' + photoalbumid); 

      getphoto.onload = function() { 

      var answer = JSON.parse(getphoto.response); 

      if (answer.response[0].src_big === undefined) { 
       thereIsAnError('hueta s polucheniem url img', answer, imageUrl); 
       return; 
      } 
      imageSourceUrl = decodeURIComponent(answer.response[0].src_big);           

      }          

      getphoto.send(); 
    } 
} 
if(imageSourceUrl === undefined) imageSourceUrl = info.srcUrl; 

      var imageUploadHelperUrl = 'upload.html#', 
      vkCLientId   = '128593', 
      vkRequestedScopes = 'docs,offline,groups,stats,photos', 
      vkAuthenticationUrl = 'https://oauth.vk.com/authorize?client_id=' + vkCLientId + '&scope=' + vkRequestedScopes + '&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&response_type=token'; 

     chrome.storage.local.get({'vkaccess_token': {}}, function (items) { 

      if (items.vkaccess_token.length === undefined) { 
       chrome.tabs.create({url: vkAuthenticationUrl, active:false}, function (tab) { 
        chrome.tabs.onUpdated.addListener(listenerHandler(tab.id, imageSourceUrl)); 
       }); 

       return; 
      } 

      imageUploadHelperUrl += imageSourceUrl + '&' + items.vkaccess_token; 

      chrome.tabs.create({url: imageUploadHelperUrl, active:false}); 
     }); 
    }; 
} 

* Handler of chrome context menu creation process -creates a new item in the context menu 
*/ 
chrome.contextMenus.create({ 
    "title": "Rehost on vk.com", 
    "type": "normal", 
    "contexts": ["image"], 
    "onclick": getClickHandler() 
}); 

хром говорит: "Ошибка в обработчике события contextMenus: TypeError: Не удается прочитать свойство 'ParentNode' неопределенной на" если ") линии (clickedEl.parentNode.href.indexOf ('фото' .... как получить доступ к измененному clickedEl внутри getClickHandler() право

 //background 
var imageSourceUrl; 
function getClickHandler() { 
    "use strict"; 

    return function (info, tab) { 
     if(tab.url.indexOf('https://vk.com') > -1){ 
      chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
       chrome.tabs.sendMessage(tabs[0].id, {imghref : "gimmemore"}, function(response) { 
        imageSourceUrl = response.imaged; 
        console.log(response.imaged); 
       }); 
      }); 
     } 
     else{imageSourceUrl=info.srcUrl;} 
     var imageUploadHelperUrl = 'upload.html#', 
      vkCLientId   = '5118087', 
      vkRequestedScopes = 'docs,offline,groups,stats,photos', 
      vkAuthenticationUrl = 'https://oauth.vk.com/authorize?client_id=' + vkCLientId + '&scope=' + vkRequestedScopes + '&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&response_type=token'; 

     chrome.storage.local.get({'vkaccess_token': {}}, function (items) { 

      if (items.vkaccess_token.length === undefined) { 
       chrome.tabs.create({url: vkAuthenticationUrl, active:false}, function (tab) { 
        chrome.tabs.onUpdated.addListener(listenerHandler(tab.id, imageSourceUrl)); 
       }); 

       return; 
      } 

      imageUploadHelperUrl += imageSourceUrl + '&' + items.vkaccess_token; 

      chrome.tabs.create({url: imageUploadHelperUrl, active:false}); 
     }); 
    }; 
} 


    //content script 
var clickedEl = null; 
var photoalbumid = null; 
document.addEventListener("mousedown", function(event){ 
     //right click 
     if(event.button == 2) { 
      clickedEl = event.target; 
      if(clickedEl.parentNode.href.indexOf('photo') > -1){ 
       photoalbumid = clickedEl.parentNode.href.substring(clickedEl.parentNode.href.lastIndexOf("o")+1); 
       if (photoalbumid.indexOf('?') > -1) { 
        photoalbumid = photoalbumid.slice(0, photoalbumid.indexOf('?')); 
       } 
      } 
      console.log(photoalbumid); 
     } 
     }, true); 
       var getphoto = new XMLHttpRequest(); 

       getphoto.open('GET', 'https://api.vk.com/method/photos.getById?photos=' + photoalbumid); 

       getphoto.onload = function() { 

       var answer = JSON.parse(getphoto.response); 

       if (answer.response[0].src_big === undefined) { 
       thereIsAnError('hueta s polucheniem url img', answer, imageUrl); 
       } 
       imageSourceUrl = decodeURIComponent(answer.response[0].src_big);           
       }          
       getphoto.send(); 

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    if(request.imghref == "gimmemore") { 
     sendResponse({imaged : imageSourceUrl }); 
    } 
}); 

изменения после того, как перечитали^

+0

Вы сорвали соответствующий код. Нет ничего, что могло бы объяснить, когда вызывается 'getClickHandler'. Не могли бы вы объяснить, где этот код находится в вашем расширении, и отредактировать его для логического завершения? «Внутренние» детали не имеют значения, но код должен быть полным. – Xan

+0

@ Xan добавил _getClickHandler_ шт. –

ответ

0

Вы пропустили часть в оригинальном ответе, где комментарии, поясняющие, как код расщепляется между частями расширения:

//content script 
/* ... */ 

//background 
/* ... */ 

Вам необходимо (заново) прочитать Architecture Overview, чтобы получить лучшее представление о том, как Chrome расширения структурированы.

Что происходит, так это то, что событие click никогда не происходит в вашем фоновом режиме - это происходит на реальной странице, и именно там вы можете поймать его с помощью скрипта контента.

Но сценарий содержимого не может служить слушателем событий контекстного меню. Для этого вам нужен фон. Итак, логика (обязательная):

  1. На странице, нажмите слушатель, готовит информацию.
  2. Контекстное меню щелчка происходит, прослушиватель событий в фоновом режиме.
  3. Фоновый скрипт запрашивает информацию из сценария содержимого.
  4. Скрипт контента получает запрос, отвечает информацией.
  5. Фоновый скрипт получает ответ, обрабатывает данные.

С учетом этого, пожалуйста, прочтите Overview (все это на этот раз), а затем the original question.

+0

может быть, знаете, какие еще элементы из вкладок массива [0] означает? можно каким-либо образом определить, что chrome.tabs.query должен выполняться только на vk.com? Уважаемый Xan, я понял, что скрипт содержимого в моем случае требуется ... но я все равно получаю сообщение об ошибке «Не удалось загрузить ресурс: net :: ERR_FILE_NOT_FOUND» chrome-extension: // idmmkbnmabiljdhhjniiihglbghhegpi/undefined ', пожалуйста, помогите мне, что мне нужно читать или перечитывать для понимания? –

+0

Прошу прощения, я только что ввел некоторые изменения. Но его все еще не wirking .... Когда я пытаюсь воспроизвести изображение из vk, эффекта нет. Но когда я возвращаю pic из какого-то другого домена, его работы и принимает info.srcUrl, а затем im пытается взять pic из vk.com, он перезапускает ранее сохраненный pic ... Я новичок в javascript, я не могу получить то, чего не хватает –

+0

дорогой, помогите мне, я все еще не могу понять, что не так с моим кодом –

Смежные вопросы