Как я могу сказать, если к объекту прикреплен наблюдатель значения ключа

Я использую следующий метод:

function htmlDecode(input){
  var e = document.createElement('div');
  e.innerHTML = input;
  // handle case of empty input
  return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}

htmlDecode("<img src='myimage.jpg'>"); 
// returns ""

В основном я создаю элемент DOM программно, назначаю кодированный HTML его внутреннемуHTML и извлекаю nodeValue из текстового узла, созданного при вставке innerHTML. Поскольку он просто создает элемент, но не добавляет его, HTML-код сайта не изменяется.

Он будет работать с кросс-браузером (включая более старые браузеры) и принимать все элементы символов HTML .

EDIT: старая версия этого кода не работала на IE с пустыми вводами, о чем свидетельствует здесь, в jsFiddle (просмотр в IE). Версия выше работает со всеми входами.

UPDATE: похоже, что это не работает с большой строкой, а также представляет уязвимость безопасности, см. Комментарии.

141
задан Shoban 17 October 2009 в 15:10
поделиться

3 ответа

Единственный способ сделать это - установить флаг при добавлении наблюдателя.

4
ответ дан 23 November 2019 в 23:08
поделиться

Вся суть паттерна наблюдателя состоит в том, чтобы позволить наблюдаемому классу быть «запечатанным» - не знать или не заботиться о том, наблюдается ли он. Вы явно пытаетесь нарушить этот шаблон.

Почему?

Проблема в том, что вы предполагаете, что за вами наблюдают, хотя это не так. Этот объект не запускал наблюдение. Если вы хотите, чтобы ваш класс контролировал этот процесс, вам следует рассмотреть возможность использования центра уведомлений. Таким образом, ваш класс имеет полный контроль над тем, когда можно наблюдать данные. Следовательно, ему все равно, кто смотрит.

2
ответ дан 23 November 2019 в 23:08
поделиться

Настоящий вопрос в том, почему вы не знаете, наблюдаете вы это или нет.

Если вы делаете это в классе наблюдаемого объекта, остановитесь. Все, что наблюдает, оно ожидает наблюдать за ним. Если вы отключите уведомления наблюдателя без его ведома, ожидайте, что что-то сломается; более конкретно, ожидайте, что состояние наблюдателя станет устаревшим, поскольку он не получает обновлений от ранее наблюдаемого объекта.

Если вы делаете это в классе наблюдаемого объекта, просто запомните, какие объекты вы наблюдаете (или, если вы когда-либо наблюдаете только один объект, независимо от того, наблюдаете ли вы его). Это предполагает, что наблюдение является динамическим и происходит между двумя объектами, не связанными друг с другом; если наблюдатель владеет наблюдаемым, просто добавьте наблюдателя после создания или сохранения наблюдаемого,

37
ответ дан 23 November 2019 в 23:08
поделиться