Jquery Get closest () Iframe A-тега, возвращающего неопределенный - PullRequest
2 голосов
/ 14 сентября 2011

Я вызываю функцию в моем JavaScript на onmouseover. В вызов функции я включаю srcElement (который является a-тегом). Теперь мне нужно получить offsetWidth ближайшего Iframe этого a-тега. Но когда я попробую это:

alert($(srcElement).closest('iframe').offset().left);

Я получаю неопределённость! Это тоже не работает:

alert($(srcElement).closest('iframe').attr('title'));

Но это работает и возвращает идентификатор тела внутри iframe:

alert($(srcElement).closest('body').attr('id'));

Это мой вызов функции в html:

showPeopleDetails('User_Matt', event.clientX, event.clientY, event.srcElement);

Это функция JavaScript:

function showPeopleDetailsNow(UserId, x, y, srcElement){
   currentwidth = $(document).width();
   currentheight = $(document).height();
   adjustwidth = $(srcElement).closest('iframe').offset().left;
   adjustheight = $(srcElement).closest('iframe').offset().top;
   var calculatedheight = currentheight - adjustheight;
   var calculatedwidth = currentwidth - adjustwidth;

Сейчас я делаю это так, но это работает только для одной части моей страницы. Поскольку идентификатор генерируется динамически каркасом.

   adjustwidth = parent.document.getElementById('ivuFrm_page0ivu0').contentWindow.document.getElementById('ivuFrm_page0ivu2').offsetWidth;
   adjustheight = parent.document.getElementById('ivuFrm_page0ivu0').contentWindow.document.getElementById('ivuFrm_page0ivu2').offsetHeight;

Есть ли способ получить смещение из тега body (и будет ли это правильным смещением iframe? Я знаю, что могу получить ширину элемента body, но это не точно с точностью до нескольких пикселей ... Очевидно, еще лучше было бы правильное смещение Ифраме! Iframe имеет тот же порт, протокол и хост, что и исходная страница. Мне это нужно только для работы с Internet Explorer 8. Помощь очень ценится!

Обновление: после предложенного решения от Феликса Клинга и scr4ve я обнаружил, что не могу использовать смещение элемента body или html! Поскольку оба смещения возвращают 0, я предполагаю, что элемент Iframe является единственным объектом в dom, который имеет правильное смещение относительно документа. Любые предложения, как получить это конкретное смещение?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Проведя еще несколько исследований по этой теме, я нашел решение своей проблемы, основываясь на решении, предоставленном ингредиентом_15939 в этом вопросе stackoverflow: Доступ к родительскому фрейму Как предложил Феликс Клинг, IFRAME несуществуют в иерархии документов, поэтому я ищу во всех фреймах соответствующее тело моего тега.Мой окончательный код работает следующим образом:

var searchbody = $(srcElement).closest('body');
var arrFrames = document.getElementsByTagName("iframe");

for(i = 0; i<arrFrames.length; i++){
    //I search and compare every IFRAME to the closest body of my srcElement
    try{
        if(arrFrames[i].id != 'PeopleDetailsIframe'){
            if($(arrFrames[i].contentWindow.document.body).is(searchbody)){
        //The found IFrame has to be the one containing my a-tag
                offsetwidth = $(arrFrames[i]).offset().left;
                offsetheight = $(arrFrames[i]).offset().top;
             }
             else{
                  //console.log("Iframe not found");
             }
         }
      }
      catch(e){
                //Iframe has security issues --> avoid it
      } 
}

Надеюсь, это может помочь кому-то еще!

0 голосов
/ 14 сентября 2011

Согласно документам , .closest () учитывает только прямых предков.Я полагаю, ваш iframe не является прямым родителем вашего a-тега?Присмотритесь к документам для Обход дерева . .silbings () может соответствовать вашим потребностям.

Кстати, рассмотрите возможность использования console.log, а не alert.

Обновление после уточнения: $("html").offset()достаточно и более производительно в этом случае.В кадре только один HTML-тег, нет необходимости в .closest().OP может также заинтересовать .outerWidth () / Height.

...