2

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

如果我为它分配一个变量,为什么不能正确调用该函数?

-斯科特A

4

4 回答 4

4

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

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

此外,您是:

  • 使用内在的事件属性(你不应该
  • 不引用您的属性值(这是不好的做法)
  • 在文档加载后尝试调用document.write(当它处于关闭状态时)
于 2012-08-23T22:34:05.977 回答
0

这与分配变量无关,而是在调用函数时。

在您的工作版本中,按下按钮时会调用 getSelectionText()。在不工作的版本中,一旦<script>加载标签就会调用 getSelectionText() ......当按下按钮时,早期调用的结果就是正在使用的结果。

因为您想要的是在按下按钮时调用该函数,所以这就是您明确需要做的。

于 2012-08-23T22:38:03.843 回答
0

我刚刚让你的代码工作。在大多数情况下。基本上,我不依赖该txt变量,而是使用您的主要功能打印到网页。你为什么不试试这个,看看你想要改进什么。

于 2012-08-23T22:40:52.383 回答
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>
于 2012-08-23T22:47:29.380 回答