2013-05-28 3 views
6
<script> 
var href; 

    $(function(){ 
     $("a.load").click(function (e) { 
      e.preventDefault(); 
      href = this; 

      // cover all bookmarks 
      $("."+($(this).attr("class"))).css('border-bottom', 'solid 1px black'); 
      $("."+($(this).attr("class"))).css('background-color', '#F5F5F5'); 

      // uncover chosen bookmark 
      $("#"+($(this).attr("id"))).css('border-bottom', 'solid 2px white'); 
      $("#"+($(this).attr("id"))).css('background-color', 'white'); 

      $("#tempMain").load($(this).attr("href")); // load content to temp div 

      setTimeout(function() {resizeDivs();}, 500); // synchronize size of #main and #rightColumn 
     }); 

    }); 

    function resizeDivs() { 
     var heightNew = $("#tempMain").css("height"); 
     $("#rightColumn").css('height',heightNew); 
     $("#main").css('height',heightNew); 
     // $('#main').load($(href).attr('href')); 
     $("#main").html($("#tempMain").html()); // is faster than loading again 
    } 
</script> 

Я загружаю подстраницы в выбранный div моей главной страницы с помощью функции jQuery. Чтобы синхронизировать высоту главного div и правого столбца, я использую метод jQuery .css(). Я хотел, чтобы изменение размера выглядело гладко, поэтому я решил его выполнить следующие шаги:
1. Загрузите содержимое подстраницы в невидимый темп div.
2. Рассчитайте высоту этого темпа div.
3. Измените высоту главного div и правого столбца на высоту этого временного div.
4. Загрузите содержимое подстраницы в главный div.
Как дождаться загрузки div до вызова другой функции?

Однако, я знаю, что мой нынешний способ сделать это довольно хромой из-за использования setTimeout() как импровизация ожидания контента нагрузки - Я попытался с помощью $(document).ready, но не повезло. Использование глобальной переменной (var href) также не выглядит lege artis, но передача this Оператор $("a.load").click Функция apply() тоже не работает.

Как это сделать «правильно»?

+0

возможно дубликат [Как ждать, пока элемент не существует?] (http://stackoverflow.com/questions/5525071/how-to-wait-until-an-element-exists) – user2284570

ответ

3

Использование нагрузки обратного вызова

$("#tempMain").load($(this).attr("href"),function(){ 
    resizeDivs(); 
    // do other stuff load is completed 
}); 
+5

И без JQuery? – user2284570

+0

Это не будет работать с локальными файлами (файл: //) - современные JS блокируют локальный файл href по соображениям безопасности. – Daggar

+0

вот код без jquery –

2

Вы можете прикрепить функцию обратного вызова в функции JQuery load:

$("#tempMain").load($(this).attr("href"), resizeDivs); 

см: http://api.jquery.com/load/

+1

И без JQuery? – user2284570

13

с JQuery

function waitForElement(elementPath, callBack){ 
    window.setTimeout(function(){ 
    if($(elementPath).length){ 
     callBack(elementPath, $(elementPath)); 
    }else{ 
     waitForElement(elementPath, callBack); 
    } 
    },500) 
} 

например. использовать:

waitForElement("#myDiv",function(){ 
    console.log("done"); 
}); 

здесь без JQuery

function waitForElement(elementId, callBack){ 
    window.setTimeout(function(){ 
    var element = document.getElementById(elementId); 
    if(element){ 
     callBack(elementId, element); 
    }else{ 
     waitForElement(elementId, callBack); 
    } 
    },500) 
} 

например использовать:

waitForElement("yourId",function(){ 
    console.log("done"); 
}); 
+0

Это работает с локальными файлами (файл: //), где не работает обратный вызов jQuery .load(). – Daggar

Смежные вопросы