AngularJS работает с контекстом jsdom без каких-либо трюков. Просто добавьте angular.js в список js src и главную страницу углового приложения к jsdom по его инициализации.
Итак, рендеринг очень прост: используйте угловое значение в jsdom, и оно работает.
Один из способов - изменение пакетной синхронизации DOM.
Чтобы получать динамические обновления от сервера к клиенту, вы можете использовать MutationEvents (к сожалению, jsdom does't поддержка MutationObservers, но MutationEvents работают довольно быстро). Используйте их, чтобы складывать изменения DOM в массиве накопителей и периодически нажимать их на клиентский браузер (скажем, за 25 мс).
Также, чтобы включить пользовательские события, вы должны отслеживать их по документам в браузере и схожих накопителях и нажмите их на сервер.
Одной из реализаций такого подхода является jsdom-sync ( https://www.npmjs.org/package/jsdom-sync )
Недостатком рендеринга на стороне сервера является отсутствие размера модели окна DOM, поскольку для получения ширины / высоты элемента он должен быть фактически отображен. Это решение вряд ли подходит для svg и т. Д.
Также вы можете рассмотреть возможность просмотра модели области и синхронизацию ее с областями на стороне браузера, но это совершенно другая история.
Вы не можете создавать объект даты любым способом. Это должно быть определенным образом. Вот несколько правильных примеров:
new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)
или
d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)
Chrome должен быть более гибким.
Источник: https: // developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Из apsillers комментарий:
спецификация EMCAScript требует ровно одного формата даты (т. е. YYYY-MM-DDTHH: mm: ss.sssZ), но пользовательские форматы дат могут свободно поддерживаться реализацией : " Если String не соответствует этому [ECMAScript-определенному] формату, функция может вернуться к любой эвристике, специфичной для конкретной реализации, или к форматам дат конкретной реализации. «Chrome и FF просто имеют разные« специфичные для реализации » форматов даты. "
Это работает и в большинстве браузеров
new Date('2001/01/31 12:00:00')
. Это формат
"yyyy/MM/dd HH:mm:ss"
Одна ситуация, с которой я столкнулся, заключалась в работе с миллисекундами. FF и IE не будут корректно анализировать эту строку даты при попытке создать новую дату. "2014/11/24 17:38:20.177Z"
Они не знают, как обращаться с .177Z
. Chrome будет работать.
Простое решение. Это работает со всеми браузерами,
var StringDate = "24-11-2017"
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);
На самом деле Chrome более гибкий, чтобы иметь дело с различными строковыми форматами. Даже если вы не знаете его формат String, Chrome по-прежнему может успешно преобразовывать String в Date без ошибок. Например:
var outputDate = new Date(Date.parse(inputString));
Но для Firefox и Safari все становится более сложным. Фактически, в документе Firefox он уже говорит: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )
Строка, представляющая дату RFC2822 или ISO 8601 (могут использоваться другие форматы, но результаты могут быть неожиданными).
Итак, когда вы хотите использовать Date. проанализируйте в Firefox и Safari, вы должны быть осторожны. Для меня я использую метод трюков, чтобы справиться с этим. (Примечание: это может быть не всегда правильно для всех случаев)
if (input.indexOf("UTC") != -1) { var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z"; date = new Date(Date.parse(tempInput)); }
Здесь он конвертирует 2013-08-08 11:52:18 UTC в 2013-08-08T11: 52: 18Z сначала, и то его формат является подходящим словом в документе Firefox. На данный момент Date.parse всегда будет в любом браузере.
Я использовал следующий формат даты, и он работает во всех браузерах.
var target_date = new Date("Jul 17, 2015 16:55:22").getTime();
var days, hours, minutes, seconds;
var countdown = document.getElementById("countdown");
remaining = setInterval(function () {
var current_date = new Date().getTime();
var seconds_left = (target_date - current_date) / 1000;
days = parseInt(seconds_left / 86400);
seconds_left = seconds_left % 86400;
hours = parseInt(seconds_left / 3600);
seconds_left = seconds_left % 3600;
minutes = parseInt(seconds_left / 60);
seconds = parseInt(seconds_left % 60);
countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
+ minutes + " minute, " + seconds + " second.</b>";
}, 1000);
В Firefox любая недопустимая дата возвращается как объект Date как Date 1899-11-29T19:00:00.000Z
, поэтому проверьте, является ли браузер Firefox, а затем получает объект Date строки "1899-11-29T19:00:00.000Z".getDate()
. Наконец сравните его с датой.
Предположим, что ваш timestring имеет формат, который выглядит так:
'2016-03-10 16:00:00.0'
В этом случае вы можете сделать простое регулярное выражение, чтобы преобразовать его в ISO 8601
:
'2016-03-10 16:00:00.0'.replace(/ /g,'T')
Это выдаст следующий вывод:
'2016-03-10T16:00:00.0'
Это стандартный формат даты и времени, поддерживаемый всеми браузерами:
document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE
Предположим, что ваш timestring имеет формат, который выглядит следующим образом:
'02-24-2015 09:22:21 PM'
Здесь, вы можете сделать следующее regex:
'02-24-2015 09:22:21 PM'.replace(/-/g,'/');
Это также создает формат, поддерживаемый всеми браузерами:
document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE
Предположим, что у вас есть строка времени, которую нелегко настроить в соответствии с одним из хорошо поддерживаемых стандартов.
В этом случае лучше всего просто разделите свою временную строку на разные части и используйте их как отдельные параметры для Date
:
document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE
Это должно сработать для вас:
var date1 = new Date(year, month, day, hour, minute, seconds);
Мне пришлось создать дату из строки, поэтому я сделал это следующим образом:
var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
Помните, что месяцы в javascript от 0 до 11, поэтому вы должны уменьшить значение месяца на 1, например:
var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
Если вы все еще хотите создать дату с помощью дефиса, вы можете использовать этот формат:
var date = new Date('2013-08-31T17:00:00Z')
Но имейте в виду, что он создает время в соответствии с UTC. Значение, если вы живете в часовой пояс GMT + 3 (3 часа до GMT), добавит это временное смещение к времени. Таким образом, приведенный выше пример будет иметь это значение, если GMT + 3 (обратите внимание, что это час 20:00, а не 17:00):
Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)
Обязательно добавьте букву «Z» в конце , потому что в противном случае Chrome и Firefox будут анализировать строку по-разному (один добавит смещение по времени, а другой не будет).
Это работает во всех браузерах -
new Date ('2001/01/31 12:00:00 AM')
new Date('2001-01-31 12:00:00')
Формат: YYYY-MM-DDTHH: mm: ss.sss
Подробности: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
У меня была аналогичная проблема в Firefox и Safari при работе с AngularJS. Например, если дата, возвращаемая из Angular, выглядит так:
2014-06-02 10:28:00
с помощью этого кода:
new Date('2014-06-02 10:28:00').toISOString();
возвращает недопустимую ошибку даты в Firefox и Safari. Однако в Chrome он отлично работает. Как сказал еще один ответ, Chrome, скорее всего, будет более гибким с синтаксическими строками даты.
Моя конечная цель состояла в том, чтобы отформатировать дату определенным образом. Я нашел отличную библиотеку, которая обрабатывала проблему совместимости с кросс-браузером и проблему форматирования даты. Библиотека называется moment.js .
Используя эту библиотеку, следующий код работает правильно во всех проверенных вами браузерах:
moment('2014-06-02 10:28:00').format('MMM d YY')
Если вы хотите чтобы включить эту дополнительную библиотеку в ваше приложение, вы можете легко построить свою строку даты, избегая при этом проблем с совместимостью с браузером. В качестве бонуса у вас будет хороший способ легко форматировать, добавлять, вычитать и т. Д., Если это необходимо.
YYYY-MM-DDTHH:mm:ss.sssZ
), но пользовательские форматы дат могут свободно поддерживаться реализацией : & quot; ; Если String не соответствует этому [ECMAScript-определенному] формату, функция может вернуться к любой эвристике, специфичной для конкретной реализации, или к форматам дат реализации. i> & quot; Chrome и FF просто имеют разные «форматы дат реализации». – apsillers 15 September 2014 в 15:37