Как я могу передать события на скрытую <browser>? - PullRequest
0 голосов
/ 22 февраля 2011

Я работаю над простым обзором браузера с помощью XULRunner 1.9.2.

<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
<window
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    xmlns:html="http://www.w3.org/1999/xhtml">
  <hbox equalsize="always" flex="2">
    <browser flex="1" type="content-primary"/>
    <html:canvas flex="1"/>
  </hbox>
</window>

Я написал несколько Javascript, который обрабатывает MozAfterPaint события из <browser>, толкает их к<canvas> с drawWindow, а затем делает немного магии.Все это работает довольно хорошо.(Ну, полосы прокрутки и курсоры немного шаткие, но я могу их игнорировать.)

Я действительно хочу, чтобы холст был единственным видимым элементом, но я могу взаимодействовать только с элементом браузера прямо сейчас.

То, что у меня было частичным успехом:

  • Захват событий на <canvas> и повторное внедрение их в <browser>.

    Я могуиспользуйте clientX и clientY каждого события на холсте, найдите соответствующий document.elementFromPoint(x, y) в браузере и createEvent initEvent dispatchEvent соответственно.

    Однако это работает толькохорошо для key(down/press/up), click и mouse(down/move/up).Я не вижу, как разумно синтезировать mouse(over/out) события, и DOMMouseScroll здесь не срабатывает, поэтому я не могу захватить события колеса прокрутки.

То, что у меня былобезуспешно с:

  • Укладка холста над браузером.

    <stack flex="2">
      <browser flex="1" type="content-primary"/>
      <html:canvas flex="1"/>
    </stack>
    

    Для этого требуется какой-то способ пропустить события через холст и вместо браузера,который я еще не пробовал, потому что есть более насущная проблема:

    Даже если холст должен быть размещен над браузером, браузер виден над холстом.

  • Сложите браузер над холстом, делая его прозрачным.

    <stack flex="2">
      <html:canvas flex="1"/>
      <browser flex="1" type="content-primary" style="opacity: 0;"/>
    </stack>
    

    Теоретически, мне вообще не придется связываться с событиями.Однако настройка opacity, похоже, не приносит никакой пользы, и снова браузер по-прежнему перекрывает холст.

Как скрыть браузер, но при этом разрешить нормальное взаимодействие с нимэто?


(я не против написания нативного кода, и ответы WebKit тоже хороши. Но, насколько я могу судить, ни Gecko, ни WebKit не имеют API-интерфейсов рендеринга за пределами экрана, и естьнет эквивалентов WebKit MozAfterPaint и drawWindow.)

1 Ответ

0 голосов
/ 23 февраля 2011

Как я помню, вы можете сделать это с помощью атрибута mousethrough="always", но я не уверен, что вы можете установить его непосредственно на самом элементе <canvas>, поэтому вам может понадобиться обернуть его внутри какая-то коробка. В противном случае, поскольку вы используете XULRunner 1.9.2, я считаю, что pointer-events: none; вместо этого можно использовать свойство CSS .

...