使用JavaScript在移动Safari中获取所选文本

13

我正在开发一个书签小工具,希望通过“loop”获取用户选择的内容,使用window.getSelection和document.getSelection这两个函数可以调用,但它们始终返回空字符串。

我认为问题在于,在Mobile Safari中点击书签图标时,选择将被释放。例如,如果您选择了一些文本,点击“+”,书签或其他选项卡,则即使取消,选择也会被取消。

您对是否有可能获取这些数据有什么想法吗?还是说这基本上是不可能的?


你确定 window.getSelection() 返回的是空字符串而不是 DOMSelection 吗?虽然我无法访问移动版 Safari,但在 WebKit 中,即使页面上没有选择任何内容,此函数也会返回 DOMSelection。 - SWilk
参见http://stackoverflow.com/questions/1936132/getselection-for-iphone-bookmarklet - cofiem
3个回答

1

在移动浏览器中,“loop”的内容不会暴露给JavaScript,这是不可能的(我假设您正在完整的浏览器中工作,而不是在启动“保存到主屏幕”图标时创建的浏览器窗口中)。


你的帖子是一条评论,而不是答案。当你提出问题而不是发布解决方案时,请使用评论。否则对别人没有帮助。 - Mechlar

1

我认为您需要让书签插件在页面中插入一些内容,以便对所选内容进行操作。您可以在页面顶部或底部添加一个按钮,当单击时,它将对当前选择进行操作。然后,它可以清理添加的内容或将其保留在那里。


这是我在发布这个问题后想到的其中一种解决方案。我对这个解决方案的担忧是,我无法想到一个好的方法来定位添加的“按钮”,以便它可以轻松选择。移动Safari不支持“position:fixed”CSS属性。此外,它增加了更多步骤:1)激活书签 2)选择文本 3)查找并激活书签的添加内容相比之下,1)选择文本 2)激活书签谢谢你的建议。 - Nirmal
你可能想要查看来自http://amplify.com/的书签工具 - 它们正是在这里提出的内容,并且该按钮会跟随滚动操作。 - FRotthowe

-1

我有一个相当简单的想法。

var latestSelection = "";
while (true)
{
    var tmp;
    if ((tmp = document.getSelection()) != "")
        latestSelection = tmp;
}

通过这种方法,您将始终在 latestSelection 变量中拥有最新的选择。当然,一直运行这样的循环是很耗费资源的。因此,您可能需要尝试使用监听器或至少计时器。

希望这可以帮助到您。

更新: 不要直接使用上面的代码。

以下是您如何在 Objective-C 中编写相同的代码:

- (void) updateSelection
{
    NSString * tmp = [webView stringByEvaluatingJavaScriptFromString:@"document.getSelection()"];
    if (![tmp isEqualToString:@""])
        latestSelection = tmp;
}

您可以设置一个定时器来每隔 x 时间单位执行 updateSelection 函数。如果您找到了一个好的通知机制用以通知用户已与 webview 交互,那么您可以使用该通知来更新 latestSelection 变量。

我认为这会锁定UI线程,但改用setInterval()或setTimeout()就不会了, ;) - Dan Beam
有人能解释一下为什么这个答案被踩了吗?我解释了你应该使用计时器或监听器,这样就不会锁定UI线程。另外,如果你不想用Javascript编写它,你可以很容易地用Objective-C编写相同的东西。代码只是在解释一个想法,我并没有建议你实际使用那段代码。 - Erik B
我不明白为什么这被踩了。在我看来很有用。我刚给它点了赞。你有什么想法用哪种监听器吗?定时器可能会冒失掉选区中的变化,因为这些变化可能出现在上一个定时器周期和书签执行之间。 - LarsH
问题在于,假设代码确实需要使用。这样做会导致浏览器崩溃。如果您想呈现一个概念,那么只需编写一个解释它如何工作的说明,如果您需要使用代码来解释它,那么请添加一个免责声明,说明该代码未经测试或不适用于实际使用。此外,这个问题是要求解决书签脚本的问题,因此需要使用JavaScript(不能用Objective C编写),并且没有可能拥有“最新选择”,因为书签脚本代码直到被点击才会运行。所以...这就是为什么这个答案被投票否决的原因。 - Timothy Armstrong
即使不锁定浏览器,它也不起作用,因为要让书签脚本获取选定内容,该代码需要在书签脚本执行之前运行。 - FRotthowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接