&符号(&)变成&

时间:2013-05-16 20:41:11

标签: javascript setinterval

我使用以下代码每30秒自动获取/设置最新页面标题:

<script type="text/javascript">
   setInterval(function() {
      var data = "http://mysite.com/mypage.php";
      $.get(document.location.toString()).then(function (data){
      //find and set the title of the page
      document.title = data.match(/<title>(.+)<\/title>/)[1];
        });
    }, 30000);
</script>  

除了包含&符号的标题外,它的效果很好。这些负载正常,然后在30秒后更换为:

&amp;

所以如果页面标题是:

Fun & Games

30秒后,它变为:

Fun &amp; Games

由于

4 个答案:

答案 0 :(得分:4)

不要使用正则表达式来提取标题,而是尝试向DOM询问返回页面的标题是什么。问题是,在您的文件中,它是&amp;,但一旦解析它就变成&

$.get(document.location.toString()).then(function (data){
    //find and set the title of the page
    document.title = $(data).filter('title').text();
});

答案 1 :(得分:3)

我假设您的原始HTML源代码类似于<title>Fun &amp; Games</title>,这应该是有效的。

浏览器处理它时很好,因为它会将&amp;理解为&符号。

但是,在JavaScript的上下文中,设置document.title是一个纯字符串,而不是HTML解析的字符串。因此,&amp;不会被解释,并保持原样。

就个人而言,我的“工具箱”中有一个名为unHTMLref的函数,定义如下:

window.unHTMLref = function(str) {
    if( !str) return str;
    var d = document.getElementById('__unHTMLref');
    if( !d) {
        d = document.createElement('div');
        d.id = '__unHTMLref';
        d.style.display = "none";
        document.body.appendChild(d);
    }
    d.innerHTML = str.replace(/</g,'&lt;');
    return d.firstChild.nodeValue;
};

这将解码所有HTML实体,并返回解析后的字符串。

答案 2 :(得分:1)

'&amp;'的问题就是它在'&amp; amp'。您应该使用开发人员工具检查元素以查看它是否实际为Fun &amp;amp; Games,在这种情况下,这是您正在使用的替换功能的问题,因为它没有检查是否有'放大器;”在找到'&amp;'之后。

在这种情况下,使用indexOf和一些if语句来确保你没有修复那些没有被破坏的东西。

如果这不是问题,请确保使用的是.html()函数,而不是.text()函数。

答案 3 :(得分:-2)

<script type="text/javascript">
   setInterval(function() {
      var data = "http://mysite.com/mypage.php";
      $.get(document.location.toString()).then(function (data){
      //find and set the title of the page
      document.title = data.match(/<title>(.+)<\/title>/)[1].split("&amp;").join("&");
        });
    }, 30000);
</script>  

// BONUS: generic de-html escaping in JS:
o=document.createElement("div");
o.innerHTML=(" this &amp; that");
o.textContent // ===  "this & that"