cloneInto()
此函数提供了一种安全的方式,可以将特权作用域中定义的`object`复制到特权较低的作用域中,并创建一个结构化克隆。它返回克隆的引用。
const clonedObject = cloneInto(myObject, targetWindow);
然后,您可以将克隆体分配给目标作用域中的对象作为`expando`属性,并且在该作用域中运行的脚本可以访问它。
targetWindow.foo = clonedObject;
这使得特权代码(例如扩展)能够与特权较低的代码(例如网页脚本)共享`object`。
语法
let clonedObject = cloneInto(
obj, // object
targetScope, // object
options // optional object
);
参数
obj
-
object
。要克隆的`object`。 targetScope
-
object
。要将`object`附加到的`object`。 options
可选-
object
。函数的选项。cloneFunctions
可选-
boolean
。是否应克隆`object`的函数。默认为false
。克隆的函数具有与使用exportFunction
导出的函数相同的语义。请参阅克隆包含函数的对象。 可选 wrapReflectors
可选-
boolean
。是否应通过引用传递DOM对象而不是克隆。DOM对象通常不可克隆。默认为false
。请参阅克隆包含DOM元素的`object`。
返回值
克隆`object`的引用。
示例
此内容脚本创建一个`object`,将其克隆到内容窗口中,并将其作为内容窗口全局的一个属性。
// content script
const addonScriptObject = { greeting: "hello from your extension" };
window.addonScriptObject = cloneInto(addonScriptObject, window);
页面中运行的脚本可以访问该`object`。
// page script
button.addEventListener("click", () => {
console.log(window.addonScriptObject.greeting); // "hello from your extension"
});
当然,您不必将克隆体分配给`window`本身;您可以将其分配给目标作用域中的其他`object`。
// Content script
window.foo.addonScriptObject = cloneInto(addonScriptObject, window);
您也可以将其传递给页面脚本中定义的函数。假设页面脚本定义了一个如下的函数:
// page script
function foo(greeting) {
console.log(`they said: ${greeting.message}`);
}
内容脚本可以定义一个`object`,克隆它,然后将其传递给该函数。
// content script
const addonScriptObject = { message: "hello from your extension" };
window.foo(cloneInto(addonScriptObject, window)); // "they said: hello from your extension"
克隆包含函数的对象
如果待克隆的`object`包含函数,您必须传递{ cloneFunctions: true }
标志,否则会出错。如果您传递此标志,则`object`中的函数将使用与exportFunction
中使用的相同机制进行克隆。
// content script
const addonScriptObject = {
greetMe() {
alert("hello from your extension");
},
};
window.addonScriptObject = cloneInto(addonScriptObject, window, {
cloneFunctions: true,
});
// page script
const test = document.getElementById("test");
test.addEventListener("click", () => {
window.addonScriptObject.greetMe();
});
克隆包含DOM元素的`object`
默认情况下,如果您要克隆的`object`包含从C++反射的对象(例如DOM元素),则克隆操作会因错误而失败。如果您传递{ wrapReflectors: true }
标志,则您克隆的`object`将包含这些对象。
// content script
const addonScriptObject = {
body: window.document.body,
};
window.addonScriptObject = cloneInto(addonScriptObject, window, {
wrapReflectors: true,
});
// page script
const test = document.getElementById("test");
test.addEventListener("click", () => {
console.log(window.addonScriptObject.body.innerHTML);
});
在目标作用域中访问这些`object`将受到正常的脚本安全检查的约束。
浏览器兼容性
加载中…