我有一些代码可以读取突出显示的文字。但是我在JavaScript中为函数分配变量时遇到了麻烦。 它没有像预期的那样正确调用函数。
<html>
<head>
<script type="text/javascript">
function getSelectionText()
{
var text = "";
if (window.getSelection)
{
text = window.getSelection().toString();
}
return text;
}
var txt = getSelectionText(); //<-----This is not working???
</script>
</head>
<body>
<p id="p1">Select some of this text then press the button<br /></p>
<button onclick= document.write(txt) >GetText</button>
</body>
</html>
如果我在写参数中使用该函数,它就可以工作。
<button onclick= document.write(getSelectionText()) >GetText</button>
如果为其分配变量,为什么函数没有被正确调用?
-ScottA
答案 0 :(得分:4)
您在页面加载时调用getSelectionText()
,因此当时不会选择任何文本。
您需要从事件处理程序中调用它。
另外,你是:
document.write
答案 1 :(得分:0)
这不是关于在调用函数时分配变量。
使用您的工作版本,按下按钮时会调用getSelectionText()。在不起作用的版本中,只要加载<script>
标记就会调用getSelectionText()...当按下按钮时,之前调用的结果就是正在使用的内容。
因为你想要的是按下按钮时要调用的函数,那么这就是你明确需要做的事情。
答案 2 :(得分:0)
我只是让你的代码工作。在大多数情况下。基本上,我不依赖txt
变量,而是使用主函数打印到网页。你为什么不试试this,看看你想改进什么。
答案 3 :(得分:0)
你的行var txt = ...正在将全局变量txt初始化为getSelectionTxt()的返回值
理解全局变量如何被初始化的关键是意识到在加载javascript时进行赋值,而不是在加载HTML DOM时进行赋值。因此,在许多情况下,在DOM的其他部分准备好之前,全局分配将过早评估。
延迟事物的一种方法是使用body.onload事件或函数。您可以在body标签中设置事件,例如在这里,在适当的时候调用你的某些功能。
<body onload="initializeMyGlobalsFromDom()">
其中initializeMyGlobalsFromDom是包含您的行的函数 txt = getSelectionTxt(); //注意:省略var关键字以将txt称为全局
(您应该继续在函数外部声明“var txt;”,最佳实践可能会在函数中使用之前说明。)
还有一些方法可以在不需要HTML标记中的属性的情况下挂钩事件。在全局上下文中(你现在有var txt = ...),你可以做到
window.addEventListener("onload",initializeMyGlobalsFromDom);
另一个选择是将函数本身分配给全局变量,如:
var txtFn = getSelectionText; //注意赋值函数不是函数返回值
然后当你使用全局变量时,你必须调用它:
<button onclick="document.write(txt())">GetText</button>