Определить текущую позицию мыши в IFRAME?

У меня есть IFRAME внутри IFRAME, и мой метод getMousePosition не может получить текущую позицию мыши внутри iframe. Он работает в первом Iframe, но когда я вызываю getMousePosition из функции в родительском документе, он возвращает резервные значения 600 и 350. К вашему сведению: я не могу контролировать содержимое IFrame по мере его создания, но это не так. междоменный доступ. И IFRAMES, и родительский документ размещаются на одном сервере. Я программирую только для Internet Explorer 8. Так что совместимость с браузером не проблема.

  function getMousePosition(){
  if(!inframe)
      $(document).mousemove(function(e){
           mouseX = e.pageX 
           mouseY = e.pageY 
      });
  else
  {
    mouseX = 600;
    mouseY = 350;
  }

  //This is where I get the Iframe Document (I then parse through the document, picking up the specific links and storing them in the array verifiedlinks)
  var src = window.frames[iframeindex].document.getElementsByTagName("a");
  // This is where I call my function which uses the values returned by getMousePosition (verifiedlinks is an array of links inside the iframe):

    verifiedlinks[i].onmouseover = function() 
    {
        showPeopleDetails(this.getAttribute('username'));
    }
  // This should display User Details at the current Mousecoordinates
function showPeopleDetails(UserId){
var vpd = document.getElementById("PeopleDetails");
    if ( vpd != null ) {
        getMousePosition();
        vpd.style.left=mouseX+10; //mouseX and mouseY are defined globally
        vpd.style.top=mouseY+10;
        vpd.style.display="block";
    }
}

Я прочитал этот вопрос: РЕШЕННЫЙ ВОПРОС но ответ не решил мою проблему. Я нашел этот вопрос, но ни один из ответов не работает для мне. Мой новый отредактированный код:

function showPeopleDetails(UserId, x, y){
var vpd = document.getElementById("PeopleDetails");
try
{
    if ( vpd != null ) {
        //getMousePosition();
        //alert("MouseX: " +mouseX+" MouseY: "+mouseY);
        //vpd.style.left=mouseX+10;
        //vpd.style.top=mouseY+10;
        vpd.style.left = x +10 - window.frames[2].document.body.scrollLeft;
        vpd.style.top = y +10 - window.frames[2].document.body.scrollTop;
     }
}

person Abhischek    schedule 01.08.2011    source источник


Ответы (1)


Если вы вызываете getMousePosition из родительского окна, тогда document будет указывать на документ родительского окна. Вы должны вызывать этот метод в контексте iframe. Также, где определяется inframe, и обновляете ли вы его значение при любом событии?

Вы можете использовать jquery, чтобы прикрепить события наведения мыши к ссылке. Используя это, вы получите объект события, который предоставляет координаты мыши x/y ссылки относительно документа. Я надеюсь, что это поможет вам.

$(verifiedlinks[i]).mouseover(function(e){
        showPeopleDetails($(this).attr('username'), e.pageX, e.pageY);
}

function showPeopleDetailsNow(UserId, x, y){
var vpd = document.getElementById("PeopleDetails");
    if ( vpd != null ) {
        getMousePosition();
        //vpd.style.left=mouseX+10; //mouseX and mouseY are defined globally
        //vpd.style.top=mouseY+10;
        vpd.style.left= x +10 + $(document).scrollTop(); //mouseX and mouseY are defined globally
        vpd.style.top= y +10;
        vpd.style.display="block";
    }
}
person ShankarSangoli    schedule 01.08.2011
comment
Да, я обновляю INFRAME до true каждый раз, когда анализирую iframe. Я хочу отображать всплывающую подсказку, когда пользователь наводит курсор на определенную ссылку. - person Abhischek; 01.08.2011
comment
Вы должны напрямую прикреплять события наведения мыши к ссылке внутри iframe, а не делать это через родительское окно. То, как вы пытаетесь сделать, не сработает. - person ShankarSangoli; 01.08.2011
comment
Извините, я должен был уточнить: я меняю ссылки в IFrame, и ссылки работают, просто всплывающая подсказка отображается с неправильными координатами: при наведении курсора на ссылку внутри iframe всплывающая подсказка всегда отображается с разрешением 600 пикселей, 350 пикселей. Поэтому я предположил, что мой getMousePosition не обновляет значения внутри IFRAME. - person Abhischek; 01.08.2011
comment
Спасибо, ваше решение частично работает для меня. Для первых 6 ссылок всплывающая подсказка отображается правильно. Но как только я прокручиваю следующую ссылку, всплывающая подсказка отображается вниз. Я вижу, что полоса прокрутки очень сильно расширяется, и когда я прокручиваю страницу до конца, там отображается всплывающая подсказка. - person Abhischek; 01.08.2011
comment
Вам также нужно добавить верхнюю часть прокрутки, проверьте мой отредактированный ответ. Теперь должно работать для всех ссылок - person ShankarSangoli; 01.08.2011
comment
Нет уж $(document).scrollTop(); не сработало, и я тоже пробовал: vpd.style.top= y + 10+ document.body.scrollTop; Я также должен упомянуть, что мне просто нужно, чтобы он работал с Internet Explorer, поэтому совместимость с браузером здесь не проблема. - person Abhischek; 01.08.2011
comment
Можете ли вы предупредить и увидеть $(document).scrollTop()? Вам не нужно беспокоиться о совместимости браузера, jquery позаботится об этом. - person ShankarSangoli; 01.08.2011
comment
оповещение($(окно).scrollTop()); всегда показывает 0, независимо от того, предупреждаю ли я документ, окна, html или тело. Есть идеи, почему? РЕДАКТИРОВАТЬ: пользователь прокручивает окно Iframe, а не мою всплывающую подсказку. Поэтому мне нужно получить значение scrolltop() IFRAME, чтобы иметь возможность отображать воздушный шар в правильной позиции в iframe. - person Abhischek; 02.08.2011
comment
Я узнал, что если я сделаю это в адресной строке браузера: javascript:alert(window.frames[1].document.body.scrollTop); Я всегда получаю 0, но javascript:alert(window.frames[1].name); возвращает значение! Любая идея, почему у меня нет доступа к iframe scrollTop? - person Abhischek; 02.08.2011
comment
БЛАГОДАРНОСТЬ! После некоторой настройки прокрутка теперь работает. Надеюсь, я смогу включить смещение родительского Iframe, потому что ссылки на границах страницы отображаются снаружи. Но все равно спасибо :) - person Abhischek; 02.08.2011