IE8 / JavaScript: переопределить собственную реализацию document.all.item? - PullRequest
1 голос
/ 09 июня 2011

Я знаю, что это безумие, но IE может заставить человека делать сумасшедшие вещи.

Вот в чем дело: у нас есть сайт SharePoint 2007 с веб-частями редактора контента. У нас есть контингент пользователей с Internet Explorer 8. Мы хотим сохранить сайт в режимах стандартов IE8 / IE8 для лучшей визуализации контента. Однако эта конфигурация лишает возможности открывать окно Rich Text Editor из веб-части C.E.

Если принудительно включить IE8 в режим документов IE7 или режим причуд, это работает. Действительно, другие источники в Интернете предложили сделать именно это, чтобы решить проблему. Но мы бы предпочли, чтобы все работало в стандартном режиме.

В результате некоторой отладки мы обнаружили, что источником проблемы является использование document.all.index("<web_part_id>") JavaScript при извлечении объекта веб-части на странице. В стандартах IE8 это возвращает объект с большинством свойств: пустым, нулевым или неопределенным; в частности, свойство id не установлено. Если вы должны использовать document.getElementById для получения того же идентификатора, вы получите полностью заполненный объект. Аналогично, если IE8 равен , а не в стандартном режиме, вы получаете в основном (но не полностью) заполненный объект - но достаточно заполненный, чтобы избежать ошибки скрипта.

Весь этот код выглядит так, как будто он динамически внедряется в страницу SharePoint, поэтому исключается простая замена ссылок на document.all. Однако у нас появилась сумасшедшая идея переопределить метод document.all.item для фактического вызова document.getElementById. Наши попытки сделать это пока не работают, поэтому, возможно, кто-то может пролить свет на то, что мы делаем неправильно (хорошо, в этом много неправильного, но это IE и SharePoint, верно?).

Наша первоначальная попытка переопределения выглядит следующим образом:

<script type="text/javascript">
    document.all.item = function(id) { return document.getElementById(id); }
</script>

Этот код находится в документе HEAD, выше любых других ссылок на сценарии (SharePoint или иным образом), но он не заменяет собственный код.

Мысли, идеи, предложения и критика приветствуются!

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

document.all - это HTMLCollection , поэтому вы можете использовать HTMLCollection.prototype для изменения поведения:

if(document.all 
   && !window.opera 
    && typeof HTMLDocument=='object' 
     && typeof HTMLCollection=='object')//filter IE8
{
  HTMLCollection.prototype.item=
  function(id)
  {
   return((this==document.all)
           ? document.getElementById(id)//document.all
           : this[id]//maintain native behaviour for other collections
         ); 
  }
}
0 голосов
/ 09 июня 2011

То есть вы говорите, что не можете изменить ссылки на document.all.item, потому что SP напрямую вставляет их в html? Так не могли бы вы использовать DOM, чтобы заменить его?

Кстати, я чувствую твою боль в SharePoint. Я построил рабочие процессы SP, и мне этого достаточно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...