5

我正在迭代NodeList以获取Node数据,但是在使用Node.innerHTML时,我正在获取小写的标签名称。

实际标签

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

作为

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

我需要这些标签。是否有可能用正则表达式得到它?我将它与道场一起使用(道场有什么办法吗?)。

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

4 回答 4

3

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

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

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

于 2013-04-18T05:44:21.573 回答
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

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

于 2013-04-18T05:29:06.733 回答
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

我希望它有所帮助。

于 2013-04-18T05:10:12.617 回答
0

这没有经过彻底测试,效率极低,但在控制台中运行得非常快:(也是 jquery,但它可以轻松转换为纯 javascript/DOM)

在 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');

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

于 2013-04-18T06:57:21.783 回答