Пространство имен Javascript и проблема с IE7

Я применил решение для определения имен Javascript на основе этого ответа на другой вопрос: Как объявить пространство имен в JavaScript?

Позвольте называть это isigma-ns.js:

var ISIGMA = {
  messages: {
    noValidId: "No valid ID found",
    reason: "Reason",
    // etc...
  },

  language: "ca",
  SIGN: 2,
  PAUSE: 400,
  params: {},

  init: function(params) {
    // etc...
  },

  delay: function(callback) {
    // etc...
  },

  // etc...

  signURL: function(cert, url) {
    // etc... 
  }
};

Я включаю этот script на мою страницу, а также другие вещи:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

<head>
    <title>Isigma Signature Widget</title>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>

    <!-- Required javascript and styles for isigma widget-->
    <script type="text/javascript" src="/isme/media/signwidget/jquery-1.4.4.min.js"></script>
    <script type="text/javascript" src="/isme/media/signwidget/isigma-ns.js"></script>
    <script type="text/javascript">
    $(function(){
        $("#applet").isigmaSignatureApplet({
            purpose: ISIGMA.SIGN,
            url: the_url,
            language: 'es'
        });
    });                                       
    </script>

... и т.д...

Он отлично работает в Firefox, IE8, Chrome, Opera... но не работает в IE7 с сообщением "ISIGMA не определено" - ссылаясь на строку, где я делаю ссылку на ISIGMA.SIGN.

Любые намеки на то, что здесь может быть неправильным? Что-то не так с порядком обработки IE7 файлов Javascript? Любое другое предположение?


Примечание: для полной ссылки все работает в http://app.portasigma.com/isme/signwidget/iframe/, а JS файл пространства имен действительно называется http://app.portasigma.com/isme/media/signwidget/jquery-isigmaWidget.js

Ответ 1

Это запятая после "Причина". Смотрите: http://jsbin.com/upiba5/2/edit Изменить: на вашем живом сайте дополнительная запятая, которую я вижу, следующая:

documentLockedByAnother: "Это документ в настоящее время заблокирован другой пользователь, повторите попытку позже",

  var ISIGMA = {
  messages: {
    noValidId: "No valid ID found",
    reason: "Reason"
    // etc...
  },

  language: "ca",
  SIGN: 2,
  PAUSE: 400,
  params: {},

  init: function(params) {
    // etc...
  },

  delay: function(callback) {
    // etc...
  },

  // etc...

  signURL: function(cert, url) {
    // etc... 
  }
};

Ответ 2

Вам нужно удалить последнюю запятую после всех свойств/методов, которые вы определили.

более старые версии IE зашумели на этом.

var ISIGMA = {
  messages: {
    noValidId: "No valid ID found",
    reason: "Reason",
    // etc...
  },

  language: "ca",
  SIGN: 2,
  PAUSE: 400,
  params: {},

  init: function(params) {
    // etc...
  },

  delay: function(callback) {
    // etc...
  },<====-- if this is the LAST property/method, you need to omit the comma.

  // etc...
};

Обновление: может возникнуть другая потенциальная проблема из тегов

<script src="..."/><!--prone to parsing bugs/errors-->

против.

<script src="..."></script><!--correct-->

Ответ 3

У вас есть загрузка двух внешних скриптов, а затем сразу запускается встроенный script. Скрипты могут загружаться асинхронно или даже вообще не загружаться. Браузеры могут выполнять одну задачу и полностью загружать один script, прежде чем переходить к следующему script, и для них можно запускать несколько одновременных запросов, и они могут дождаться завершения всех внешних запросов до продолжение синтаксического анализа встроенных скриптов; но у вас мало (если есть) контроль над тем из тех опций, которые любой конкретный браузер решает реализовать. У меня нет IE7, поэтому я не могу поэкспериментировать, чтобы увидеть, отличается ли его действие от IE8. Вы должны убедиться, что второй script полностью загружен перед запуском встроенного script.