【问题标题】:get all links in chrome extension获取 chrome 扩展中的所有链接
【发布时间】:2018-07-01 23:13:50
【问题描述】:

我正在尝试制作一个从用户所在的网页收集社交网络链接的扩展程序。因此,当用户单击按钮getLinks 时,我们会获取所有链接,然后通过检查条件将它们传递到扩展程序的块中。我尝试使用chrome.tabs.executeScript,并通过urls = $$('a'); 获取链接,但它不起作用

 $('#getLinks').click(function(e)
{
    var allLinks = [];
    var i = 0;
    chrome.tabs.executeScript( null, {"code": "urls = $$('a'); for (url in urls)
    { allLinks[i]=urls[url].href; i++;}"}, function() {
        var vk;
        var facebook;
        var linkedin;
        for (var i=0; i<allLinks.length; i++) 
        {
            var profil = (allLinks[i].href);
            if(profil.indexOf('vk.com')!=-1)
            {
                vk = profil;
                $('#vk').text(vk);
            }
            if(profilito.indexOf('facebook.com')!=-1)
            {
                facebook = profil;
                $('#fb').text(facebook);
            }
            if(profilito.indexOf('linkedin.com')!=-1)
            {
                linkedin = profil;
                $('#linkin').text(linkedin);
            }
        }
    });
});

【问题讨论】:

  • 当你说它不起作用时,你看到了什么行为?
  • 在 urls 我得到 null 而不是我在控制台中得到的内容,如果我只是输入 urls = $$('a');

标签: javascript google-chrome-extension


【解决方案1】:

executeScript 不是这样使用的。该代码无法访问变量allLinksi,因为它在其他地方执行。但是您可以像在其他 SO question 中一样使用该代码的返回值:

$('#getLinks').click(function(e) {
    chrome.tabs.executeScript( null, {"code": "var urls = document.querySelectorAll('a'); for(var i = 0; i < urls.length; i++) { urls[i] = urls[i].href; }; urls"}, function(results) {
        var allLinks = results[0];

        // use allLinks here
    });
});

【讨论】:

  • 我在结果和 allLinks 变量中得到空值
  • 我试图声明 var x = 10; x 在 executeScript 中,它工作并将 10 的值传输到结果。但是在这里它带有 url 它只给我 null
  • @NikitaLvov 也许是$$ 造成的。 AFAIK 它仅在开发工具中可用。尝试像querySelectorAll 这样的替代方案。检查我的编辑!
  • 我用querySelectorAll 试过你的,我试着用document.links 但它现在给我的只是空对象
  • @NikitaLvov 尝试在文档结束后使用runAt 属性注入代码。
【解决方案2】:

所以最后我得到了我自己问题的答案并在这里发布解决方案

$('#getUser').click(function(e) {
chrome.tabs.executeScript(null,{code: 'Array.from(document.getElementsByTagName("a")).map(a => a.innerHTML)'},function (results){
    var vk = [];
    var facebook = [];
    var linkedin = [];
    var allElements = results[0];
    for (var i=0; i<allElements.length; i++) 
    {
    if (allElements[i].indexOf("https://vk.com") !== -1) 
    {
        vk.push (allElements[i]);
    }
    if (allElements[i].indexOf("https://facebook.com") !== -1 ) 
    {
        facebook.push (allElements[i]);
    }
    if (allElements[i].indexOf("https://www.linkedin.com") !== -1 ) 
    {
        linkedin.push (allElements[i]);
    }
    }
});

我们在页面上找到的所有链接按属于社交网络的 3 个数组排序

【讨论】:

  • 终于!好工作!顺便说一句,它不应该是map(a =&gt; a.href)吗?
  • 是的,我只是从旧代码中打印错误并插入了一段:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多