Firefox插件:在选择后将值从上下文菜单传递给contentScriptFile
Firefox add-on : passing value from context menu to contentScriptFile after selection
我正在开发一个插件,当用户选择一个值并右键单击上下文菜单..该对象的属性必须存储。
下面是我的代码Main.js
var contextMenu = require("sdk/context-menu");
var menuItem = contextMenu.Item({
label: "Log Selection",
context: contextMenu.SelectionContext(),
contentScript: 'self.on("click", function () {' +
' var text = window.getSelection().toString();' +
' self.postMessage(text);' +
'});',
accessKey: "l",
onMessage: function (selectionText) {
console.log(selectionText);
contentScriptFile: [data.url("test.js")]
}
});
下面是test.js,我想取selectiontext对象并打印其innerhtml
. js
parseElement(document.getElementById("selectionText"));
function parseElement(Element)
{
if (Element == null)
return;
alert(Element.innerHTML);
以下是我面临的一些问题,请帮助我
我无法理解如何获得选择文本的属性,如inspect element
如何将选定的文本属性传递给main.js
您的data.js
中的函数称为parseElement
。但是,一个选择可以包含元素的一部分或多个元素,每个元素都可以有自己的HTML标记和CSS属性。其实挺复杂的。
在内容脚本中,document.getSelection()
将返回一个Selection
对象。这个Selection
包含了document.getSelection().rangeCount
给出的一些Range
。第一个范围(除非您使用ctrl键选择了多个范围,否则不会有多个范围)由document.getSelection().getRangeAt(0)
给出。对于这个答案的其余部分,我将假设Selection
中只有一个范围,它应该涵盖绝大多数用例。下面的表达式表示单范围选择:
var selection = document.getSelection();
var range = selection.getRangeAt(0);
不幸的是,(据我所知)没有一种快速而肮脏的方法来获取与该范围关联的所有HTML元素的列表。Range
类确实有一个属性,它给出了共同祖先,这是最小的Node
,它包含了全部或部分被Range
包含的所有元素:
var ancestorContainer = range.commonAncestorContainer;
顺便说一下,所有HTML元素都由Node
s表示。并非所有的Node
都是元素。其中,.nodeType
属性的值为Node.ELEMENT_NODE
。最多有两个节点部分位于Range
内。这些是range.startContainer
和range.endContainer
。对于(1)完全在选择范围内并且(2)是元素的节点,NodeIterator
可能是获得它们的确定列表的最直接的方法:
var nodeIterator = document.createNodeIterator(
// first argument is the root node at which to begin the NodeIterator's traversal:
ancestorContainer,
// second argument 'whatToShow'; we're interested in elements:
NodeFilter.SHOW_ELEMENT,
// third argument 'filter', a function whose return value tells iterator which nodes to iterate over.
function (node) {
return selection.containsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
}
);
然后从NodeIterator
中获得实际的Node
s(在本例中是Element
s):
var elementsWithinSelection = [];
var e = nodeIterator.nextNode();
while (e) {
elementsWithinSelection.push(e);
e = nodeIterator.nextNode();
}
对于每个Element
的属性,它们的.tagName
, .textContent
和.style
属性应该包含您需要的信息。将信息发送到您编写为onMessage
属性的函数是使用self.postMessage(string)
的问题。一个例子可能是:
self.postMessage(JSON.stringify(elementsWithinSelection.map(function (e) {
return e.outerHTML;
})));
- 使用JQuery的动态上下文菜单
- JQuery在单击正文时隐藏上下文菜单
- JQuery上下文菜单显示/隐藏问题
- 防止在移动Safari(iPad/iPhone)中长按/长按默认上下文菜单
- d3防止在上下文菜单上触发mouseout
- 何时可以;我的用户脚本在Javascript中触发右键单击(上下文菜单)
- 使用JSTree上下文菜单捕获新创建的节点
- 在GXT中激活上下文菜单时,如何保持选中的文本高亮显示?(EXT GWT 2.x)
- HTML5上下文菜单-当菜单项被点击时,访问最初被点击的元素
- 可替代多级上下文菜单
- 如何在鼠标悬停时显示带有拉斐尔元素(圆、线)的上下文菜单
- 在上下文菜单项单击上显示侧边栏/弹出窗口的最佳方法是什么
- 如何使用jstree删除上下文菜单中的编辑选项
- 如何使用Windows Phone在IE上禁用上下文菜单(保存和共享照片)
- TinyMCE 在上下文菜单中创建子菜单
- D3 上下文菜单,更改所选节点颜色
- 剑道上下文菜单 - 防止在鼠标按下时关闭
- 将上下文菜单附加到大量图形点
- API Google Maps Javascript在上下文菜单中调用事件侦听器
- Firefox Add-on-sdk:右键单击子菜单上下文以显示面板