innerHTML удаляет кавычки атрибута в Internet Explorer

В зависимости от сценария и его использования самое лучшее (с точки зрения времени загрузки и рендеринга страницы) может быть для не использования стандартного < script> - отмечают по сути, но динамично инициировать загрузку сценария асинхронно.

существуют некоторые различные методы, но самое прямое должно использовать document.createElement ("сценарий"), когда window.onload событие инициировано. Тогда сценарий загружается сначала, когда сама страница представила, таким образом не влияя на время, пользователь должен ожидать страницы для появления.

Это естественно требует, чтобы сам сценарий был не нужен для рендеринга страницы.

Для получения дополнительной информации, см. сообщение Связывающиеся асинхронные сценарии Steve Souders (создатель YSlow, но теперь в Google).

13
задан Augustus 5 August 2009 в 07:59
поделиться

5 ответов

IE innerHTML действительно очень раздражает. Я написал для него эту функцию, что может быть полезно? Он заключает атрибуты в кавычки и устанавливает тэги в нижний регистр. Между прочим, что еще больше раздражает, IE innerHTML не удаляет кавычки из нестандартных атрибутов.

Редактировать на основе комментариев Функция теперь обрабатывает больше символов в значениях атрибутов и, при необходимости, преобразует значения атрибутов в нижний регистр. Теперь функция выглядит еще более некрасиво; ~). Если вы хотите добавить или удалить символы в уравнение, отредактируйте [a-zA-Z \. \: \ [\] _ \ (\) \ & \ $ \% # \ @ \! 0-9 ] + [? \ s + |?>] часть регулярных выражений.

function ieInnerHTML(obj, convertToLowerCase) {
    var zz = obj.innerHTML ? String(obj.innerHTML) : obj
       ,z  = zz.match(/(<.+[^>])/g);    

    if (z) {
     for ( var i=0;i<z.length;(i=i+1) ){
      var y
         ,zSaved = z[i]
         ,attrRE = /\=[a-zA-Z\.\:\[\]_\(\)\&\$\%#\@\!0-9\/]+[?\s+|?>]/g
      ;

      z[i] = z[i]
              .replace(/([<|<\/].+?\w+).+[^>]/,
                 function(a){return a.toLowerCase();
               });
      y = z[i].match(attrRE);

      if (y){
        var j   = 0
           ,len = y.length
        while(j<len){
          var replaceRE = 
               /(\=)([a-zA-Z\.\:\[\]_\(\)\&\$\%#\@\!0-9\/]+)?([\s+|?>])/g
             ,replacer  = function(){
                  var args = Array.prototype.slice.call(arguments);
                  return '="'+(convertToLowerCase 
                          ? args[2].toLowerCase() 
                          : args[2])+'"'+args[3];
                };
          z[i] = z[i].replace(y[j],y[j].replace(replaceRE,replacer));
          j+=1;
        }
       }
       zz = zz.replace(zSaved,z[i]);
     }
   }
  return zz;
}

Примеры пар ключ-значение, которые должны работать

data-mydata=return[somevalue] => data-mydata="return[somevalue]"
id=DEBUGGED:true => id="DEBUGGED:true" (or id="debugged:true" if you use the convertToLowerCase parameter)
someAttribute=Any.Thing.Goes => someAttribute="Any.Thing.Goes"
17
ответ дан 1 December 2019 в 22:08
поделиться

Ах, радость от попытки использовать XHTML в браузере, который его не поддерживает.

Я просто согласен с тем, что вы собираетесь получить HTML обратно из браузера и поместить что-то перед вашим процессором XML, которое может вводить суп тегов и выводить XHTML - например, HTML Tidy .

5
ответ дан 1 December 2019 в 22:08
поделиться

Я столкнулся с той же самой проблемой чуть больше года назад и решил ее с помощью InnerXHTML , специального сценария, написанного кем-то намного умнее меня. По сути, это пользовательская версия innerHTML, которая возвращает стандартную разметку.

3
ответ дан 1 December 2019 в 22:08
поделиться

вы пробовали использовать jquery?

alert($('#div1').html());
-6
ответ дан 1 December 2019 в 22:08
поделиться

Я тестировал это, и он работает для большинства атрибутов, кроме тех, которые разделены дефисом, например class = day-month-title. Он игнорирует эти атрибуты и не цитирует их.

2
ответ дан 1 December 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: