Text selection and bubble overlay as Chrome extension

前端 未结 3 1081
感情败类
感情败类 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:34

    If nobody provides a better answer then you might look at how Google Dictionary extension does it (it would be hard as its code is minimized).

    0 讨论(0)
  • 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!

    0 讨论(0)
  • 2020-12-13 01:54

    I wrote something similar to what you're asking about. I listened for the user to select text and when there was a selection, I displayed a list of links for things like "Note on Facebook", "Define", etc.

    A day or two after I started to write it, I found that google was going to add context menu support in a future release so I didn't touch this until recently (when I converted to context menus).

    Take a look at the code:

    http://code.google.com/p/select-actions/source/browse/trunk/select_actions.js?r=4

    0 讨论(0)
提交回复
热议问题