перекрестные события javascript - PullRequest
6 голосов
/ 06 июля 2010

Я запускаю всплывающее окно с window.open (...) и передаю elementId в новое всплывающее окно.

Затем, во время запуска всплывающего окна, я нахожу элемент в окне открыванияэто соответствует элементу, переданному во всплывающее окно.Затем всплывающее окно подписывается на события в этом элементе, используя jQuery.bind (...).Затем из окна открывающего окна я запускаю эти события, используя jQuery.trigger (...), я также пробовал triggerHandlers.

Проблема в том, что событие моего всплывающего окна никогда не вызывается.Я могу подписаться на события изнутри в открывшемся окне без проблем.Тем не менее, когда я пытаюсь из всплывающего окна, это не работает.

У кого-нибудь есть идеи, как это исправить?Это какое-то описание безопасности?

Большое спасибо за чтение!

Ответы [ 2 ]

10 голосов
/ 06 июля 2010

ОК, когда я нахожу элемент страницы «opener» и назначаю обработчики следующим образом:

// in the popup page
$(function() {
  var openerElement = window.opener.document.getElementById(theElementId);
  $(openerElement).click(function() {
    alert("Hello World!");
  });
});

Тогда, к моему удивлению, нативные «настоящие» события работают просто отлично. Однако , пользовательские события, инициируемые со страницы открытия, не попадают на всплывающую страницу.Это имеет смысл, поскольку каждая страница имеет свою собственную маленькую вселенную jQuery.Однако я был явно неправ в том, что браузер не распространяет нативные события, поэтому спасибо за сегодняшний опыт обучения !!

Дополнительная информация - Из всплывающего окна (и аналогично любому дочернему элементу <iframe>основной документ), вы также можете использовать

var thing_in_main_window = window.opener.$('#thingId');

, чтобы найти вещи в открывшемся окне.Тем не менее, просто используя объект jQuery на всплывающей странице , чтобы найти, что элемент не может работать, потому что jQuery не будет проходить по ссылке "window.opener" и искать там этот элемент.Когда вы вызываете $('#thingId') на всплывающей странице, jQuery просто вызывает document.getElementById('thingId'), используя объект document для страницы popup .Если на этой странице нет элемента "thingId", он не будет найден.

оригинальный ответ:

Не думаю, что выпытаясь сделать будет работать.Браузер не собирается запускать какие-либо обработчики событий в окне, отличном от того, который содержит целевой элемент.

Однако вы можете перехватить событие в одном окне, а затем вызвать другое событие в другом окне.Когда вы сделаете это, вы, вероятно, захотите вызвать событие через объект jQuery на этой странице.Другими словами, вы бы сделали это:

$('#thing').click(function() {
  otherWindow.jQuery.trigger("thing-clicked");
});
3 голосов
/ 10 апреля 2012

Спасибо Пойнти за ответ. Я экспериментировал с этим и хочу поделиться своими выводами. На самом деле вы можете определить своих слушателей событий во всплывающем окне, не ссылаясь на открыватель:

на странице, открытой как всплывающее окно:

$(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 попытается найти элементы в родительском (открывающем) окне.

...