将 JavaScript 对象初始化为全局对象,然后在 Iframe 中使用

     2023-05-08     15

关键词:

【中文标题】将 JavaScript 对象初始化为全局对象,然后在 Iframe 中使用【英文标题】:Initialize JavaScript object as global object for then use in Iframe 【发布时间】:2021-10-19 20:28:09 【问题描述】:

我有一个需要初始化的类。

class ROS 
  static init() 
    // do ros initialization
    ROS.ros = new ROSLIB.Ros(
            url: 'ws://' + ROS.host + ':' + ROS.ws_port.toString()
        );
    // and so on
    
  static topic_publisher(topic_name, msg)
    var topic = new ROSLIB.Topic(
            ros: ROS.ros,
            name: topic_name,
        );
        topic.publish(msg);
    

如果我想向某个主题发布消息(调用topic_publisher),我只需要这样做ROS.topic_publisher("x_param', '0.1')

但是,在那些受人尊敬的页面中,应该有一个已经调用 ROS.init() 的脚本(我导入的所有 scripts.js 中至少有一个)。

我设计的网页由 4 个iframes 和 1 个parent 组成。假设他们都需要使用ROS.topic_publisher("x_param', '0.1')

在当前设计中,我需要在所有页面中调用ROS.init()。它使服务器拥有 5 个 ROS 客户端。

我想知道,我是否可以让初始化一次(可能在父级中)并让其余的我框架只调用 ROS.topic_publisher("x_param', '0.1') 而无需重新导入或重新初始化 ROS.init()

我也尝试使用parent.object。于是就变成了这样:

在父页面上:

var obj = ROS.init();
ROS.topic_publisher("x_param', '0.1'); // success

在 iframe 页面上:

var obj = parent.obj;
obj.ROS.topic_publisher("x_param', '0.1'); // error 

任何信息都会有所帮助...谢谢!

【问题讨论】:

所有 iframe 是否都与父级同源? 不应该是parent.ROS.topic_publisher吗?因为ROS.init 不返回任何东西obj 将只是未定义且毫无意义...您可以在父级中执行ROS.init() @Amadan 是的,所有 Iframe 都位于同一页面上。同一个地方(在服务器中)。 @Bravo 尝试但仍然无法正常工作,我还确保首先完成 parent 页面,然后加载 Iframe(以确保 web-socket 连接)。 still not works - 你还没有描述发生了什么让你说“它不起作用” - 你有错误吗?你不应该打电话给parent.ROS.init - 所以我希望你不需要 【参考方案1】:

有几个问题。第一个是,AFAIK,不像functionclass 不创建全局绑定,所以parent.ROS 不会找到任何东西。第二个小问题是您需要在每个窗口中加载ROSLIB。第三,这里的init 不是必需的,除非还有更多内容——一个简单的静态声明就可以了。

这样的事情可能会缓解所有这些问题。 (注:代码未经测试,不知道ROSLIB是什么)

window.ROS = class ROS 
  static ROSLIB = top.ROSLIB;
  static ros = top.ROS?.ros ?? new this.ROSLIB.Ros(...);

  static topic_publisher(topic_name, msg) 
    const topic = new this.ROSLIB.Topic(...);
    topic.publish(msg);
  

请注意,只有当top 的来源与子窗口的来源相同时,所有这些才有效。如果没有,您将不得不改用postMessage

编辑:另一个想法是在每一帧中没有ROS,而只是在顶部。 (我相信这是我误解的原始概念。)这更好,并且只需要对代码进行微小的修改:

// only in top window
window.ROS = class ROS 
  ...
;
ROS.init();

那么你就可以在任何一个窗口中使用top.ROS.topic_publisher(...)了。

【讨论】:

"等等" 建议初始化还有更多内容:p 另外,如果从 iframe 调用 ROS.xxx,您确定需要 iframe 中的 ROSLIB 吗?似乎 ROS.xxx 会在父窗口上下文中执行 @Bravo topic_publisher 在当前上下文中执行,如果没有ROSLIB 引用,您将无法实例化ROSLIB.Topic....但这给了我一个想法:) 至于init ,相同的结构将适用于 init 函数——我只是想展示一个替代方案。 我知道,但是类 ROS 代码只存在于父级中,并且在父级中执行不是吗? ROSLIB 存在于哪里? 啊。我误会了。 原始代码永远不会 obj = new ROS() - 所以不知道你为什么添加它:p

将 JSON 反序列化为 JavaScript 对象

】将JSON反序列化为JavaScript对象【英文标题】:DeserializingaJSONintoaJavaScriptobject【发布时间】:2011-09-2303:36:00【问题描述】:我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像下面这样:varjson=["adjacencies":["nodeTo":"g... 查看详情

将包含 C 样式数组的对象初始化为成员变量 (C++)

】将包含C样式数组的对象初始化为成员变量(C++)【英文标题】:InitializeobjectcontainingC-stylearrayasmembervariable(C++)【发布时间】:2018-11-0514:36:39【问题描述】:考虑以下代码:structColor//Thisstructcan\'tbemodifieddoublegrey;doublergb[3];;intmain()dou... 查看详情

如何将@NSManaged 对象类中的变量初始化为 JSON 值?

】如何将@NSManaged对象类中的变量初始化为JSON值?【英文标题】:howtoinitialisevariablesin@NSManagedobjectclassasaJSONvalue?【发布时间】:2018-06-1116:47:53【问题描述】:我想像变量“Item2”类一样初始化“Item”类中的变量这是“项目”类:-... 查看详情

我应该总是/永远/从不将对象字段初始化为默认值吗?

】我应该总是/永远/从不将对象字段初始化为默认值吗?【英文标题】:ShouldIalways/ever/neverinitializeobjectfieldstodefaultvalues?【发布时间】:2009-03-1119:59:52【问题描述】:此处的代码样式问题。我查看了this问题,该问题询问.NETCLR是否... 查看详情

将对象序列化为 JSON

...toJSON【发布时间】:2010-10-0804:40:50【问题描述】:如何在JavaScript中?【问题讨论】:【参考方案1】:您正在寻找JSON.stringify()。【讨论】:将JSON.stringify()与包含数组的javascript对象一起使用有一点好处。请检查我的问题:***.com/qu... 查看详情

读书笔记-javascript中的全局对象

对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用。这个JavaScript自身提供的全局对象的功能包括:1.全局对象拥有一些常用的属性值。比如undefined、Infinity以及NaN。2.全局对象拥有一... 查看详情

将 XML 序列化为对象

】将XML序列化为对象【英文标题】:SerializingXMLtoobjects【发布时间】:2011-04-1311:41:15【问题描述】:为了将我们的关系数据映射到对象,我们返回XML数据并反序列化为对象。为了使用这种方法,被反序列化的对象需要有一个公共... 查看详情

.NET Core 对象 JSON 序列化为 Javascript 格式

】.NETCore对象JSON序列化为Javascript格式【英文标题】:.NETCoreObjectJSONSerializationtoJavascriptformat【发布时间】:2018-06-1203:24:41【问题描述】:我在将C#对象序列化为纯JSON字符串时遇到了一些问题。我使用JsonConvert(Newtonsoft的)将模型... 查看详情

将对象数组重新格式化为键数组

...ays【发布时间】:2018-04-2718:36:26【问题描述】:所以我对Javascript有点陌生,但我正在尝试将startArray重新格式化为endArray。startArray基本上是一个订单对象数组,它们总是有不同的orderId,但可以有相同的companyId。我基本上是在尝试... 查看详情

c++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

如果该对象是全局的话,其成员中的内置类型就会自动初始化对应的默认值(像整形就为0)和调用构造函数初始化,如果是局部的话只会调用默认构造函数赋值,构造函数中没有涉及到的成员,并不会赋值。参考技术A调试分析... 查看详情

无法初始化全局对象

】无法初始化全局对象【英文标题】:CannotinittheGlobalobject【发布时间】:2015-06-2620:27:31【问题描述】:我正在将Play2.3项目转换为Play2.4,并将之前的Global对象替换为ErrorHandler,如迁移指南中所述。但是,当我尝试运行该项目时,... 查看详情

将 ES6 类对象序列化为 JSON

...。我能想到的一种简单方法是,因为每个成员实际上都是javascript对象(数组等)。我想我可以维护一个变量 查看详情

将 JavaScript 日期初始化为午夜的最佳方法是啥?

】将JavaScript日期初始化为午夜的最佳方法是啥?【英文标题】:WhatisthebestwaytoinitializeaJavaScriptDatetomidnight?将JavaScript日期初始化为午夜的最佳方法是什么?【发布时间】:2011-04-2302:00:53【问题描述】:获取newDate()实例但将时间设... 查看详情

全局数据/对象的 Javascript 存储/状态

】全局数据/对象的Javascript存储/状态【英文标题】:Javascriptstoring/stateofglobaldata/object【发布时间】:2012-03-2723:12:45【问题描述】:有没有办法将全局数据存储在window对象中,这样数据可以在页面重新加载/刷新后继续存在。所以... 查看详情

jvm笔记4-对象的创建

1.对象的创建过程:    1.new类名    2.根据new的参数在常量池中定位一个类的符号的引用。    3.如果没找到这个符号的引用,说明类还没有被加载。则进行类的加载,解析和初始化    4.虚拟机为对象分配内... 查看详情

对象复活的用法

】对象复活的用法【英文标题】:Usagesofobjectresurrection【发布时间】:2011-04-1011:10:41【问题描述】:我的.NETWindows服务应用程序存在内存泄漏问题。因此,我开始阅读有关.NET中的内存管理的文章。我在oneofJeffreyRichterarticles中发现... 查看详情

JSON 对象未正确格式化为 Javascript

】JSON对象未正确格式化为Javascript【英文标题】:JSONObjectnotcorrectformattedintoJavascript【发布时间】:2020-11-0503:44:20【问题描述】:我想在JavaScript中使用JSON对象作为键->值数组,但我不明白为什么它没有以我想要的方式返回我的... 查看详情

无法将 JSON 数组反序列化为 C# 对象 [关闭]

...4:24【问题描述】:我有一个HTML页面和一些进行AJAX调用的Javascript代码。在我的API(C#)的服务器端,我收到一个JSON数组,如下所示,它最多可以有60个元素。对于每个元素,我都映射了一个类对象。但是我无法将数组反序列化为任... 查看详情