修改javascript代码,使其获得iframe中当前选定的文本

修改javascript代码,使其获得iframe中当前选定的文本,javascript,iframe,frame,Javascript,Iframe,Frame,我有一个基于javascript的Google Chrome扩展,它将网页中当前选定的文本作为输入,然后将该文本翻译成英语。原文将替换为同一位置的译文 我有一个要求,其中一些网站将显示在一个iframe中,对于那些网站,我也想在iframe中翻译当前选定的文本 下面给出了扩展开始处的源代码,它从中获取当前选定的文本-- 如何更改上述代码/添加一些代码,以便变量“selection”可以在主窗口中存储当前选定的文本,或在iframe中存储当前选定的文本?此外,即使要翻译的文本在iframe内,也应

我有一个基于javascript的Google Chrome扩展,它将网页中当前选定的文本作为输入,然后将该文本翻译成英语。原文将替换为同一位置的译文

我有一个要求,其中一些网站将显示在一个iframe中,对于那些网站,我也想在iframe中翻译当前选定的文本

下面给出了扩展开始处的源代码,它从中获取当前选定的文本--

如何更改上述代码/添加一些代码,以便变量“selection”可以在主窗口中存储当前选定的文本,或在iframe中存储当前选定的文本?此外,即使要翻译的文本在iframe内,也应正确初始化变量“range”

此外,一旦翻译完成,原始语言文本将在网页的同一位置被翻译文本替换,变量“replacement”存储翻译文本--

请注意,“范围”的初始化代码在本问题中显示的第一个代码部分中给出

如何修改上述代码,以便在iframe中创建新的span元素?我的理解是,要做到这一点,关键部分是代码

 var holder = document.createElement('span');
变量“holder”也应该能够在iframe中创建跨度元素


如何修改此代码?

您应该参考
iframe
文档,而不是当前的主
文档
,从中可以确定实际选择的文本

function getIFrameDocument(iframe) {
    var doc;
    if (iframe.contentDocument) {
        doc = iframe.contentDocument;
    } else if (iframe.contentWindow) {
        doc = iframe.contentWindow.document;
    } else if (iframe.document) {
        doc = iframe.document;
    } else {
        doc = window.frames[iframe.id].document;
    }

    return doc;
}

// try to get main document selection
var selection = document.getSelection();
if (!selection) {
    selection = getIFrameDocument(document.getElementById('your-iframe-id')).getSelection();
}

请注意,这是未经测试的,但想法是有意义的。

您应该参考
iframe
文档,而不是当前的主
文档,从那里您可以确定实际选择的文本

function getIFrameDocument(iframe) {
    var doc;
    if (iframe.contentDocument) {
        doc = iframe.contentDocument;
    } else if (iframe.contentWindow) {
        doc = iframe.contentWindow.document;
    } else if (iframe.document) {
        doc = iframe.document;
    } else {
        doc = window.frames[iframe.id].document;
    }

    return doc;
}

// try to get main document selection
var selection = document.getSelection();
if (!selection) {
    selection = getIFrameDocument(document.getElementById('your-iframe-id')).getSelection();
}

请注意,这是未经测试的,但这个想法是有道理的。

非常有趣+1。您可以使用:
$('iframe').contents()获取iframe的文档。获取(0)
非常有趣+1。您可以使用:
$('iframe').contents()获取iframe的文档。在代码$('iframe').getSelection()中获取(0)
,值'iframe'表示iframe的名称,对吗?或者我可以按原样使用您的代码,而不考虑需要进行翻译的iframe的名称……而且我看不到对函数“getIFrameDocument(iframe)”的任何调用……请原谅,如果我的查询听起来很愚蠢,请原谅,我是javascript的初学者(尽管我确实觉得它非常有趣):@Arvind,没关系,我没有测试过这个,只是一个想法:-)。是的,您应该传入您的iframe id,我更新了代码以了解更多信息clarity@epoch-谢谢,现在看起来很清楚。。。我还有最后一个问题。。。是否有某种方法可以自动检测iframe(在其中选择了文本)?我想使用此代码的场景涉及多个iframe,我想逐个翻译每个iframe,自动翻译用户选择要翻译的文本的iframe的文本…感谢您的帮助…@Arvind,很高兴,我没有代码的工作副本,无法测试,如果你能发布一个提琴会很酷吗?@epoch-请查看位于的提琴,请注意,还有一个js用于配置上面页面上的代码作为google chrome扩展的一部分,如果你愿意,我也可以为该js页面创建一个提琴..在代码$('iframe')。getSelection()中,值'iframe'表示iframe的名称,正确的?或者我可以按原样使用您的代码,而不考虑需要进行翻译的iframe的名称……而且我看不到对函数“getIFrameDocument(iframe)”的任何调用……请原谅,如果我的查询听起来很愚蠢,请原谅,我是javascript的初学者(尽管我确实觉得它非常有趣):@Arvind,没关系,我没有测试过这个,只是一个想法:-)。是的,您应该传入您的iframe id,我更新了代码以了解更多信息clarity@epoch-谢谢,现在看起来很清楚。。。我还有最后一个问题。。。是否有某种方法可以自动检测iframe(在其中选择了文本)?我想使用此代码的场景涉及多个iframe,我想逐个翻译每个iframe,自动翻译用户选择要翻译的文本的iframe的文本…感谢您的帮助…@Arvind,很高兴,我没有代码的工作副本,无法测试,如果你能发布一个提琴会很酷吗?@epoch-请查看位于的提琴,请注意,还有一个js用于配置上面页面的代码,作为google chrome扩展的一部分,如果你愿意,我也可以为该js页面创建一个提琴。。
function getIFrameDocument(iframe) {
    var doc;
    if (iframe.contentDocument) {
        doc = iframe.contentDocument;
    } else if (iframe.contentWindow) {
        doc = iframe.contentWindow.document;
    } else if (iframe.document) {
        doc = iframe.document;
    } else {
        doc = window.frames[iframe.id].document;
    }

    return doc;
}

// try to get main document selection
var selection = document.getSelection();
if (!selection) {
    selection = getIFrameDocument(document.getElementById('your-iframe-id')).getSelection();
}