问题标签 [cross-window-scripting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
64 浏览

javascript - 跨窗口的 jQuery.data 支持

我正在尝试更新一个使用 jQuery.data()函数来存储信息的网络应用程序。更新涉及重构界面,以便为不同类型的信息提供单独的窗口,而不是在同一页面上仅使用 div。由于某些插件的工作方式,调用它们的代码已被移动到不同的窗口中,以便在需要它们的窗口中运行。但是,这些插件使用的许多回调用于.data()查找存储的信息,但是设置存储的数据的代码.data()在父窗口中,并且它似乎没有将数据附加到 DOM,它将数据存储在附加到的某个地方窗口,因此在子窗口中,回调无法再找到他们正在寻找的数据。

它可以使用call(parent, DOMelement.data);吗?是否有一种更整洁的方式来处理这个问题?

提前致谢!

0 投票
2 回答
66 浏览

javascript - .data() html5 跨窗口

我正在尝试将一些数据放入子 windows html 标记中。但这似乎不起作用。我尝试在该子窗口上使用一些 jquery 将其放入,并且工作正常。

下面是在父窗口中实现的将数据发送到子窗口的代码:

这将在子窗口中使用以下 jQuery 代码返回“未定义”。

但是,当我使用子 jQuery 脚本存储数据时,它可以完美运行:

是否不允许跨窗口数据存储到标签中?

0 投票
0 回答
29 浏览

javascript - 在 IE 中,如果对象在另一个窗口中,则删除不存在的属性会失败。为什么?

通常,代码如:

不应导致任何错误,即使 foo 从未在x.

但是,在 IE(但不是 Chrome 或 Firefox)中,如果从与创建窗口不同delete x.foo;的窗口中的代码调用,它会抛出“ SCRIPT438:对象不支持此属性或方法”错误如果该属性不'不存在。(如果它确实存在,它工作正常)。xfoo

以下是一些您可以保存到 HTML 文件并自己运行的测试代码:

(您需要为窗口 1 和 2 单击“允许阻止的内容”)。

您会注意到,在窗口 1 中,您可以foo按任意顺序设置或删除任意次数。但是在 Window 2 中,如果您在设置之前尝试将其删除,或者连续删除两次,您将立即收到错误消息(在 IE 11 中)。

我的问题是,

(a) 这种行为的根本原因是什么,以及

(b) 这是否记录在某处?(因为我找不到它)。

(另外,我认为记录这种奇怪行为的stackoverflow条目可能会帮助那些可能导致难以诊断的错误的人...... :-))

0 投票
0 回答
125 浏览

javascript - 浏览器中的跨窗口同步(关键部分)

我正在尝试在网页中实现以下目标:

  • 用户可以打开页面的多个选项卡/窗口。
  • 每隔几秒钟,我就需要其中一个选项卡/窗口来执行特定的代码部分(关键区域)。
  • 我不在乎哪个选项卡/窗口执行代码,即无需担心解决方案的公平性或饥饿属性。
  • 由于用户自己打开了选项卡/窗口,因此页面的不同实例不了解或直接引用彼此(即没有 window.parent 等)
  • 我不想需要 Flash 或 Silverlight 或其他插件,并且一切都需要在客户端运行,因此选项卡/窗口可以通信的方式非常有限(LocalStorage是迄今为止我发现的唯一一个,但可能成为其他人)。
  • 任何选项卡/窗口都可能随时崩溃或关闭或刷新,并且还可以随时打开更多选项卡/窗口,并且剩余的窗口必须“做出反应”,这样我仍然可以每次执行一次关键区域几秒钟。
  • 这需要在尽可能多的浏览器中可靠地运行,包括移动设备(caniuse评级超过 %90)。

我对解决方案的第一次尝试是使用一种简单的互斥算法,该算法使用 LocalStorage 作为共享内存。由于种种原因,我选择了 Burns 和 Lynch 在他们的论文“Mutual Exclusion Using Indivisible Reads and Writes”(第 4 页(836))中的互斥算法。

我构建了一个jsfiddle(见下面的代码)来尝试这个想法,它在 Firefox 中运行良好。如果您想尝试一下,请在 Firefox 的几个(最多 20 个)窗口中打开指向小提琴的链接,并观察其中一个窗口每秒闪烁橙色。如果您同时看到不止一个眨眼,请告诉我!:)(注意:我在小提琴中分配 ID 的方式有点俗气(简单地循环超过 0..19),只有在每个窗口都分配了不同的 ID 时,事情才会起作用。如果两个窗口显示相同的 ID,只需重新加载一个。)。

不幸的是,在 Chrome 中,尤其是在 Internet Explorer 中,事情并没有按计划工作(多个窗口闪烁)。我认为这是由于我写入 LocalStorage 的数据从一个选项卡/窗口到另一个的传播延迟(请参阅我的问题here)。

所以,基本上,我需要找到一种不同的互斥算法来处理延迟数据(听起来很困难/不可能),或者我需要找到一种完全不同的方法。也许StorageEvents可以提供帮助?或者也许有不使用 LocalStorage 的不同机制?

为了完整起见,这里是小提琴的代码:

0 投票
1 回答
2269 浏览

batch-file - 如何通过批处理文件启动 UWP 应用程序?

我尝试在 Windows 10 中使用批处理脚本 (.bat) 打开Skype,但发现在 Windows 10 中 Skype 是默认设置,并且已移至 Windows Apps。有没有办法做到这一点?

0 投票
2 回答
1886 浏览

javascript - 如何跨多个 iframe(同一个域)创建点击事件?

我有一个主(父)页面,其中托管了同一域下的 3 个 iframe。iframe 的 src 属性是在点击事件上添加的,因此 iframe 直到需要时才会加载。

我想要的是当我单击主页上的某个 div 时,它会触发对同时位于所有 3 个 iframe 内的特定 div 的单击。

我在父页面中尝试了以下代码:

#iframe2并为 iframe和.重复了两次#iframe3。但是,除非我加载 iframe 以便将它们写在我的页面上,否则它不起作用。(即点击事件#iframe2直到 after 事件才执行#iframe1)。这是一个问题,因为我无法控制 iframe 访问者首先加载的内容。我尝试给它们单独的 function() 名称,但发生了同样的事情 - 一次只影响一个 iframe。请注意,当我使用 iframe 已经像正常一样拥有它们的 src 进行测试时,这工作正常,只是在手动添加它们时不行。

我还尝试在 iframe 页面中添加它:

但是,这仅适用于加载的第一个 iframe(即,如果#iframe2先加载,则iframe1's 和iframe3' 事件不会执行)

我可以尝试其他解决方案吗?我的目的是创建一个昼夜切换classList.toggle,我希望iframes同时切换所有的 CSS,切换按钮位于主页上。

(我的主页更喜欢 vanilla javascript,但 iframe 页面上的 jQuery 很好)

0 投票
2 回答
448 浏览

javascript - 有没有办法在收到 BroadcastChannel 消息后只回复发件人?

假设我有一堆同源窗口或选项卡ABCDE,它们之间没有相互引用。(例如,用户独立打开它们)。假设A向其他人发送BroadcastChannel消息,因此D需要将一些数据发送A,理想情况下不涉及BCE

这是否可能,使用任何消息传递 API?

广播消息事件中有一个event.source属性,在这种情况下,它看起来好像应该包含一个WindowProxyMessagePort对象,但是(至少在我对 Firefox 78 的测试中)它只是null。还有一个ports数组,但那是空的。

...我知道您可以启动一个 SharedWorker 来为每个窗口分配一个唯一的 ID 并充当在它们之间传递消息的中转站,但是 (a) 对于所需的功能来说这似乎非常复杂,并且 (b) 每个以这种方式发送的消息将需要 2 次跃点,从窗口到 sharedWorker 再返回到窗口,两次都跨越线程边界,并且(通常)两次都被序列化和反序列化 - 即使两个窗口共享同一个 javascript 线程!所以效率不是很高。

这似乎是一件显而易见的事情,我发现很难相信我没有明显的遗漏......但我看不到它,如果是这样的话!

0 投票
0 回答
462 浏览

reactjs - 在 NextJS 中通过 window.postMessage 获取跨窗口消息错误

在结帐卡支付提供商完成 3D 安全授权后,我需要与重定向页面通信。因为我不想更改父窗口位置,所以我有这样的设置

/payment.tsx

这是打开 3DS 身份验证 URL 的新窗口的页面

下一页/redirect是 3DS 成功或失败后返回的地方

这样做的目的是在 Checkout 3DS 完成后通过向 /payment 发送消息来关闭 /redirect 窗口并返回到应用程序。此设置可能不是一种可行的方法,因此欢迎提供反馈。但目前我无法收到从 /redirect 发送的任何消息,因此无法关闭窗口。

示例代码可以在CodeSandbox中找到

0 投票
0 回答
22 浏览

javascript - 消息未显示在目的地(跨窗口通信)

我是堆栈溢出的新手——很高兴加入像你这样的社区。

我正在发送此消息,因为我正在尝试进行有关跨窗口通信的活动,但我无法弄清楚我做错了什么。该任务仅包括从源发送消息,并将其显示在目标窗口上。我使用的网络浏览器是 Firefox 94.0.1(64 位)。

这里有我写的代码:

起源

目的地

当我单击该按钮时,会出现新窗口。在此之后,我通过按 F12 按钮访问 Web 开发人员 Firefox 工具,但不知何故,该消息未显示在控制台中。

如果有人可以帮助我解决这个问题,我将不胜感激。

亲切的问候。