Ошибка Java в FireFox - myApplet.myFunction не является функцией - PullRequest
1 голос
/ 08 октября 2009

Я получаю сообщение об ошибке, которое можно воспроизвести только в Firefox.
В IE это всегда работает.

У меня есть приложение ASP.NET, предназначенное для апплета. Для большинства функций это прекрасно работает, но когда я запускаю одну функцию (функцию, которая делает много разных вещей), методы в Java-апплете кажутся недоступными! Когда я вызываю любые функции в java-апплете из кода Javascript, я получаю сообщение об ошибке: myApplet.myFunction не является функцией .

После того, как это произошло, я получаю ту же ошибку для всего, что вызывает функции в апплете, а также для функций, которые работали до этого состояния.

Апплет не выгружен или не аварийно завершен, что подтверждается тем, что интерактивные функции в апплете все еще работают. Но если апплет вызывает функцию javascript на странице, которая вызывает апплет, я получаю ту же ошибку!

Иногда это работает, когда я повторяю действие несколько раз.

Это происходит только в общедоступной версии веб-приложения. Не в моем локальном веб-приложении, которое работает на компьютере разработчика. Основное отличие состоит в том, что общедоступный использует логин.

Может ли кто-нибудь дать мне подсказку о том, что может быть причиной этого?

Подводя итог, что происходит: когда я запускаю определенный фрагмент кода javascript, API для java-апплета становится недоступным (ошибка: myApplet.myFunction не является функцией ).

Вот функция, которая вызывает это ошибочное состояние апплета:

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>.

Апплет находится внутри тега <div>, который скрыт в javascript с style.display='none' и снова показан с style.display='block'. Это делается в течение 2 строк:

  mapFrame.previewVisible()
  mapFrame.mapVisible()

Я не знаю, в этом ли проблема, но эти функции вызываются и в других местах, где это не вызывается, но это может быть сочетание вещей.

Я рад получить подсказку, которая поможет мне решить эту проблему, а не абсолютное решение.

Я приму лучший совет в качестве ответа.

Ответы [ 5 ]

2 голосов
/ 14 октября 2009

Возможно, это проблема времени. Может случиться так, что движок Firefox попытается выполнить код javascript до того, как апплет java будет загружен должным образом. Чтобы убедиться в этом, добавьте задержку перед доступом к апплету в коде JavaScript. Еще лучше использовать блок try-catch для вашего вызова и обернуть его в цикл for. Если вызов успешен, выйдите из цикла, в противном случае добавьте задержку и повторите попытку.

Редактировать: Судя по вашим изменениям, проблема с синхронизацией отсутствует. Так как ваша функция javascript довольно большая, я бы попытался определить, где проблема возникает впервые. Создайте фиктивный метод апплета и вызовите его в своем методе javascript в разных местах. Узнайте, после какого утверждения проблема появляется впервые. Кроме того, если вы еще этого не сделали, установите Firebug и следите за ошибками JavaScript.

1 голос
/ 20 декабря 2009

Я пришел сюда через поиск, поскольку у меня была точно такая же проблема в Firefox (не в MSIE), на веб-страницах, которые, как я знал, не менялся годами и которые, как я знал, раньше хорошо работали в Firefox.

myApplet.myFunction не является функцией

Как выясняется, в моем случае виновником является просто наличие кода JavaScript Переводчика инструментов Google Translate, описанного на

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

После того, как я удалил этот фрагмент из моего включенного файла Javascript (включенного в нижней части моей страницы апплета), myApplet.myFunction снова заработал нормально!

Также исправлена ​​таинственная проблема, которая не всегда загружалась моим апплетом при загрузке веб-страницы. Может быть, Google Translate Tools под капотом также возится с style.display или подобным, но я не стал больше углубляться в это.

Я подозреваю, что на многих других, кто использует Google Translate Tools на странице апплета Java с элементами управления Javascript, также влияют.

1 голос
/ 15 октября 2009

Мне неожиданно удалось воспроизвести его в моей среде разработки, поэтому было легче обнаружить проблему. Проблема была связана с сокрытием / показом, как я и подозревал, но я все еще не уверен, почему это было проблемой. Вероятно, это были какие-то проблемы со сроками, отмеченные kgiannakakis , так что он получит награду за вознаграждение.

Проблема исчезла при комментировании этих двух строк:

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

Комментарий в конце - это в основном то, что делается внутри этих функций с помощью div, который содержит апплет.


Пока все хорошо.

Назначение с функциями Visible изначально заключается в переключении 2 вкладок, на одной из которых отображается апплет (mapVisible), а на другой - статическое изображение (previewVisible). Если я нажму на вкладку предварительного просмотра, которая в основном запускает previewVisible(), appletDiv будет скрыт. Если я затем запустил свою большую неприятную функцию (ParseAndZoomToAddress), то снова получу ошибку, но на этот раз она несколько ожидаема, поскольку апплет скрыт (и, очевидно, FireFox не любит работать со скрытыми апплетами ..).

Тогда я помню, почему я включил эти вызовы в функцию ParseAndZoomToAddress: я должен убедиться, что апплет видим, прежде чем получить к нему доступ! Поэтому я пытаюсь повторно ввести вызов на mapFrame.mapVisible(), и угадайте, что - это работает! Даже если апплет был скрыт, он доступен после вызова mapFrame.mapVisible().


У кого-нибудь есть заключение?

Моя теория состоит в том, что это вызывает проблемы для выгрузки и перезагрузки апплета так близко друг к другу в одной и той же функции javascript.

0 голосов
/ 01 апреля 2011

У меня была похожая проблема.

Мы исправили это, поместив <applet></applet> в <div>, который не имеет стиля display:none.

JavaScript в Firefox не может видеть функции в апплете, который находится внутри div, который не отображается.

0 голосов
/ 14 октября 2009

Эта запись , похоже, имеет аналогичную проблему. Они утверждают, что исправили некоторую синтаксическую ошибку HTML, а затем это сработало в Firefox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...