tes*_*BDD 5 javascript firefox-addon firefox-addon-sdk
我正在开发一个插件,当用户选择一个值并右键单击上下文菜单时.必须存储该对象的属性.
以下是我的代码
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")]
}
});
Run Code Online (Sandbox Code Playgroud)
下面是test.js,我想在其中使用selectiontext对象并打印其innerhtml
test.js
parseElement(document.getElementById("selectionText"));
function parseElement(Element)
{
if (Element == null)
return;
alert(Element.innerHTML);
Run Code Online (Sandbox Code Playgroud)
以下是我所面临的一些问题,请帮助我
我无法理解如何获取选择文本的属性,如inspect元素
如何将选定的文本属性传递给main.js
你的函数data.js叫做parseElement. 但选择内容可以包含一个元素的一部分或多个元素,每个元素都可以有自己的 HTML 标签和 CSS 属性。实际上相当复杂。
在内容脚本中,document.getSelection()将返回一个Selection对象。这Selection包含由 给出的多个Ranges document.getSelection().rangeCount。第一个范围(除非您使用 ctrl 键选择了多个范围,否则不会有多个范围)由 给出document.getSelection().getRangeAt(0)。对于这个答案的其余部分,我将假设 中只有一个范围Selection,它应该涵盖绝大多数用例。以下表达式表示单范围选择:
var selection = document.getSelection();
var range = selection.getRangeAt(0);
Run Code Online (Sandbox Code Playgroud)
不幸的是,没有(据我所知)快速而肮脏的方法来获取与该范围关联的所有 HTML 元素的列表。该类Range确实有一个给出共同祖先的属性,它是Node包含全部或部分包含在 中的所有元素的最小的Range:
var ancestorContainer = range.commonAncestorContainer;
Run Code Online (Sandbox Code Playgroud)
Node顺便说一句,所有 HTML 元素都由 s 表示。并非所有Nodes 都是元素。对于那些这样的人来说,该.nodeType财产具有价值Node.ELEMENT_NODE。最多有两个节点部分位于Range. 这些是range.startContainer和range.endContainer。至于 (1) 完全在选择范围内且 (2) 是元素的节点, aNodeIterator可能是获取它们的明确列表的最直接方法:
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;
}
);
Run Code Online (Sandbox Code Playgroud)
然后就是从 中获取实际的Nodes (在本例中是Elements)NodeIterator:
var elementsWithinSelection = [];
var e = nodeIterator.nextNode();
while (e) {
elementsWithinSelection.push(e);
e = nodeIterator.nextNode();
}
Run Code Online (Sandbox Code Playgroud)
至于每个属性Element,它们的属性.tagName和属性应该包含您需要.textContent的.style信息。将信息发送到您编写为属性的函数onMessage是使用 的问题self.postMessage(string)。一个示例(符合您所描述的内容)可能是:
self.postMessage(JSON.stringify(elementsWithinSelection.map(function (e) {
return e.outerHTML;
})));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |