无法获取未定义或空引用的 'createRange' 属性

10
以下的代码,在我升级到Windows 8.1 / Internet Explorer 11之前一直运行良好,但现在出现错误:“无法获取未定义或空引用的'createRange'属性。”
var SelectedData = window.external.menuArguments.document.selection.createRange().text;

这个问题是否有解决方法或变通之策?

* 以下为更新后的代码,仍然无法正常工作....

<html><head><title>-</title><script type="text/JScript">
function Launch()
{
var TheSelection = document.getSelection();
if(TheSelection != null)
{

.... do  a bunch of stuff

}
window.close();
}
</script></head><body onload="Launch();" </body></html>

我也尝试过 window.getselection; window.getselection(); window.getselection().tostring();

但这些都似乎不起作用...???


1
你有没有想过,你可能正在尝试在空或未定义的引用上调用createRange方法? - Raymond Chen
是的,但这并不是问题 - 有关更多信息,请参阅awiebe的注释 - Rob
虽然这可能不是问题所在,但你应该将其作为一个问题的“描述你尝试过什么”的要求的一部分来提及,以便人们不会浪费时间去探索你已经尝试过的东西。 - Raymond Chen
抱歉,Raymond,我现在已经添加了更多细节。我想表达的重点是,我最初放置的一行代码不再起作用 - 其他所有内容似乎都没问题。我知道有一个新的DOM,旧的方法不再受支持 - 这是一个很好的线索 - 但我仍在寻找原始代码的可工作等效版本。 - Rob
3个回答

18

关于document.selection的文档在最上面就说了:

selection已不再支持。从Internet Explorer 11开始,请使用getSelection。详情请参阅兼容性更改。

document.selection.createRange().text更改为document.getSelection()

问题恰好是我所预测的。您正在对空或未定义的引用调用createRange()。具体来说,document.selection是未定义的。错误消息明确指出了问题所在。


谢谢Raymond,但这似乎也行不通。我已经更新了原始问题,并添加了额外的代码。 - Rob
3
你没有遵循我的建议。你不仅仅改变了 document.selection.createRange().text 为 document.getSelection(),还删除了 window.external.menuArguments。请把它放回去。 - Raymond Chen
Bingo: window.external.menuArguments.document.getSelection(); 完美地运作了 - 非常感谢您的帮助,也感谢 awiebe 的帮助。 - Rob

0

这真的没有太多上下文,但一般来说,您的错误信息意味着您未能做到这一点:

var SelectedData;
var selection = window.external.menuArguments.document.selection;
if(selection != null)
{
  SelectedData = selection.createRange().text;
}

当您尝试获取选择时,没有进行任何选择,因此选择为空。当对象为空时,您无法查询它,因为包含所需信息的结构不存在。


谢谢 - 虽然这是一个好观点,但这不是问题所在。为了更好的上下文,我正在选择文本,并通过上下文菜单调用它 - 如此描述:http://msdn.microsoft.com/en-us/library/bb735853(v=vs.85).aspx 上述代码已经运行良好几年了,但现在在Windows 8.1 - IE 11下会抛出此错误。另外,我尝试禁用保护模式 - 启用后我看不到任何反应,禁用后我会收到一个弹出错误,显示“无法获取未定义或空引用的'createRange'属性”。 - Rob
成员“external”不再是“window”的一部分。您将需要根据新的DOM重写代码,而不是遗留代码。http://msdn.microsoft.com/en-us/library/ms535873%28v=vs.85%29.aspx - awiebe
根据那篇文章,我应该能够使用 window.getselection(),但是 var selObj = window.getselection(); 也会返回一个错误 - 对象不支持属性或方法 getselection?? 有任何进一步的见解将会有帮助。 - Rob
您的扩展程序在自己的网页中运行,因此它具有单独的窗口上下文。您的 window 不会指向原始窗口。 - Raymond Chen

0

对于这个调整,您可以找到:

b=document.selection.getSelection()

或类似内容 然后您可以使用下面的代码进行更改:

b=typeof document.selection!=="undefined"?document.selection.getSelection():null

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