FireFox中的Java错误 - myApplet.myFunction不是函数

时间:2009-10-08 10:04:26

标签: java asp.net firefox

我收到的错误只能在Firefox中重现。
在IE中,它始终有效。

我有一个针对applet的ASP.NET应用程序。对于大多数功能,它工作得很好,但是当我运行一个函数(一个执行很多不同功能的函数)时,java applet上的方法似乎不可用!当我从Javascript代码调用java applet上的任何函数时,我收到错误: myApplet.myFunction不是函数

发生这种情况后,我在applet上调用函数的所有内容都会出现同样的错误,也就是在此状态之前有效的函数。

applet没有被卸载或崩溃,这可以通过applet中的交互功能仍然有效来证明。但是如果applet在回调applet的页面上调用javascript函数,我会得到同样的错误!

有时候,当我多次重复动作时它会起作用。

这只发生在Web应用程序的公共版本上。不在我在开发机器上运行的本地Web应用程序中。主要区别在于公共用户使用登录访问权限。

任何人都可以向我暗示可能导致这种情况的原因吗?

总结一下:当我运行特定的javascript代码时,针对java applet的API变得无法使用(错误: myApplet.myFunction不是函数)。

这是导致applet这种错误状态的函数:

function ParseAndZoomToAddress (objString) {
 var mapFrame

 eval("var objArray = new Array(" + objString + ")")
 if (objArray.length > 0) {
  mapFrame = window.frames[0].frames['mapFrame']
  if(!mapFrame) alert('mapFrame is null!')
  else window.status = 'mapFrame is OK!'
  var center_x = 0
  var center_y = 0
  if(objArray.length == 1) {
   var rExp1 = /[G-P]/g
   var rExp2 = /[Q-Z]/g
   eval("var coordArray = new Array(" + objArray[0].replace(rExp1, '0x').replace(rExp2, ',0x') + ")")
   if(coordArray.length == 2){
    center_x = coordArray[0]
    center_y = coordArray[1]
   }else{
    alert("Invalid ID " + objArray[0])
   }
  }else{
   var center_x = objArray[1]
   var center_y = objArray[2]
  }
  var objZoomScale = '2000' // document.SearchForm.Scale.value
  var scale = mapFrame.m_yur - mapFrame.m_yll
  if (objZoomScale != "") {
   scale = ScaleToMeter(parseInt(objZoomScale),mapFrame.m_image_width)
  }
  var xll = center_x - (scale / 2.0)
  var yll = center_y - 10
  var xur = xll + scale
  var yur = center_y + 10
  center_x = (xll + xur) / 2.0
  center_y = (yll + yur) / 2.0
  center_x = Math.round(center_x * 1000) / 1000
  center_y = Math.round(center_y * 1000) / 1000
  mapFrame.ResetClipPolygon() //This calls applet methods
  var lCenterSymbol = '5024,40,85,x,y,5'
  var rExp = /x/gi
  lCenterSymbol = lCenterSymbol.replace(rExp,center_x)
  rExp = /y/gi
  lCenterSymbol = lCenterSymbol.replace(rExp,center_y)
  mapFrame.parent.m_CenterSymbolString = lCenterSymbol
  mapFrame.ResetClipPolygon() //This calls applet methods
  mapFrame.previewVisible()
  mapFrame.mapVisible()
  mapFrame.setMove(false) //This calls applet methods
  mapFrame.ZoomToArea(xll, yll, xur, yur) //This calls applet methods
  mapFrame.parent.m_CenterSymbolString = ""
 }
}

另外我可以说applet是由<applet>标签定义的。

小程序位于<div>标记内,该标记隐藏在带有style.display='none'的javascript中,并再次显示为style.display='block'。 这是在两行中完成的:

  mapFrame.previewVisible()
  mapFrame.mapVisible()

我不知道这是不是问题,但这些功能在其他地方也被调用,但不会引起这种情况,但它可能是事物的组合。

我很高兴得到提示,这将有助于我解决这个问题,而不是绝对的解决方案。

我会接受最好的提示作为答案。

5 个答案:

答案 0 :(得分:2)

也许这是一个时间问题。可能会发生Firefox引擎在正确加载Java applet之前尝试执行javascript代码。要验证这一点,请在访问javascript代码中的applet之前添加延迟。更好的是使用try-catch块进行调用并将其包装在for循环中。如果调用成功退出循环,否则添加延迟并重试。

修改:根据您的修改,似乎没有时间问题。由于您的javascript函数非常大,我会尝试找到问题首次出现的位置。创建一个虚拟applet方法,并在各种地方的javascript方法中调用它。找出问题首次出现的语句。此外,如果您还没有这样做,请安装Firebug并注意javascript错误。

答案 1 :(得分:1)

我突然能够在我的开发环境中重现它,因此更容易找到问题所在。问题与我怀疑的隐藏/显示有关,但我仍然不确定为什么这是一个问题。这可能是kgiannakakis所指出的某种时间问题,因此会将其归功于赏金奖励。

在评论这两行时,问题就消失了:

mapFrame.previewVisible(); // appletDiv.style.display="none"
mapFrame.mapVisible();     // appletDiv.style.display="block"

结尾处的注释基本上是使用包含applet的div在这些函数中完成的。


到目前为止,这么好。

Visible函数的意图最初是切换2个选项卡,其中一个显示applet(mapVisible),另一个显示静态图像(previewVisible)。如果我单击预览选项卡,它基本上运行previewVisible(),则隐藏appletDiv。如果我然后运行我的大讨厌函数(ParseAndZoomToAddress)然后我再次得到错误,但这次有点预期,因为applet是隐藏的(显然FireFox不喜欢使用隐藏的applet ..)

然后我记得为什么我在ParseAndZoomToAddress函数中包含了这些调用:我必须确保applet在访问之前是可见的!所以我尝试重新调用mapFrame.mapVisible()的调用,并猜测它是什么 - 它有效!即使applet被隐藏,也可以在调用mapFrame.mapVisible()之后使用。


有人对此有所了解吗?

我的理论是,它会导致在同一个javascript函数中卸载和重新加载applet的问题。

答案 2 :(得分:1)

我是通过搜索来到这里的,因为我在Firefox(而不是MSIE)上遇到了完全相同的问题,在我知道我多年没有改变的网页上,我知道之前在Firefox中工作得很好。

  

myApplet.myFunction不是函数

事实证明,在我的案例中,罪魁祸首只是在

中描述了Google Translate Tools Javascript代码

http://translate.google.com/translate_tools?hl=en&layout=1&eotf=1&sl=bg&tl=en

从我收录的Javascript文件(包含在我的applet页面底部)中删除了该片段后,myApplet.myFunction再次正常运行!

它还修复了加载网页时我的applet不会总是加载的神秘问题。也许引擎盖下的谷歌翻译工具也可以摆弄 style.display 或类似的东西,但我没有进一步深入研究。

我怀疑许多其他人在使用Javascript控件的Java小程序页面上使用谷歌翻译工具同样受到影响。

答案 3 :(得分:0)

post似乎有类似的问题。他们声称他们修复了一些HTML语法错误,然后它在Firefox中工作。

答案 4 :(得分:0)

我遇到了类似的问题。

我们通过将<applet></applet>放在没有<div>样式的display:none内来修复它。

Firefox中的JavaScript无法在未显示的div内的applet中看到函数。