Строковые операции в JavaScript гаджета Vista / W7 - PullRequest
1 голос
/ 08 августа 2010

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

  function format_lmd(lmd)
  {
  // Parse something like "Sun Aug 26 17:13:22 UTC+0200"
  var lmdFields = lmd.split(' ');
  //weekday  = lmdFields[0];
  //month    = lmdFields[1];
  //monthday = lmdFields[2];
  //moment   = lmdFields[3];
  //return monthday+' '+month+' '+moment;
  return lmd;
  }

  function  paintGadget()
  {   
  var fileitem = System.Shell.itemFromPath("c:\\myfile.txt");
  //canvas.addTextObject('   '+fileitem.modifyDate, 'Segoe UI', 9, 'white', text_offset, 21);
  var result = null;
  result = '   ';
  result += format_lmd(fileitem.modifyDate);
  canvas.addTextObject(result, 'Segoe UI', 9, 'white', text_offset, 21);
  }

Вызов split (в функции format_lmd), кажется, останавливает сценарий (или, что лучше, создает исключение). Хотя в документации, похоже, указано, что функция разделения может использоваться для разделения строки на несколько частей, в моем случае это не работает.

Вопросы:

  • Как правильно использовать метод разбиения?
  • Я раньше не использовал Javascript, поэтому, когда объявлять переменную с помощью «var», а когда нет, остается для меня загадкой. Есть ли хорошее введение в Javascript, который можно использовать для гаджетов?
  • Как лучше всего отладить гаджет?

Спасибо, Patrick

РЕДАКТИРОВАТЬ: Я узнал, как включить отладчик для Javascript (см. http://msdn.microsoft.com/en-us/library/bb456467%28v=VS.85%29.aspx#_sidebar_overview_debugging_basic). Теперь появляется окно отладки с сообщением «Ожидается объект», но это действительно не помогает мне .

Ответы [ 2 ]

1 голос
/ 21 августа 2010

Это одна из основных проблем, связанных с API-интерфейсом гаджетов рабочего стола Windows и пространством имен System.Shell .Некоторые из команд возвращают типы, которые изначально не обрабатываются JScript.К счастью, это не один из тех времен, но проблема похожа.Я доберусь до ответа, но сначала немного поболтать.

Вы заметили, что при проверке typeof lmd в функции, "дата" - это результат.Что странного в этом то, что нет собственного типа даты JScript / ECMAScript - typeof new Date() приведет к «объекту».Причина этого заключается в том, что многие методы System.Shell. * Сопоставляются с эквивалентными методами .net, и результат просто возвращается в JScript без каких-либо усилий по преобразованию данных в собственный тип JScript.Очень недальновидная реализация Microsoft.

При выводе lmd в отладчик вы увидите строковый результат, что-то вроде:

Ср 25 ноября11:06:30 UTC 2009

Это потому, что функция, которая ожидает строку, преобразует не строковый аргумент в строку. System.Debug.outputString () здесь не исключение.Понимая это, решение становится понятным - принудительное преобразование типа из «даты» в строку:

var lmdFields = String(lmd.split(' '));
// or
var lmdFields = (lmd+"").split(' ');

//-> ["Wed","Nov","25","11:06:30","UTC","2009"]

Если вы хотите преобразовать дату в объект JavaScript Date , вы можетепросто передайте его конструктору Date () :

var lmdFields = new Date(lmd);
System.Debug.outputString(lmdFields.toLocaleString());
//-> "25 November 2009 11:06:30"
0 голосов
/ 09 августа 2010

Если это дата, то, возможно, это поможет (не проверено, но руководство) ...

  function format_lmd(lmd)
  {
    month = lmd.getMonth()+1; // returns numeric value
    monthday = lmd.getDay(); // 0 for Sunday, 1 for Monday, 2 for Tuesday, and so on
    // not sure what you mean for 'moment'?
    return monthday+' '+month+' '+moment;
  }

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

Ссылка: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date#Methods

...