1

我遇到了一个非常大的问题,为了从网页中以某种方式获取选定的文本,然后使用contextmenu处理它......当我解决ChromeFirefoxIE11,我发现我不能得到FirefoxInternet Explorer时选定的文本是在输入框中输入选定的文本....上下文菜单如果文本是输入标记/文本框,则JavaScript无法获取所选文本

...我已经寻找天以某种方式解决,最后我已成功...

这是原始脚本Internet Explorer

var parentwin = external.menuArguments 
 
var selectedText = getSel(); 
 

 

 
function getSel(){ 
 
    var w=window,d=parentwin.document,gS='getSelection'; 
 
    return (''+(w[gS]?w[gS]():d[gS]?d[gS]():d.selection.createRange().text)).replace(/(^\s+|\s+$)/g,''); 
 
}

这为FireFox

var contextMenu = require("sdk/context-menu"); 
 
var tabs = require("sdk/tabs"); 
 
var clipboard = require("sdk/clipboard"); 
 
var {Cc,Ci} = require('chrome'); 
 
var simpleGetLibrary = null; 
 
var menuItem = contextMenu.Item({ 
 
    label: "Get selected text", 
 
    context: contextMenu.SelectionContext(), 
 
    contentScript: 'self.on("click", function() {' + 
 
       ' var text = window.getSelection().toString();' + 
 
       ' self.postMessage(text);' + 
 
       '});', 
 
    onMessage: function (selectionText) { 
 
    console.log(selectionText); 
 
\t clipboard.set(selectionText); //this line copy the selected text to Clipboard 
 
}

但我不知道,我怎么能解决让莫名其妙的文字时,它是在一个输入框... <INPUT> ...</INPUT> 解决方案如下...

回答

1

对于Internet ExplorerIE11

var parentwin = external.menuArguments 
 
var selectedText = getSel(); 
 

 

 
function getSel(){ 
 
    var w=parentwin.window,d=parentwin.document,gS='getSelection'; 
 
    var selectedText; 
 
    var rv=(''+(w[gS]?w[gS]():d[gS]?d[gS]():d.selection.createRange().text)).replace(/(^\s+|\s+$)/g,''); 
 
    parentwin.console.log("the selected text is in first try is:"+rv); 
 
    
 
if (rv=="") { 
 
    var allinput = parentwin.document.getElementsByTagName("input"); //I get an array of all input tags 
 
    var index; 
 
    var newsel; 
 
    var found="false"; 
 
    for (index = 0; index < allinput.length; index++) { 
 
    parentwin.console.log("index: "+index); 
 
    newsel=""; 
 
    parentwin.console.log("newsel= "); 
 
    try { 
 
     var ss = allinput[index].selectionStart; 
 
     parentwin.console.log("ss"); 
 
     var se = allinput[index].selectionEnd; 
 
     parentwin.console.log("se"); 
 
     if (typeof ss === "number" && typeof se === "number") { 
 
     newsel=allinput[index].value.substring(ss, se); 
 
     found=newsel; 
 
     if (newsel.length>0){ 
 
     rv=newsel; 
 
     found="true"; 
 
     allinput[index].selectionEnd=allinput[index].selectionStart; 
 
     newsel=""; 
 
     } 
 
     } 
 
    } 
 
    catch(err){} 
 
    parentwin.console.log("input fields "+index+"/"+allinput.length+" fieldname:"+allinput[index].getAttribute("name")+" selection: "+newsel); 
 
    if (found=="true"){ 
 
    index=allinput.length; 
 
    } 
 
    } 
 
    parentwin.console.log("found=:"+found); 
 
} 
 
    return rv; 
 
}

而对于Firefox是有点棘手,因为我不能访问DOM,所以我需要解决这ContentScript建筑,然后我直接发送结果..因为我不能解决如何得到唯一的选择,我发送输入框的值,如果不是全部选择都没关系...

var contextMenu = require("sdk/context-menu"); 
 
var tabs = require("sdk/tabs"); 
 
var clipboard = require("sdk/clipboard"); 
 
var preferences = require("sdk/simple-prefs").prefs; 
 
var {Cc,Ci} = require('chrome'); 
 
var simpleGetLibrary = null; 
 
var menuItem = contextMenu.Item({ 
 
    label: "Get selected text", 
 
    context: contextMenu.SelectionContext(), 
 
    contentScript: 'self.on("click", function (node, data) {' + 
 
       ' var text = window.getSelection().toString();' + 
 
\t \t \t \t ' console.log("Selected node is: "+node.nodeName);' + 
 
\t \t \t \t ' console.log("Selected value is: "+node.value);' + 
 
       ' if (text.lenght>0)' + 
 
\t \t \t \t ' self.postMessage(text);' + 
 
\t \t \t \t ' else ' + 
 
\t \t \t \t ' if (node.nodeName=="INPUT")' + 
 
\t \t \t \t ' self.postMessage(node.value);' + 
 
\t \t \t \t '});', 
 
    onMessage: function (selectionText) { 
 
    console.log("Selection sent for processing is: "+selectionText); 
 
    clipboard.set(selectionText); //this line copy the selected text to Clipboard 
 
    }

+0

什么是真棒解决方案!很好地输入!总是为那些想出问题并回来分享答案的人提供支持! – Noitidart 2015-01-16 03:01:33

+0

#Noitidart谢谢 – RobiGo 2015-02-11 14:08:11