Определите положение мыши внутри iframe, но с учетом родительского элемента - PullRequest
0 голосов
/ 04 июля 2011

У меня есть iframe, внутри которого я обнаруживаю щелчок правой кнопкой мыши и передаю событие мыши функции в родительском элементе.Здесь (внутри родительской функции) у меня есть логика для отображения пользовательского контекстного меню, и HTML-разметка контекстного меню вставляется в родительский DOM.Таким образом, необходимо положение мыши в соответствии с областью просмотра (или родительским DOM), но то, что я получил, относительно iframe.

Я пытался использовать offsetTop и offsetParent, но это повторялось только до тега bodyinnerpage.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

Я использовал эту функцию:

// Define class that will hold Object coordinates
function CTopLeft(i_nTop, i_nLeft) {
   this.nTop = i_nTop;
   this.nLeft = i_nLeft;
}

function GetTopLeftFromIframe(i_oElem) {
   var cTL = new CTopLeft(0, 0);
   var oElem = i_oElem;
   var oWindow = window;

   do {
      cTL.nLeft += oElem.offsetLeft;
      cTL.nTop += oElem.offsetTop;
      oElem = oElem.offsetParent;

      if (oElem == null) { // If we reach top of the ancestor hierarchy
         oElem = oWindow.frameElement; // Jump to IFRAME Element hosting the document
         oWindow = oWindow.parent;   // and switching current window to 1 level up
      }
   } while (oElem)

   return cTL;
}

Это от http://codecorner.galanter.net/2012/02/26/absolute-coordinates-of-element-inside-of-iframe/

1 голос
/ 04 июля 2011

Вы можете получить верх и левее, вызвав iframe из родительского документа .Скажем, ваш iFrame имеет идентификатор 'my_iframe' в родительском документе:

offset_left = parent.document.getElementById('my_iframe').offsetLeft;
offset_top  = parent.document.getElementById('my_iframe').offsetTop;

НО это будет работать, только если содержимое в iFrame принадлежит того же источника (тот же хост, порти протокол)!

Редактировать : также нашел этот похожий вопрос на bytes.com: Относительное положение мыши iframe

0 голосов
/ 22 мая 2015

Решение Yuriy работает хорошо, пока элемент не является дочерним для элемента с позицией: absolute и это прокручивается. (Я искал положение элемента, а не мышь, но я уверен, что вы могли бы изменить это, чтобы работать для этого тоже)

Мое исправление:

function iframe_offset(e){
var  x=e.getBoundingClientRect().x
    ,y=e.getBoundingClientRect().y
    ,w=e.ownerDocument.defaultView
    do{
        e = e.offsetParent
        if(e == null){
            e = w.frameElement
            w = w.parent
            if(e){
                x += e.offsetLeft+e.scrollLeft
                y += e.offsetTop+e.scrollTop
            }
        }
    }while(e)
    return {x:x,y:y}
}
...