Javascript TypeError:无法读取属性';getElementById';框架集

Javascript TypeError:无法读取属性';getElementById';框架集,javascript,frame,getelementbyid,frameset,Javascript,Frame,Getelementbyid,Frameset,我有一个简单的代码,每次有新版本时都会刷新主页,但它只在Internet Explorer中工作。在其他浏览器中,我遇到以下错误: Uncaught TypeError: Cannot read property 'getElementById' of undefined line 24 这是我的密码: <html> <script type="text/javascript"> var num=0; var currVersion

我有一个简单的代码,每次有新版本时都会刷新主页,但它只在Internet Explorer中工作。在其他浏览器中,我遇到以下错误:

Uncaught TypeError: Cannot read property 'getElementById' of undefined line 24
这是我的密码:

    <html>

    <script type="text/javascript">
     var num=0;
     var currVersion;
     var started=false;

     function startLoad() {
     var url= "version_telemark.html?"+ (++num);
        window.version.navigate(url);
     }

     function endLoad() {
       if (started) {
         var newVersion = version.document.getElementById("version").value;
         if (newVersion != currVersion) {
           currVersion=newVersion;
           var url  = "telemark.html?"+ (++num);
             window.pane.navigate(url);
         }
       }
     }
     function start() {
        currVersion = version.document.getElementById("version").value;
       started=true;
       setInterval("startLoad()", 200);
     }
    </script>

  <frameset    onload="start()"  cols="40%,100%">
    <frame id="version"   src="version_telemark.html"/>
    <frame id="pane" src="telemark.html" />
  </frameset>

</html>

var num=0;
var版本;
var=false;
函数startLoad(){
var url=“version_telemark.html?”+(++num);
window.version.navigate(url);
}
函数endLoad(){
如果(启动){
var newVersion=version.document.getElementById(“version”).value;
如果(新版本!=当前版本){
当前版本=新版本;
var url=“telemark.html?”+(++num);
window.pane.navigate(url);
}
}
}
函数start(){
currVersion=version.document.getElementById(“版本”).value;
开始=真;
setInterval(“startLoad()”,200);
}
在我的其他文件中,我只有我想要编辑的文件,我有:

<input id="version" name="version" type="textbox" value="700">

我的另一个设计文件只有表格,但我们不需要在那里添加任何内容。

两件事:

  • 您的代码依赖于浏览器为具有
    id
    s的元素创建的自动全局变量,即使用
    version
    作为全局变量,而不声明或初始化它。也许出于某种原因,automatic global在IE以外的浏览器上不起作用。我不喜欢依赖它们,因为它太容易对它们进行阴影处理,因此我建议在脚本顶部附近添加以下内容,以便有意获取元素:

    var version = document.getElementById("version");
    
    但你对这个问题的评论表明,不是这个问题,而是以下第2点:

  • currVersion=version.document.getElementById(“version”).value中,可能需要
    vesrion.contentDocument
    而不是
    version.document
    和类似行;也许JavaScript的强大的
    |
    操作符有点奇怪:

    var versionDoc = version.document || version.contentDocument;
    // ...and then
    currVersion = versionDoc.getElementById("version").value;
    // ...and so on
    


  • 旁注:为了让你自己和任何人在你清醒后维护代码,我还建议对
    版本
    框架
    版本
    输入
    使用不同的
    id
    值,
    frameset
    不再是HTML规范的一部分。在打开开发者工具控制台的情况下运行应用程序时,您是否看到任何其他错误?(出于安全原因,可能会阻止您访问框架文档。)在chrome上,它会向我发送以下错误:Uncaught TypeError:无法读取undefinedWell的“getElementById”属性,您收到的错误意味着
    version.document
    不存在。之后,它向我显示了一个新错误:未捕获的安全性错误:未能从“HTMLFrameElement”读取“contentDocument”属性:阻止原点为“null”的帧访问原点为“null”的帧。协议、域和端口必须匹配。@HenriqueAlves:这意味着您使用的是本地文件,而不是web服务器提供的文件(在地址栏中,URL以
    文件开始://
    )。一些浏览器,如Chrome,对本地资源应用同一来源策略,并强制执行该策略,就好像所有本地资源都来自不同的来源一样(因此不允许访问)。如果从web服务器加载它(例如,出于开发目的,
    localhost
    ),则源代码将匹配,而不会发生这种情况。最好是通过web服务器测试web内容,而不是使用
    文件://
    URL。我对这一切感觉很糟糕,但现在它说了另一个错误:未捕获类型错误:无法读取未定义的联机属性“导航”10@HenriqueAlves:您可能需要
    contentWindow
    来获取该位:
    window.pane.contentWindow.navigate(url)
    @HenriqueAlves:嗯,就像
    版本
    一样,该代码依赖于自动全局搜索。我也会将它切换到
    getElementById
    。除了在浏览器中内置调试器、在代码运行时检查对象等等,什么都没有。祝你好运,