Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 跨窗口javascript事件_Jquery_Dhtml - Fatal编程技术网

Jquery 跨窗口javascript事件

Jquery 跨窗口javascript事件,jquery,dhtml,Jquery,Dhtml,我正在启动一个带有window.open(…)的弹出窗口,并将elementId传递给新的弹出窗口 然后在弹出窗口的启动过程中,我在opener窗口中找到与传递给弹出窗口的elementId相匹配的元素。然后弹出窗口使用jQuery.bind(…)订阅该元素上的事件。然后在opener窗口中,我使用jQuery.trigger(…)触发这些事件,我还尝试了triggerHandlers 问题是我的弹出窗口的EventHandler从未被调用。我可以在opener窗口内订阅活动,没问题。然而,当我

我正在启动一个带有window.open(…)的弹出窗口,并将elementId传递给新的弹出窗口

然后在弹出窗口的启动过程中,我在opener窗口中找到与传递给弹出窗口的elementId相匹配的元素。然后弹出窗口使用jQuery.bind(…)订阅该元素上的事件。然后在opener窗口中,我使用jQuery.trigger(…)触发这些事件,我还尝试了triggerHandlers

问题是我的弹出窗口的EventHandler从未被调用。我可以在opener窗口内订阅活动,没问题。然而,当我尝试从弹出窗口,它不工作

有人对如何解决这个问题有什么想法吗?这是某种安全描述吗

非常感谢您的阅读

好的,当我找到“opener”页面元素并以这种方式分配处理程序时:

// in the popup page
$(function() {
  var openerElement = window.opener.document.getElementById(theElementId);
  $(openerElement).click(function() {
    alert("Hello World!");
  });
});
然后,令我惊讶的是,本地的“真实”事件工作得很好但是,从“开场白”页面触发的自定义事件不会被弹出页面拾取。这有点道理,因为每个页面都有自己的jQuery小宇宙。然而,我显然错了,浏览器没有传播本地事件,所以感谢今天的学习经验

更多信息-从弹出窗口(以及类似于主文档的任何子
)中,您也可以使用

var thing_in_main_window = window.opener.$('#thingId');
在打开窗口中查找内容。但是,仅仅在弹出页面中使用jQuery对象来查找该元素是无法工作的,因为jQuery不会遍历“window.opener”链接并在那里查找该元素。当您在弹出页面上调用
$('#thingId')
时,jQuery将使用
弹出页面的
文档对象调用
document.getElementById('thingId')
。如果该页面上没有名为“thingId”的元素,则不会找到它

原始答复:

我认为你想做的事行不通。浏览器不会在与包含目标元素的窗口不同的窗口中触发任何事件处理程序

但是,您可以在一个窗口中捕获事件,然后在另一个窗口中触发自定义事件。当您这样做时,您可能希望通过该页面上的jQuery对象触发事件。换句话说,你应该这样做:

$('#thing').click(function() {
  otherWindow.jQuery.trigger("thing-clicked");
});

谢谢你的回答。我对此进行了实验,并希望与大家分享我的发现。实际上,您可以在弹出窗口中定义事件侦听器,而无需引用开场白:

在作为弹出窗口打开的页面中:

$(document).on("foo", function() { 
  alert("foo"); 
});
var popup = window.open("popup.html", "_blank", "width=500");
$("#trigger-button").on("click", function() {
  popup.$(popup.document).trigger("foo");
});
在打开弹出窗口的页面中:

$(document).on("foo", function() { 
  alert("foo"); 
});
var popup = window.open("popup.html", "_blank", "width=500");
$("#trigger-button").on("click", function() {
  popup.$(popup.document).trigger("foo");
});

秘密在于:即使从弹出窗口对象调用jQuery,也不能直接使用选择器,因为jQuery将尝试在父窗口(opener)中查找元素

使用firefox firebug并检查错误。然后你就会知道它是安全的还是简单的代码错误。示例代码可能会有所帮助。您可以发布一些您正在尝试的触发示例吗?我想你可能试图在与当前窗口中的选择器匹配的元素上执行此操作,而不是在打开器上执行此操作,通常是这样。我肯定从正确的窗口中获得了正确的元素。此外,不幸的是,我无法在我的跛脚环境中使用firefox,但没有错误。如果你不能使用firefox,你打算如何确保它在Firefox中工作?这只是我的经验,用一个非常简单的实验页面(或者我猜是页面)来测试非常容易。我想我不能说我百分之百肯定这在每个浏览器中都是正确的;当然,如果我错了,我会写一个快速测试并更新我的答案!再次感谢。var openingControl=window.opener.document.getElementById(openingControlId);可以工作,但是$(“#”+openingControlId,window.opener.document);不。或者实际上这两行都找不到元素,但事件在第二行上不起作用。您确定在弹出页面中,
$(“#”+something)
确实找到了元素吗?我看不出这是怎么可能的,因为在弹出页面上,jQuery只会查看DOM;它不会穿过
窗口。打开器
,也不会在那里查看。至少,我不认为是这样;我可以编写另一个测试。我创建了一个隐藏的新按钮,并在上面触发我的事件,你帮了我很多忙!我想您可以通过指定另一个窗口作为选择器上下文来解决最后一个问题<代码>弹出窗口。$(“#thing”,popup.document)。触发器('foo')