2010-08-08 2 views
1

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

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); 
    } 

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

Вопросы:

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

Спасибо, Патрик

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

+0

у меня нет Vista/W7, чтобы проверить сейчас, но вы пробовали '.split (/ /)'? – kennytm

+0

Окно отладчика всегда сообщает «Ожидаемый объект». Пробовал использовать ваше предложение, но это не помогает. Спасибо, в любом случае. – Patrick

+0

Что такое 'modifyDate'? Вы уверены, что это строка? Я предполагаю, что значение 'lmd' равно null, переданному в функцию. – jtbandes

ответ

1

Это одна из главных проблем, с Desktop Gadgets Windows API, и 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 Дата объекта, вы можете просто передать его в Дата() конструктор:

var lmdFields = new Date(lmd); 
System.Debug.outputString(lmdFields.toLocaleString()); 
//-> "25 November 2009 11:06:30" 
+1

ДА, вот и все. Извините, я могу только дать вам +1 и принять ваш ответ (я действительно хотел дать вам +100 для этого). Спасибо за ответ. – Patrick

+0

@Patrick: рад помочь :-) –

0

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

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

+0

Я надеялся, что это сработает, но оно по-прежнему дает ошибку «Требуемый объект» на строке «month = lmd.getMonth() + 1;». Может ли Javascript Microsoft быть несовместимым с Javascript Mozzila? – Patrick

+0

Я сомневаюсь. Этот стандартный материал JS. Не имея возможности вникнуть в объект lmd, я не уверен в следующих шагах. – donohoe

Смежные вопросы