- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个插件,当用户选择一个值并右键单击上下文菜单时......必须存储该对象的属性。
下面是我的代码
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")]
}
});
下面是我想获取 selectiontext 对象并打印其 innerhtml 的 test.js
测试.js
parseElement(document.getElementById("selectionText"));
function parseElement(Element)
{
if (Element == null)
return;
alert(Element.innerHTML);
下面是我遇到的一些问题,请帮助我
我无法理解如何获取选择文本的属性,例如检查元素
如何将选定的文本属性传递给 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
表示。并非所有的 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
(在本例中是 Element
)的业务:
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;
})));
关于javascript - Firefox 附加组件 : passing value from context menu to contentScriptFile after selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517216/
解释 onCreateOptionsMenu(Menu menu) 和 onPrepareOptionsMenu(Menu menu) 的区别。 最佳答案 onCreateOptionsMenu()
所以我又一次为一些问题而苦苦挣扎。这次是这样的,当我将鼠标悬停在 portfoilio 的下拉菜单上时(当网站处于移动 View 模式时),它只会越过其他元素,我尝试使所有内容相对,删除 float
我正在为移动设备设置新菜单。一切都设置好了,但在我点击任何菜单项后,它并没有关闭菜单和菜单覆盖。 有什么办法解决这个问题吗? 我在下面提供了我的 CSS 和 HTML 代码。 CSS margin
我正在使用 selenium webdriver 为单页 Web 应用程序开发一个 Java 框架,使用以下模式:PageObject、SlowLoadableComponent(责任链)、PageF
我是一个动态创建和选项菜单,选项菜单取决于 onCreate() 阶段创建的数据。 问题在于 onCreateOptionsMenu() 在创建数据之前被调用。有没有办法在onCreate()之后执行
HTML: Portfolio Services About Testimonials Request a Quote CSS: ul#menu li {
我是 extjs 的新手。我想在从 Ext.menu.Menu 选择菜单项时关联一个商店。我正在使用 extjs 4.1.0。我在网上搜索甚至通过 sencha doc 但我找不到任何方法来实现这一目
我正在使用 Bootstrap 3.0.0 制作网站 除了下拉菜单不起作用之外,一切都很好。 在文件的头部,我做出了以下声明: 有什么东西不见了? html 应该是正确的:
我刚刚开始学习 JQuery/JavaScript,我无法弄清楚使用 (".menu") 和 ("menu") 之间的区别以及应该在哪里使用它们? 最佳答案 它是menue,jquery使用css选择
我正在尝试向我的应用程序页面之一添加菜单,但由于某种原因,它没有出现。我使这个特定页面扩展了 AppCompactActivity 并覆盖了 onCreateOptionsMenu(Menu menu
我需要完全控制透视菜单。 我已经侵入平台以禁用上下文菜单: private void disablePerspectiveToolbarMenu() { PerspectiveBarManag
假设我有一个包含一些项目的菜单 (Ext.menu.Menu)。显示菜单时,用户 cat 右键单击它的项目,将显示浏览器上下文菜单(带有“将链接另存为...”等元素)。 如何禁用该浏览器上下文菜单
我有一个按钮,单击后将展开一个菜单项,我希望能够通过 java 脚本控制台以编程方式单击其中一个菜单项。这是我单击按钮所需的内容,但在单击 Ext.menu.Menu 时需要一些帮助 var fire
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 5年前关
在这里,我正在从事 safari 扩展开发。我已经在 safari 浏览器上成功获得了开发者证书。 在这里,我可以在工具栏项上创建菜单和子菜单,但根据我的项目要求,我必须在栏中包含菜单和菜单项。 请建
我正在使用 Java 和 Android Studio。我需要更改操作栏上的图像。我需要做的是根据从远程传感器接收到的读数来更改在操作栏上显示的图像。因此,我无法使用可点击的方法,而是使用一些代码在从
亲爱的..我有一个问题。在 Firebug 展上: $("#menu ul.menu").lavaLamp 不是 menu.js 中的函数 悬停在菜单上不显示。我把这个问题显示出来:
因此,我接到了一项任务,即使用 CSS 为网页创建一个汉堡包式多级菜单。这里的问题是添加一个子菜单,使其成为一个多层次的汉堡包。下面是我到目前为止为汉堡包多级菜单编写的代码片段 body { marg
我正在学习 Android 并遵循简单的相机应用教程。我复制了一段代码,但出现错误,我不确定原因。 我使用的教程是, http://iwearshorts.com/blog/android-devel
我的/About 中有一个包含路线的子菜单。 这个子菜单称为 AboutMenu 并出现在/About 下的所有页面,例如 =>/About/Company 和/About/Info。 练习示例显示
我是一名优秀的程序员,十分优秀!