Return HTML from a user-selected text
我有以下非常简单的html页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <html>
<head>
<script type="text/javascript">
function alertSelection()
{
var selection = window.getSelection();
var txt = selection.toString();
alert(txt);
}
</head>
<body>
This is <span style="background-color:black;color:white">the</span> text.
<div style="background-color:green;width:30px;height:30px;margin:30px"
onmouseover="alertSelection()">
</body>
</html> |
当我选择整个第一行并将鼠标悬停在正方形上时,会出现"这是文本"的警报。
我将如何解决此问题,以使span标记或任何其他选定的HTML不会从警报消息中剥离出来?
编辑:我正在专门寻找如何从window.getSelection()获取完整的HTML。 警报对话框正是我尝试验证代码的方式。 我只担心在Safari中工作。
-
如何使用javascript获取选定的html文本的可能重复项?
这是一个可以在所有主要浏览器中为您提供与当前选择相对应的HTML的功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function getSelectionHtml() {
var html ="";
if (typeof window.getSelection !="undefined") {
var sel = window.getSelection();
if (sel.rangeCount) {
var container = document.createElement("div");
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
container.appendChild(sel.getRangeAt(i).cloneContents());
}
html = container.innerHTML;
}
} else if (typeof document.selection !="undefined") {
if (document.selection.type =="Text") {
html = document.selection.createRange().htmlText;
}
}
return html;
}
alert(getSelectionHtml()); |
-
+1为答案。但是我什么都没有。在什么情况下else if(typeof document.selection !="undefined")条件将成立?
-
@ Jehanzeb.Malik:在不支持window.getSelection和document.selection的浏览器中。诚然,我不知道现在还存在任何这样的浏览器,但是我更喜欢测试。
-
在IE10中,这似乎不太好用。它确实支持window.getSelection,但如果您在IE10 +标准模式下,document.selection将保存实际数据。
-
@Jedidja:实际问题是什么? IE 10确实表现得更像其他浏览器是件好事吗?
-
对不起,我应该更清楚了。该代码在IE10 +标准模式下不起作用,因为它实际上将使用window.GetSelection(已定义,但不包含选择信息),因此该方法返回一个空字符串。
-
在IE10中,无论我要说什么,我们都想使用document.selection.createRange()。
-
@Jedidja:我没有在IE 10(或9)中看到window.getSelection()严重的问题。因此,存在IE 10模式,其中window.getSelection存在但不返回选择吗?如果是这样,IE 9中是否也存在类似问题?
-
@TimDown实际上,您知道吗,我认为我是在错误的问题中发表评论。当您尝试从文本区域(输入)获取选择内容而不是从页面中获取纯HTML时,Im描述的问题存在。在这个问题上,我找到了很多答案,我相信我最终把这个错误发布在了错误的地方。
使用Rangy:https://github.com/timdown/rangy
跨浏览器范围和选择库。
在此处查看演示:http://rangy.googlecode.com/svn/trunk/demos/index.html
-
尽管我很想为我自己的图书馆推荐一个建议,但我还是以Rangy可能仅仅针对这一功能而过分反对为由。
-
我以为我没记错,那是@Tims创建的!
-
我想出Id建议,以防万一他不知道。 :)
-
由于此测试只是大型项目的第一步(大家可能都猜到了),所以我仍然可能最终需要Rangy。谢谢!
-
@Tim不是我不喜欢Google Code,但您是否考虑过将其在github上使用? :)
-
@克里斯蒂安:如果有一个压倒性的理由,我很乐意切换。 Google Code可能并不是一个崭新的事物,但它似乎可以满足我作为主要开发人员的所有需求,并且与Github相比,我喜欢布局的相对简单性。 Github是否对用户/潜在开发人员明显更好?
-
@Tim他们都有自己的优势。与任何其他Google产品一样,Google Code的使用非常简单。我不是特别喜欢SVN,但是他们现在支持Mercurial,所以很好。我喜欢Github的社交功能。您可以关注大量项目,并在有新的提交,跟踪器项目等时收到警报。不利的是,他们的免费帐户提供的服务不多。没有私人存储库和300MB的空间。我肯定在SO上有一些Github vs Google Code帖子。不要误会我的意思,如果您对Google Code感到满意,那么我不想影响您进行更改。 :)只是好奇。
-
@克里斯蒂安:谢谢你的总结。现在,迁移到Github的事情列在我(令人沮丧的一长串)要做的事情上。
-
@DanDascalescu您能避免劫持帖子吗?谢谢-社区
-
@PeeHaa:请原谅?我劫持了什么帖子?
-
@DanDascalescu这一个。修复链接对我来说很好,但是将您的意见添加到不是您自己的答案中就是劫持帖子。等等,我看到您还有其他几处编辑,看起来像是在劫持帖子。例如。 (但不限于)我已经看到了一个流星,您正在其中添加横幅到指向另一个答案的答案。我确定您的意图是好的,但是是否真的需要进行此类imo编辑。为此,我们有upvote / downvote按钮。谢谢你的配合!
-
@DanDascalescu-而且,我不确定是否适合编辑其他人的答案以插入您自己的评论:stackoverflow.com/posts/7478724/revisions,即使您觉得它有问题。您将自己的话放到别人的嘴里,那就是注释的用途。您所做的这些编辑在整个网站上都受到标记。
-
@BradLarson:那不是我的评论。这是该图书馆作者的评论:"我以Rangy可能仅出于这一功能而过分杀伤了自己。
-
因此,对@DanDascalescu进行评论。或自己回答。只是停止劫持帖子。更重要的是,当国防部刚刚告诉您您的编辑被标记时...
-
@BradLarson:再次在您链接的SQL答案上,这不是我的话,而是帖子(cucu8)上的注释者的话。
-
@PeeHaa:我认为该政策是为了改善答案?例如。我没有这个或其他meta帖子,因为我要比跟踪SO用户做得更好。如果答案有一个安全漏洞,我认为可以从评论中回响警告,这是我独立同意的。但是请随时还原-我不会凭良心让那些用户:)
-
@DanDascalescu-应该使用编辑来改进格式,修复链接等,但是需要尊重原始答案的精神和措辞。评论是讨论带有答案的潜在陷阱的地方,并且由回答者决定是否将这些评论合并到答案中。答案不应该被编辑为插入您自己的评论或其他不是回答者的评论。您或他们认为正确或有所改善的东西可能并不总是一回事。
-
@PeeHaa:究竟有何修改不需要最新答案?在我进行编辑之前,您链接到的"流星"充其量是没有用的,并且在最坏的情况下具有误导性。有人还原了我的编辑,现在答案指向不再维护的程序包,以及过去两年已过时的Wiki页面。这会提高该站点上答案的质量,还是增加大量奴隶规则的执行力?
-
@BradLarson:我理解保留答案精神的概念,但是这对网站质量有何帮助?由于这个原因,有许多明显错误的答案示例都有成千上万个投票(这里是一个)。审核规则似乎忽略的是,用户不必费心阅读注释,原始答复者有时永远不会回到他们的答案。尽管自2011年以来有评论指出其明显的缺陷,但我给出的示例几乎有4000票赞成票,排名第一。
-
@BradLarson我只想回应Dans的想法。 您是否真的希望每个用户都仔细阅读每个答案的每条评论,以寻找对最终回答实际问题的更正的更正? 我来索取解决方案,而不是寻找寻宝者。 当您审核准确的信息并阻止Dans等行为时,会降低网站的效率。 他在此站点上为我提供的帮助比任何主持人都做得更多。 如果他没有更好的事情要做,我会说他应该担任你的一份工作。 来吧,缓和这个:)
警报框不显示HTML,而仅显示纯文本。 您无法使HTML显示在警报框中。
您可以做的是使用某些JS警报框替换而不是alert,例如jQuery Dialog,jQuery插件或其他完全替代的东西。
-
不对。 alert("Hi")将起作用。问题是window.getSelection().toString()剥离所有标签。
-
@ Box9:对我不起作用。 FF 3.6,Windows7。将此粘贴到位置栏中:javascript:alert("Hi");
-
...对我有用。只要您转义相关的引号,就可以警告包含HTML的字符串没有问题。
-
在Mac上适用于FF和Chrome。我不会在位置栏中尝试使用控制台。
-
@ Box9,@ Tim Down:我们在这里加班了,但我仍然无法正常工作。也尝试过Chrome 9控制台。