Javascript:属性值为null或未定义,不是函数对象

Javascript:属性值为null或未定义,不是函数对象,javascript,Javascript,好吧,难倒了。我只是用代码向客户展示可能性(我是个体户)。 正在尝试显示get-selected-text-from-IE11-Browser。现在还不需要跨浏览器和专家级的东西(如果客户愿意)。 已尝试编写javascript函数从浏览器中获取所选文本。当调用direct(通过F12工具将函数放入控制台)并返回所选内容时,这种方法工作正常。但当从上下文菜单调用HTM脚本时,它会失败,并出现上述错误。获取所选文本的代码来自另一个上下文菜单脚本,当所有代码都在一个HTM脚本(cmGoogleMap

好吧,难倒了。我只是用代码向客户展示可能性(我是个体户)。 正在尝试显示get-selected-text-from-IE11-Browser。现在还不需要跨浏览器和专家级的东西(如果客户愿意)。
已尝试编写javascript函数从浏览器中获取所选文本。当调用direct(通过F12工具将函数放入控制台)并返回所选内容时,这种方法工作正常。但当从上下文菜单调用HTM脚本时,它会失败,并出现上述错误。获取所选文本的代码来自另一个上下文菜单脚本,当所有代码都在一个HTM脚本(cmGoogleMapSelection_1.HTM)中时,该脚本工作正常。我只是想在重用方面更高效一点,自己也能学到更多。如果我不能解决这个问题,我将返回到内联代码(在您的帮助下)

继续获取HTM脚本中报告的以下错误:

属性“myGetSelectedText”的值为null或未定义,不是函数对象。

我已经阅读了很多帖子,并试图确保我涵盖了他们的建议。仍然被难倒,感谢您的帮助。
代码,首先是“函数”,然后是“脚本”;脚本文件和函数文件都在同一个本地文件夹中(请原谅调试代码-gulp):

fn\u myGetSelectedText.js:

function myGetSelectedText(pDefault) {
var zDbug = 1; 
var zDbugMsg = "Debug: ";
var zSelection = "";

if (zDbug) {alert(zDbugMsg + "Starting Function 'myGetSelectedText' from fn_myGetSelectedText.js");}

zSelection = "" + window.getSelection().toString();

if (zDbug) {alert(zDbugMsg + " Selection= '" + zSelection + "'");}

if (zSelection == "") {
  zSelection = pDefault;
  alert(zDbugMsg + "Null selection, using: " + zDefault + " !");
  }

return zSelection;
}//EndOf: Function -----
cmGoogleMapSelection_2.htm:

<!-- saved from url=(0016)http://localhost -->

<script type="text/javascript" src="fn_myGetSelectedText.js"></script> 
<script type="text/javascript">
//- zDbug: 0 = false = no messages; 1 = true = show messages -----
var zDbug = 1;
var zDbugMsg = "Debug: ";

if (zDbug) {alert(zDbugMsg + "Starting cmGoogleMap_Selection2.htm V14");}

//- Google Maps stem URL & default location -----
var zMaps = "http://maps.google.co.uk/maps?hl=en&q=";
var zDefault = "+London";

var zSelection = myGetSelectedText(zDefault);    //- Error occurs here <<<<<<<<<<<

if (zDbug) {alert(zDbugMsg + " Selection= '" + zSelection + "'");}

//- Build Maps URL -----
var zGo = zMaps + zSelection;

//- Open new Maps window -----
if (zDbug) {alert(zDbugMsg + "Issuing Window.Open on URL: " + zGo);}
window.open(zGo, "_blank");

//- Close this window -----
window.close()
</script>

<!-- Just to put something into the main code window so I know which one it is -->
<style>
p {font-family: "Lucida Console"; color: Red; font-size: 16pt;}
</style>
<p> >>--  Map Selected Text Function  --<< <br> 
    >>--  . . 'myGetSelectedText' . . --<< </p>

//-zDbug:0=false=无消息;1=真=显示消息-----
var-zDbug=1;
var zDbugMsg=“调试:”;
if(zDbug){alert(zDbugMsg+“正在启动cmGoogleMap_Selection2.htm V14”);}
//-谷歌地图stem URL和默认位置-----
var zMaps=”http://maps.google.co.uk/maps?hl=en&q=";
var zDefault=“+伦敦”;

var zSelection=myGetSelectedText(zDefault);//-当浏览器从internet下载fn_myGetSelectedText.js文件时,此处发生错误,但它不会停止解析HTML中的其他代码。浏览器解析DOM时,会同时下载资源。 当浏览器到达此行时
var zSelection=myGetSelectedText()此时它看不到窗口对象上定义的
myGetSelectedText
,因此抛出错误。 您要做的是将HTML中的脚本/代码包装到
DOMContentLoaded
事件中,并在页面加载完成后调用它

<script>
  document.addEventListener("DOMContentLoaded", function(event) {
    console.log("DOM fully loaded and parsed");
  });
</script>

document.addEventListener(“DOMContentLoaded”),函数(事件){
log(“DOM已完全加载并解析”);
});

引用:

我猜在被调用的函数中,pDefault是未定义的,因为调用时没有传递变量

因此,这一行:var zSelection=myGetSelectedText()
应为:var zSelection=myGetSelectedText(zDefault)

嗯,,
吉姆

Rikin:谢谢你的及时回复;听起来不错。我试着在HTM脚本行中使用'defer'参数,但要么它不起作用,要么我搞错了。我将寻求如何做你的建议,因为这对我来说是全新的;非常感谢。在我上面的回答中添加了参考代码,您可以将代码封装在其中。另外
注意:defer属性仅适用于外部脚本(仅当src属性存在时才应使用)。
Jim:感谢您的及时。我尝试了你的建议(代码已编辑),但错误再次出现。谢谢你的努力。