2013-04-18 6 views
4

я итерация NodeList получить Сев.Узел данных, но при использовании Node.innerHTML я получаю имена тегов в нижнем регистре.Node.innerHTML имена дает тег в нижнем регистре

Фактические Метки

<Panel><Label>test</Label></Panel> 

давая в

<panel><label>test</label></panel> 

мне нужны эти теги, как это. Можно ли получить его с регулярным выражением? Я использую его с dojo (есть ли какой-нибудь способ в додзё?).

var xhrArgs = { 
      url: "./user/"+Runtime.userName+"/ws/workspace/"+Workbench.getProject()+"/lib/custom/"+(first.type).replace(".","/")+".html", 
      content: {}, 
      sync:true, 
      load: function(data){ 
       var test = domConstruct.toDom(data); 
       dojo.forEach(dojo.query("[id]",test),function(node){ 
        domAttr.remove(node,"id"); 
       }); 
       var childEle = ""; 
       dojo.forEach(test.childNodes,function(node){ 
        if(node.innerHTML){ 
          childEle+=node.innerHTML; 
        } 
       }); 
       command.add(new ModifyCommand(newWidget,{},childEle,context)); 
      } 
    }; 
+0

Что такое «это»? Не можете ли вы использовать флажок * i * (регистр без учета регистра) с вашим выражением? В HTML имя тега не имеет значения. Браузеры обычно представляют имена тегов как все верхние или все нижние регистры, но это всего лишь наблюдение.О, и регулярные выражения не очень хороши для разбора разметки. О, если вы называете это XML, браузеры должны сохранить регистр. – RobG

ответ

0

Это бы меня немного, чтобы понять, что с регулярным выражением, но вы можете использовать это:

var str = '<panel><label>test</label></panel>'; 
    chars = str.split(""); 
    for (var i = 0; i < chars.length; i++) { 
     if (chars[i] === '<' || chars[i] === '/') { 
      chars[i + 1] = chars[i + 1].toUpperCase(); 
     } 
    } 
    str = chars.join(""); 

jsFiddle

Я надеюсь, что это помогает.

0

Если вы пытаетесь просто заглавной первую букву имени тега, вы можете использовать:

var s = 'panel'; 
s.replace(/(^.)(.*)/,function(m, a, b){return a.toUpperCase() + b.toLowerCase()}); // Panel 

В качестве альтернативы вы можете использовать манипуляции со строками (вероятно, более эффективным, чем регулярные выражения):

s.charAt(0).toUpperCase() + s.substring(1).toLowerCase(); // Panel 

Вышеприведенная информация выводит любую входную строку с первым символом в верхнем регистре и всем остальным нижним регистром.

2

Вы можете рассчитывать на .innerHTML, сохраняя при этом точный характер вашего исходного HTML. Фактически, в некоторых браузерах он существенно отличается (хотя и дает одинаковые результаты) с разными котировками, случаем, порядком атрибутов и т. Д.

Намного лучше не полагаться на сохранение корпуса и настроить javascript для решения неопределенного случая.

Конечно, можно использовать регулярное выражение для поиска без учета регистра (флаг «i» обозначает его поиск как нечувствительный к регистру), хотя, как правило, гораздо лучше использовать прямой доступ/поиск DOM, а не внутреннийHTML поиск. Вы должны рассказать нам больше о том, что именно вы пытаетесь сделать, прежде чем мы сможем предложить какой-то код.

+0

Привет jfriend00, я прикрепил свой код, где мне нужны теги, потому что я использую их где-то еще для генерации xml. ModifyCommand нуждается в тексте в качестве детей. так что он будет размещать данные внутри виджета. –

0

это не тщательно тестируется, и очень inefficcient, но он работал довольно быстро в консоли: (также, это JQuery, но он может быть преобразован в чистом JavaScript/DOM легко)

in jsFiddle

function tagString (element) { 
    return $(element). 
      clone(). 
      contents(). 
      remove(). 
      end()[0]. 
      outerHTML. 
      replace(/(^<\s*\w)|(<\/\s*\w(?=\w*\s*>$))/g, 
        function (a) { 
         return a. 
           toUpperCase(); 
        }). 
      split(/(?=<\/\s*\w*\s*>$)/); 
} 

function capContents (element) { 
    return $(element). 
      contents(). 
      map(function() { 
        return this.nodeType === 3 ? $(this).text() : capitalizeHTML(this); 
      }) 
} 

function capitalizeHTML (selector) { 
    var e = $(selector).first(); 
    var wrap = tagString(e); 
    return wrap[0] + capContents(e).toArray().join("") + wrap[1]; 
} 

capitalizeHTML('body'); 

Кроме того, помимо хорошего занятия (на мой взгляд), вам действительно нужно это сделать?

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