【问题标题】:Use Javascript to get selected text in Mobile Safari使用 Javascript 在 Mobile Safari 中获取选定的文本
【发布时间】:2010-08-23 19:06:07
【问题描述】:

所以我正在开发一个书签,它非常适合我使用“循环”来获取用户选择的内容。 window.getSelection 和 document.getSelection 都是我可以调用的函数,但是它们总是返回一个空字符串。

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

是否有可能获得这些数据?或者这几乎是不可能的?

【问题讨论】:

  • 你确定 window.getSelection() 返回空字符串,而不是DOMSelection?我无法访问 Mobile Safari,但在 webkit 中,即使页面上没有选择任何内容,此函数也会返回 DOMSelection。

标签: javascript iphone safari selection mobile-safari


【解决方案1】:

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

【讨论】:

  • 这是我发布此问题后想到的解决方案之一。我对这个解决方案的担忧是,我想不出一个很好的方法来定位添加的“按钮”,以便它可以轻松选择。 Mobile Safari 不支持“位置:固定”CSS 属性。它还添加了更多步骤:1)激活书签 2)选择文本 3)找到并激活书签的添加内容与 1)选择文本 2)激活书签 谢谢您的建议。
  • 您可能想在amplify.com 的书签上试一试——他们完全按照这里的建议进行操作,并且按钮跟随滚动动作。
【解决方案2】:

“循环”的内容不会暴露给移动浏览器中的 javascript,期间。所以这是不可能的(我假设您是在完整的浏览器中工作,而不是在您启动“保存到主页”图标时创建的浏览器窗口中)

【讨论】:

  • 您的帖子是评论而不是答案。当您提出问题而不发布解决方案时,请使用 cmets。否则它没有帮助。
【解决方案3】:

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

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。如果您发现一些好的通知让您知道用户已与 web 视图进行了交互,您可以使用它来更新 latestSelection。

【讨论】:

  • 我认为这会锁定 UI 线程,尽管更改为使用 setInterval() 或 setTimeout() 不会,;)
  • 谁能解释为什么这个答案被否决了?我确实解释了您应该使用计时器或侦听器,这样您就不会锁定 UI 线程。此外,如果您不想用 Javascript 编写它,您可以轻松地用 Objective-C 编写相同的东西。该代码只是在解释一个想法。我并不是建议您实际使用该代码。
  • 我不明白为什么它被否决了。看起来对我有用。我刚刚投了赞成票。知道使用什么样的听众吗?计时器可能会丢失在最后一个计时器滴答和执行小书签之间发生的选择更改的风险。
  • 问题是,假设要使用代码。这样做会使浏览器崩溃。如果你想提出一个概念,那么只需写一个解释它是如何工作的,如果你需要使用代码来解释它,然后添加一个免责声明,说明该代码未经测试或不用于实际使用。此外,这个问题要求为小书签提供解决方案,因此需要 JavaScript(不能在目标 c 中编写),并且不可能有“最新选择”,因为小书签代码在被点击之前不会运行。所以...这就是为什么这个答案被否决的原因。
  • 即使它没有锁定浏览器也不会起作用,因为要让小书签进行选择,该代码需要在小书签执行之前运行 .
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 2015-05-28
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多