3

我使用以下代码每 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

4 回答 4

4

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

$.get(document.location.toString()).then(function (data){
    //find and set the title of the page
    document.title = $(data).filter('title').text();
});
于 2013-05-16T20:45:21.520 回答
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 实体,并返回解析后的字符串。

于 2013-05-16T20:45:23.127 回答
1

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

在这种情况下,请使用 indexOf 和一些 if 语句来确保您没有修复未损坏的内容。

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

于 2013-05-16T20:45:43.087 回答
-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"
于 2013-05-16T20:45:12.210 回答