【问题标题】:Use Javascript to modify mso comment in HTML code?使用 Javascript 修改 HTML 代码中的 mso 注释?
【发布时间】:2014-12-15 09:57:08
【问题描述】:

我目前正在尝试开发一个小工具来更改 html 文件中的某些元素 - 其中一个元素是电子邮件的“防弹 CSS 按钮”,如下页所示:

Campaign Monitor

注释的代码块如下所示:

<!--[if mso]><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://google.com" style="height:30px;v-text-anchor:middle;width:170px;" arcsize="9%" stroke="f" fillcolor="#34adb2"><w:anchorlock><center></center></w:anchorlock></v:roundrect><![endif]-->

现在,如您所见,此类代码包含 mso 注释,我想知道是否有任何方法可以使用 Javascript 来定位此元素并更改 href 属性,我尝试使用警告页面上的注释元素以下代码:

$(function() {
    $("body").contents().filter(function(){
        return this.nodeType == 8;
    }).each(function(i, e){
        alert(e.nodeValue);
    });
});

到目前为止,这只会提醒原生 HTML cmets,而不是我想要更改的特定 mso 注释。

还有其他方法可以定位此评论吗?任何帮助将不胜感激!

【问题讨论】:

  • 它适用于 IE11 和 Chrome。哪里不行?
  • 在 Chrome 中试用过,奇怪的是它只输出原生 HTML cmets,如 &lt;!-- example --&gt;
  • 请注意,.contents() 只会返回&lt;body&gt; 的子节点,它不会递归搜索,并且在您给出的示例中,cmets 位于&lt;div&gt; 中。请发布您正在使用的 HTML 代码。

标签: javascript jquery html comments


【解决方案1】:

我写了一些各种场景的简单代码,你可以使用其中一个你想要的基础女巫。 ;)

我通过 IE 11

对它们进行了测试

在这些示例中,我们有一些 HREF 值:

www.mysite。 com 默认值

www.example.com 新价值

现在代码:

HTML

这个:

<div id="mybtn">
    <a href="http://www.mySite. com" style="background-color:#556270;background-image:url(http://i.imgur.com/0xPEf.gif);border:1px solid #1e3650;border-radius:4px;color:#ffffff;display:inline-block;font-family:sans-serif;font-size:13px;font-weight:bold;line-height:40px;text-align:center;text-decoration:none;width:200px;-webkit-text-size-adjust:none;mso-hide:all;">Show me the button!</a>
    <!--[if mso]><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://http://www.mySite. com" style="height:40px;v-text-anchor:middle;width:200px;" arcsize="10%" strokecolor="#1e3650" fill="t">
          <v:fill type="tile" src="http://i.imgur.com/0xPEf.gif" color="#556270" />
          <w:anchorlock/>
          <center style="color:#ffffff;font-family:sans-serif;font-size:13px;font-weight:bold;">Show me the button!</center>
     </v:roundrect><![endif]-->
</div>

或者这个:

<div id="mybtn">
    <!--[if mso]><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://http://www.mySite. com" style="height:40px;v-text-anchor:middle;width:200px;" arcsize="10%" strokecolor="#1e3650" fill="t">
          <v:fill type="tile" src="http://i.imgur.com/0xPEf.gif" color="#556270" />
          <w:anchorlock/>
          <center style="color:#ffffff;font-family:sans-serif;font-size:13px;font-weight:bold;">Show me the button!</center>
     </v:roundrect><![endif]-->
    <a href="http://www.mySite. com" style="background-color:#556270;background-image:url(http://i.imgur.com/0xPEf.gif);border:1px solid #1e3650;border-radius:4px;color:#ffffff;display:inline-block;font-family:sans-serif;font-size:13px;font-weight:bold;line-height:40px;text-align:center;text-decoration:none;width:200px;-webkit-text-size-adjust:none;mso-hide:all;">Show me the button!</a>
</div>

运行任何脚本之前的代码状态:

.


.

A) Javascript(只是改变 v:roundrect 标签的 HREF 属性)

$("div#mybtn").contents().filter(
    function(){
        return this.nodeType == 8;
        }).each(function(i,e){
            if(i==0)
            {
               $(this)[0].data = replaceHrefWithNew($(this)[0].data,"http://www.example.com");
               console.log($(this));
             }
        });

function replaceHrefWithNew(myMso,newHrefValue)
{
    var newMso=myMso;
    var indexOfStartHref=myMso.indexOf("href")+6;
    if(indexOfStartHref>=6)
    {
        var indexOfEndHref=myMso.indexOf("\"",indexOfStartHref);

        var part1=myMso.substring(0,indexOfStartHref);
        var part2=myMso.substring(indexOfStartHref,indexOfEndHref);
        var part3=myMso.substring(indexOfEndHref);

        newMso= part1 + newHrefValue + part3;
    }
    alert(newMso);
    return newMso;
}

运行脚本 A 后的结果

.


.

B) Javascript(同时更改v:roundrect标签和A标签的HREF属性)

$(document).ready(function(){
    var webAddress="http://www.example.com";
    $("div#mybtn").contents().filter(
    function(){
        return this.nodeType == 8;
        }).each(function(i,e){
            if(i==0)
            {
               $(this)[0].data = replaceHrefWithNew($(this)[0].data,webAddress);
               console.log($(this));
            }
        });
    $("div#mybtn").find('a:first').prop("href",webAddress);
});

function replaceHrefWithNew(myMso,newHrefValue)
{
    var newMso=myMso;
    var indexOfStartHref=myMso.indexOf("href")+6;
    if(indexOfStartHref>=6)
    {
        var indexOfEndHref=myMso.indexOf("\"",indexOfStartHref);

        var part1=myMso.substring(0,indexOfStartHref);
        var part2=myMso.substring(indexOfStartHref,indexOfEndHref);
        var part3=myMso.substring(indexOfEndHref);

        newMso= part1 + newHrefValue + part3;
    }
    alert(newMso);
    return newMso;
}

运行脚本 B 后的结果

.


.

C) Javascript(只需更改 HREF 属性 A 标签)

在这种情况下,您可以简单地使用下面的 jquery 代码:

$(document).ready(function(){
    var webAddress="http://www.example.com";
    $("div#mybtn").find('a:first').prop("href",webAddress);
});

运行脚本 C 后的结果

【讨论】:

  • @BerB,我在回答中添加了一些包含各种场景的示例。你可以选择你想要的女巫。如果您有任何问题,请写在这里。
  • 您好,我想应用示例 B - 它工作正常,但我的 HTML 结构有点不同,请点击此链接查看图像截图:Image;如您所见,我的链接下方有一个额外的&lt;!--[if mso]&gt; 标签,当我运行脚本Example 时,此注释也会发生变化。有没有办法只修改第一条评论,而第二条不受影响?感谢您的详细解答!
  • @BerB,重用新示例 B... 我更改了 replaceHrefWithNew 函数并添加了 IF 语句以防止在没有任何 HREF 属性时替换 HREF。我还在 jquery 代码的 EACH 部分添加了一个 IF 语句,以避免处理下一个 &lt;!--[if mso]&gt; 语句。但是,如果您将其删除,代码将可以正常工作,因为我在此评论的前面解释部分中更改了 replaceHrefWithNew 函数。然而,更好的代码是当您同时使用隐式 IF 语句来防止代码中的无用循环时。 ;)
  • 如何更改 MSO 按钮的标题/标题?
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 2019-07-03
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多