JavaScript库-如何公开回调函数
我正在开发一个JS库,它创建一个包含所请求内容的JavaScript库-如何公开回调函数,javascript,Javascript,我正在开发一个JS库,它创建一个包含所请求内容的iframe,并帮助促进父站点和iframe之间的通信 要在父站点和iframe之间进行通信,我正在使用Post消息。这工作得很好,我可以用这个功能做任何我想做的事情。我的想法是将window.postMessage()和window.addEventListener('message',…)包装在我自己的库中,这样使用这个库的站点就只关心推送和读取数据。另外,这有助于确保在window.postMessage()和window.addEventL
iframe
,并帮助促进父站点和iframe
之间的通信
要在父站点和iframe
之间进行通信,我正在使用Post消息。这工作得很好,我可以用这个功能做任何我想做的事情。我的想法是将window.postMessage()
和window.addEventListener('message',…)
包装在我自己的库中,这样使用这个库的站点就只关心推送和读取数据。另外,这有助于确保在window.postMessage()
和window.addEventListener('message',…)
上都进行了正确的验证
使用这个库,我成功地为站点提供了一个函数,用于将数据推送到iframe
。但是,我还没有找到一种“公开”回调的方法,当在窗口中捕获事件时,我可以调用该回调。addEventListener('message',…)
示例代码:
图书馆
然后使用webpack构建库
父站点
测试将数据推送到Iframe
//假设my-library.js公开全局变量myLibrary
myLibrary.createIframe({
元素:“#myDiv”,
宽度:“100%”,
身高:“100%”
});
//效果很好
testPushData(){
pushData({event:'pushDataTest'});
}
//父级定义调用“myTestCallback”时发生的情况。。。
//我脑子里想的东西。。。例如:
myLibrary.on('myTestCallback',()=>{
//....
});
//或者。。。
myLibrary.myTestCallback=()=>{
//....
});
上面的代码是一段简单的代码,让我了解我所拥有的。我现在的问题是找到一种方法将回调公开给父站点,当一个类型为'myTestCallback'
的事件发布到父站点时,我可以调用该回调
由于这是一个库,我想让父站点决定从
iframe
发布消息时应该发生什么。在本例中,我将“myTestCallback”作为readPostMessage()
函数中的事件类型。我该如何允许父站点定义一些函数,然后库将调用这些函数?我不认为这很简单,但由于对这个问题的评论,我成功地解决了这个问题
因此,我在我的库中添加了一个.on
函数,它允许父级添加回调。它们存储在一个对象中,然后在必要时按名称调用该对象
代码:
图书馆
然后使用以下命令调用:
callbacks['test']();
母公司
我以这种方式实现了
.on
函数,这样我就可以将多个回调传递给库。所以相关的问题实际上是“如何在iframe和父页面[JavaScript]之间通信?”然后它只是“在“回调”中包装/隐藏所述方法”。。FWIW:iframe和父页面不共享相同的窗口
/JavaScript上下文。这不是真的,因为我可以通过单独使用postMessage()
然后使用'message'
事件侦听器来实现这一点。我希望自己能处理好这一切。我想知道一种方法,如何在调用“myTestCallback”时启用父站点。我更新了这个问题以便更好地解释我自己。回调函数来自哪里,你库的调用者如何使用它?他们会调用myLibrary.installCallback(function(){…})
,还是将其作为参数传递给pushData
?好吧,如果您的installCallback
接受一个参数(我们称之为cb
),那么您所需要做的就是将其存储在某个地方,并在需要时调用cb()
。或者您可能实际上有一个回调数组,每个回调数组都可以接收一些数据,因此您可以执行类似于cbArray.forEach(cb=>cb(dataReturnedFromSomeCall))
的操作。如果你想要一个更复杂的结构,你可以将它们存储在一个对象中,但关键是你把它们放在某个地方,然后通过附加()
来执行它们。或者您可以。应用
/。致电
@DanielGrima,而不是更新问题
<html>
<body>
<!-- iframe to be embedded in myDiv -->
<div id="myDiv"></div>
<button onclick="testPushData()">Test Push Data to Iframe</button>
<script src="./my-library.js"></script>
<script>
// assuming that my-library.js exposes global variable myLibrary
myLibrary.createIframe({
element: '#myDiv',
width: '100%',
height: '100%'
});
// works well
testPushData() {
myLibrary.pushData({event: 'pushDataTest'});
}
// parent define what happens when 'myTestCallback' is called...
// something I had in mind... for example:
myLibrary.on('myTestCallback', () => {
//....
});
// or...
myLibrary.myTestCallback = () => {
//....
});
</script>
</html>
</body>
export function on(eventName, callback) {
callbacks[eventName] = callback;
}
callbacks['test']();
myLibrary.on('test', () => {
console.log('parent callback function!');
});