Веб-инспектор расширений Chrome - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу написать расширение для Chrome, в котором можно отмечать функции на веб-сайте и сохранять его в таблице, для этого я хочу использовать веб-инспектор Chrome.К сожалению, я новичок в этой области (плагины Chrome), и поэтому я ищу помощь (ссылки, учебные пособия, связанные работы и т. Д.), Чтобы использовать веб-инспектор в моем собственном расширении.

Простой пример на этом сайтеhttps://ieeexplore.ieee.org/document/1005630. Моя идея состоит в том, чтобы отметить, например, дату публикации, а плагин записать полный div в таблицу.

1 Ответ

0 голосов
/ 20 февраля 2019

На самом деле, я нашел простое решение.

Пример http://g.recordit.co/5CCFjXpe8J.gif

Это лишь небольшая часть моего инструмента, чтобы упростить его.Основная идея взята из Расширения Google Chrome: выделите div, над которым наведена мышь

  • 'iframe' - это вставленная боковая панель
  • marker.js содержитскрипт для пометки divs

manifest.json

{
    "name": "Feature extractor",
      "version": "1.0",
      "description": "Feature extractor from website",
      "permissions": ["activeTab", "declarativeContent", "storage", "contextMenus", "<all_urls>", "tabs"],
      "browser_action": {},
      "web_accessible_resources": ["iframe.html","iframe.js"],
      "background": {
        "scripts": ["background.js"],
        "persistent": false
      },
      "content_scripts": [
            {
                "matches": [
                    "http://*/*",
                    "https://*/*"
                ],
                "css": [
                    "marker.css"
                ],
                "js": [
                    "js/jquery-1.8.3.min.js",
                    "marker.js"
                ]
            }
        ],
      "manifest_version": 2
    }

background.js

    'use strict';

chrome.runtime.onInstalled.addListener(function() {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([{
      conditions: [new chrome.declarativeContent.PageStateMatcher({
        pageUrl: {hostEquals: 'developer.chrome.com'},
      })],
      actions: [new chrome.declarativeContent.ShowPageAction()]
    }]);
  });
});

// sidebar
chrome.browserAction.onClicked.addListener(function(){
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
        chrome.tabs.sendMessage(tabs[0].id,"toggle");
    })
});


// message passing
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
    console.log(request);
    callback({'request':request});
});


// context menu
var labels = ['author','date','abstract']
for(var label in labels) {
    console.log(labels[label])
    chrome.contextMenus.create({id: labels[label], "title": labels[label], "contexts":['all']});
}

chrome.contextMenus.onClicked.addListener(function(info, tab) {
    if (info.menuItemId == labels[0]) {
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
            chrome.tabs.sendMessage(tabs[0].id,labels[0]);
        })
    }
});

iframe.html

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="css/jquery.mobile-1.2.1.min.css" />
    <script src="js/jquery-1.8.3.min.js"></script>
    <script src="js/jquery.mobile-1.2.1.min.js"></script>
  <script src="iframe.js"></script>
  </head> 
  <body>
  <button id="send">
    send
  </button>
  <div id="responses">
  </div>
  </body>
</html>

Мне нужен скрипт jQuery.fn .. для идентификации выбранного div Получить уникальный селектор элемента в Jquery

iframe.js

// unique selector
jQuery.fn.extend({
    getPath: function () {
        var path, node = this;
        while (node.length) {
            var realNode = node[0], name = realNode.localName;
            if (!name) break;
            name = name.toLowerCase();

            var parent = node.parent();

            var sameTagSiblings = parent.children(name);
            if (sameTagSiblings.length > 1) { 
                var allSiblings = parent.children();
                var index = allSiblings.index(realNode) + 1;
                if (index > 1) {
                    name += ':nth-child(' + index + ')';
                }
            }

            path = name + (path ? '>' + path : '');
            node = parent;
        }

        return path;
    }
});

window.addEventListener('DOMContentLoaded', function () {
  var callback = function (data) {
    $("#responses").append("<div>" + data + "</div>");
  };

  var send = function () {
    chrome.runtime.sendMessage(Date(), callback);
  }

  chrome.runtime.onMessage.addListener(function(msg, data){
        if (msg.command == "append-author") {
            $("#responses").append("<div>" + msg.el + "</div>")
        }
    })
  document.getElementById('send').addEventListener('click', send);
});

Расширение Google Chrome: выделите div, над которым мышь наведет

marker.js

// Unique ID for the className.
var MOUSE_VISITED_CLASSNAME = 'crx_mouse_visited';
var MOUSE_MARKED_CLASSNAME = 'crx_mouse_marked';

// Previous dom, that we want to track, so we can remove the previous styling.
var prevDOM = null;

// Mouse listener for any move event on the current document.
document.addEventListener('mousemove', function (e) {
    let srcElement = e.srcElement;

    // Lets check if our underlying element is a IMG.
    if (prevDOM != srcElement && srcElement.nodeName == 'DIV' ) {


        // For NPE checking, we check safely. We need to remove the class name
        // Since we will be styling the new one after.
        if (prevDOM != null) {
            prevDOM.classList.remove(MOUSE_VISITED_CLASSNAME);
        }

        // Add a visited class name to the element. So we can style it.
        srcElement.classList.add(MOUSE_VISITED_CLASSNAME);

        // The current element is now the previous. So we can remove the class
        // during the next ieration.
        prevDOM = srcElement;
        // console.info(srcElement.currentSrc);
        // console.dir(srcElement);
    }
}, false);

var iframe = document.createElement('iframe'); 
iframe.style.background = "green";
iframe.id = "comm-test-container";
iframe.style.height = "100%";
iframe.style.width = "0px";
iframe.style.position = "fixed";
iframe.style.top = "0px";
iframe.style.right = "0px";
iframe.style.zIndex = "9000000000000000000";
iframe.frameBorder = "none"; 
iframe.src = chrome.extension.getURL("iframe.html")

document.body.appendChild(iframe);

function toggle(){
    if(iframe.style.width == "0px") {
        iframe.style.width="400px";
    } else {
        iframe.style.width="0px";
    }
}

chrome.runtime.onMessage.addListener(function(msg, sender){
    if(msg == "toggle"){
        toggle();
    }
    if(msg == "author") {
        prevDOM.classList.add(MOUSE_MARKED_CLASSNAME);
        chrome.runtime.sendMessage({command:"append-author",el:prevDOM.innerHTML,selector:$(prevDOM).getPath()}, function(response) {});
    }
})

// find unique selector
jQuery.fn.extend({
    getPath: function () {
        var path, node = this;
        while (node.length) {
            var realNode = node[0], name = realNode.localName;
            if (!name) break;
            name = name.toLowerCase();

            var parent = node.parent();

            var sameTagSiblings = parent.children(name);
            if (sameTagSiblings.length > 1) { 
                var allSiblings = parent.children();
                var index = allSiblings.index(realNode) + 1;
                if (index > 1) {
                    name += ':nth-child(' + index + ')';
                }
            }

            path = name + (path ? '>' + path : '');
            node = parent;
        }

        return path;
    }
});

marker.css

.crx_mouse_visited {
    background-clip: #bcd5eb!important;
    outline: 1px dashed #e9af6e!important;
    z-index : 0!important;
}

.crx_mouse_marked {
    background-clip: #bcd5eb!important;
    outline: 5px solid #e9af6e!important;
    z-index : 0!important;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...