我收到的错误只能在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()
我不知道这是不是问题,但这些功能在其他地方也被调用,但不会引起这种情况,但它可能是事物的组合。
我会接受最好的提示作为答案。
答案 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中看到函数。