将变量赋值给函数在JavaScript中不起作用?

时间:2012-08-23 22:29:30

标签: javascript

我有一些代码可以读取突出显示的文字。但是我在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

4 个答案:

答案 0 :(得分:4)

您在页面加载时调用getSelectionText(),因此当时不会选择任何文本。

您需要从事件处理程序中调用它。

另外,你是:

  • 使用内在事件属性(which you shouldn't
  • 不引用您的属性值(这是不好的做法)
  • 在文档加载后(当它处于关闭状态时)尝试调用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>