覆盖文件.标题,然后使用原始方法

Override document.title, then use original method

本文关键字:原始 方法 然后 文件 标题 覆盖      更新时间:2023-09-26

问题是我有一个组件(这不是我的代码,所以我不能改变它)调用document.title="。当然我不允许这样做,所以我的计划是重写文档。方法并检查是否为空字符串。但是如何处理设置文档的调用呢?title =正确的标题,使用重写的方法。

下面是我的代码:
var actualTitle = document.title;
Object.defineProperty(document, 'title', {
    set: function (newValue) {
        if(newValue != ""){
            document.title = newValue;
        }
    },
    get: function () {
        return actualTitle;
    }
});

这段代码产生了一个无限循环,因为该方法调用了self。但我需要在set方法中设置标题

有没有我可以使用的超级方法,就像你可以在Java中使用的。

Object.defineProperty(document, 'title', {
    set: function (newValue) {
        if(newValue != ""){
            document.getElementsByTagName("title")[0].innerHTML = newValue;
        }
    },
    get: function () {
        return document.getElementsByTagName("title")[0].innerHTML;
    }
});

工作原理:

当我使用Object.defineProperty时,当你使用document.title = "lorem ipsum dolor sit amet"时页面标题不会改变。所以,让我们破解它。

我们还有另一种方法来改变标题:document.getElementsByTagName("title")[0].innerHTML。因此,每次改变document.title的值,我们就改变document.getElementsByTagName("title")[0].innerHTML的值。但是你讨厌document.title = ""所以我们忽略if(newValue != "")

您可以通过简单地将属性设置为不可写(这是默认值),并为其指定您想要的值来停止修改标题:

function lockDocumentTitle() {
  // extract the initial value
  var actualTitle = document.title;
  // override the property to always have that value
  Object.defineProperty(document, 'title', {
    value: actualTitle,
    /* 
    By default:
      - not enumerable
      - not configurable
      - not writable
    */
  });
}
console.log(document.title);             // ''
document.title = 'Test';     
console.log('Set to ' + document.title); // 'Test'
lockDocumentTitle();
document.title = 'Something Else';       // no effect
console.log('Still ' + document.title);  // its still 'Test'

一个简单的标志行吗?

var actualTitle = document.title,
    isModified = false;
Object.defineProperty(document, 'title', {
    set: function (newValue) {
        isModified = true;
        if(newValue != "" && !isModified){
            document.title = newValue;
        }
    },
    get: function () {
        return actualTitle;
    }
});