0

我不是一个经验丰富的 javascript 程序员,所以提前为这可能是一个非常简单的问题道歉。在以下代码中,我调用 akpOpen 函数打开 2 个弹出窗口(IE10),比较表格单元格的内容并通过更改背景颜色突出显示差异。

<script language="javascript">
var nw;
var ow;
function genericOpen(k,n,w,h,t,l) {
 var w = window.open(k, n,
             'width=' + w + ',height=' + h + ',resizable=yes,menubar=0' +
             ',top=' + t + ',left=' + l + ',location=0,toolbar=0' +
             ',scrollbars=1');
 return(w);
}
function checkValues() {
   for (r = 0; r<999; r++) {
      var id = 'r' + r + 'c1';
      if (ow.document.getElementById(id).innerText !=
          nw.document.getElementById(id).innerText) {
          nw.document.getElementById(id).bgColor = 'red';
          ow.document.getElementById(id).bgColor = 'red';
      }
   }
}
function akpOpen(nkey,okey) {
 nw = genericOpen('CNCM0012?KEY=' + nkey, 'w1', 500, 150, 100,80);
 ow = genericOpen('CNCM0012?KEY=' + okey, 'w2', 500, 150, 100,600);
 checkValues();
}
</script>

如果我将页面作为硬盘驱动器中的静态内容加载,则代码可以正常工作。如果我从服务器加载涉及数据库查询和动态内容的页面,则会收到以下错误: SCRIPT5007:无法获取未定义或空引用的属性“innerText” 如果我使用 F12 调试动态页面,则代码运行良好。

如果我允许调试器拦截错误并查看局部变量,我可以看到“nw”和“ow”窗口句柄全局变量以及它们的关联元素,并且可以找到 getElementById 引用的元素。这似乎是一个时间问题,但我在这方面没有经验。任何帮助,将不胜感激。

谢谢

4

1 回答 1

1

您正试图在窗口有机会加载之前访问您正在动​​态打开的窗口的内容。您需要轮询或等待窗口load事​​件发生。

使用该load事件是微不足道的。如果您想进行轮询,最简单的方法是将具有特定id值的元素放在您生成的响应的末尾,然后:

function checkValues() {
   if (!ow.document.getElementById("marker") ||
       !nw.document.getElementById("marker")) {
       // One or the other is still loading, wait
       setTimeout(checkValues, 100); // Milliseconds
   }
   else {
      for (r = 0; r<999; r++) {
         var id = 'r' + r + 'c1';
         // You might also want to put a guard here in case some of these 'r' elements don't exist
         if (ow.document.getElementById(id).innerText !=
             nw.document.getElementById(id).innerText) {
             nw.document.getElementById(id).bgColor = 'red';
             ow.document.getElementById(id).bgColor = 'red';
         }
      }
   }
}
于 2013-10-16T08:15:15.873 回答