Node.innerHTML以小写字母给出标记名称

时间:2013-04-18 04:23:19

标签: javascript dojo innerhtml

我正在迭代 NodeList 以获取节点数据,但在使用 Node.innerHTML 时,我得到小写的标记名称。

实际标记

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

给予

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

我需要这些标签。是否有可能通过正则表达式得到它?我在dojo中使用它(在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));
            }
    };

4 个答案:

答案 0 :(得分:4)

您不能指望.innerHTML保留原始HTML的确切性质。事实上,在某些浏览器中,它与不同的引用,大小写,属性顺序等有显着差异(虽然生成相同的结果)......

最好不要依赖保存案例并调整你的javascript来处理不确定的案例。

当然可以使用正则表达式进行不区分大小写的搜索(“i”标志将其搜索指定为不区分大小写),尽管使用直接DOM访问/搜索而不是innerHTML通常要好得多。搜索。在我们提供一些代码之前,您必须告诉我们更多关于您正在尝试做什么的事情。

答案 1 :(得分: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

我希望它有所帮助。

答案 2 :(得分: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

上面将输出任何输入字符串,其中第一个字符为大写,其他所有字符为小写。

答案 3 :(得分:0)

这没有经过全面测试,并且效率很低,但它在控制台中运行得非常快: (也是,它是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');

另外,除了是一个很好的练习(在我看来),你真的需要这样做吗?