Text selection and bubble overlay as Chrome extension

前端 未结 3 1089
感情败类
感情败类 2020-12-13 01:19

I am looking for a way to select text on a website in Chrome and have a overlay/tooltip pop with content depending on the text selection.

Has anyone done this before

3条回答
  •  执笔经年
    2020-12-13 01:38

    All you need to do is listen for mouse events:

    • mousedown: to hide the bubble.
    • mouseup: to show the bubble.

    For example, this might help you get started. More tweaks are needed, to figure out if you initiated the selection from down->up, right->left, etc (all directions). You can use the following code as a startup:

    contentscript.js

    // Add bubble to the top of the page.
    var bubbleDOM = document.createElement('div');
    bubbleDOM.setAttribute('class', 'selection_bubble');
    document.body.appendChild(bubbleDOM);
    
    // Lets listen to mouseup DOM events.
    document.addEventListener('mouseup', function (e) {
      var selection = window.getSelection().toString();
      if (selection.length > 0) {
        renderBubble(e.clientX, e.clientY, selection);
      }
    }, false);
    
    
    // Close the bubble when we click on the screen.
    document.addEventListener('mousedown', function (e) {
      bubbleDOM.style.visibility = 'hidden';
    }, false);
    
    // Move that bubble to the appropriate location.
    function renderBubble(mouseX, mouseY, selection) {
      bubbleDOM.innerHTML = selection;
      bubbleDOM.style.top = mouseY + 'px';
      bubbleDOM.style.left = mouseX + 'px';
      bubbleDOM.style.visibility = 'visible';
    }
    

    contentscript.css

    .selection_bubble {
      visibility: hidden;
      position: absolute;
      top: 0;
      left: 0;
      background:-webkit-gradient(linear, left top, left bottom, from(#2e88c4), to(#075698));
    }
    

    manifest.json

    Change the matches portion to the domain you want to inject these content scripts.

    ...
    ...
      "content_scripts": [
        {
          "matches": ["http://*/*"],
          "css": ["main.css"],
          "js": ["main.js"],
          "run_at": "document_end",
          "all_frames": true
        }
    ...
    ...
    

    If you want to style it to look like a bubble, Nicolas Gallagher did some awesome CSS3 demos for bubbles!

提交回复
热议问题