dispatchMessage и ассоциативные массивы - PullRequest
0 голосов
/ 05 декабря 2010

У меня проблема с доставкой вспомогательных массивов во вставленный скрипт.

Global.html

  var settings = new Array();

  settings["accountID"] = safari.extension.settings.getItem("accountID");
  settings["accountName"] = safari.extension.settings.getItem("accountName");
  settings["accountEmail"] = safari.extension.settings.getItem("accountEmail");

            safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("settingsArray", settings);

script.js

 switch (msgEvent.name) {
      case "settingsArray":
           var settings = new Array();
           settings = msgEvent.message;
           console.log("accountID: " + settings["accountID"]);

           break;

Когда я делаю это с "обычными" массивами, он отлично работает!

Но при доставке ассоциативных массивов я всегда получаю " undefined " при вызове, например. Настройки [ "ACCOUNTID"]

Кто-нибудь имеет представление, что не так?

1 Ответ

1 голос
/ 20 июня 2012
  1. Вы используете массивы, когда должны использоваться объекты.

    var settings = new Array();  // Wrong
    var settings = {};           // Right (and better than "new Object()")
    
  2. Вы без необходимости используете строковую форму доступа к свойству.

    settings["accountID"] = …;   // Works, but too much typing
    settings.accountID = …;      // Exact same functionality
    

    Обозначение в скобках необходимо использовать только при получении / установке значений свойства, если имя свойства не является допустимым идентификатором JavaScript (например, foo["holy!*#$! it works"] = true) или если вам нужно создать имя свойства изпеременная (например, foo["account"+n] = "active";).

  3. Вы создаете новые объекты, а затем выбрасываете их.

     var settings = new Array();  // Makes a new array referenced by a variable
     settings = msgEvent.message; // Discards the array and changes the variable
                                  // to reference a new object
    
...