1

我有以下代码:

HTML

<div id="body"></div>

JS

var site = { 'pageData' : [
    {   
        'loadInTo'      :   '#aboutUs',
        'url'           :   'aboutUs.html',
        'urlSection'    :   '.sectionInner'
    },
    {   
        'loadInTo'      :   '#whatWeDo',
        'url'           :   'whatWeDo.html',
        'urlSection'    :   '.sectionInner' 
    },
    {   
        'loadInTo'      :   '#ourValues',
        'url'           :   'ourValues.html',
        'urlSection'    :   '.sectionInner' 
    },
    {   
        'loadInTo'      :   '#ourExpertise',
        'url'           :   'ourExpertise.html',
        'urlSection'    :   '.sectionInner' 
    }   
]}

for(i=0; i < site.pageData.length; i++) {
    var loader = site.pageData[i];

    $('#body').append('<div id="'+ loader.loadInTo +'" class="section" />');
    $(loader.loadInTo).load(loader.url + ' ' + loader.urlSection);      
}

我正在做的是遍历站点变量并使用jQuery的append方法写出一些div,这些方法在'loadInTo'中设置了id,这很好用。完成后,我想使用 jQuery 的 load 方法用来自其他页面的 HTML 填充 div。附加div后是否有回调?像这样的东西:

$('#body').append('<div id="'+ loader.loadInTo +'" class="section" />', function(){
        $(loader.loadInTo).load(loader.url + ' ' + loader.urlSection);
    });
4

3 回答 3

3

jQuery 不支持.append. 此外,一次追加数据比调用每个元素更有效。.append请参阅下面的代码。

每个要追加的元素都被添加到一个字符串中。字符串完成后,将添加一个标记,并附加 HTML。然后,轮询器被激活,检查该marker元素是否存在于 DOM 中。如果存在,则清除轮询器,删除标记,然后执行代码。

更新:.substr(1)在设置 ID 时使用,因为 ID 不应以 . 为前缀#

var toAppend = '';
var markerID = 'mark-end-of-append' + (new Date).getTime(); //Random
for(var i=0; i<site.pageData.length; i++) {
    var loader = site.pageData[i];
    toAppend += '<div id="'+ loader.loadInTo.substr(1) +'" class="section" />';
}
toAppend += '<div id="' + markerID + '"></div>';
$('#body').append(toAppend);
var poller = window.setInterval(function(){
    var detected = document.getElementById(markerID);
    if(detected){ //DOM is much more efficient
        window.clearInterval(poller);
        $(detected).remove(); //Remove marker
        for(var i=0; i<site.pageData.length; i++){
            var loader = site.pageData[i];
            $(loader.loadInTo).load(loader.url + ' ' + loader.urlSection);
        }
    }
}, 100); //Check 10x per second
于 2011-10-23T11:02:25.500 回答
1

为什么要回调?是$(...).append()异步调用吗? 我认为不是,那为什么不写另一个声明呢?

如果您要避免代码复制,则可以在临时变量中创建新部门:

for( ... ) {
  var loader = ...;
  var newDiv = createDiv( {id:loader.loadInto } );
  $('#body').append( newDiv );
  $(newDiv).load( loader.url + ' ' + loader.urlSection );
}

createDiv 函数可能看起来像的地方

function createDiv( settings ) {
  document.createElement('div');
  $(div).class("section");
  $(div).id(settings.id);
  return div;
}
于 2011-10-23T11:02:13.410 回答
0

在 jquery 中,您可以在附加内容代码之后使用 $() 。这样,您可以确保在对附加内容执行任何任务之前已加载内容并且 DOM 已准备就绪。

$(function(){
//code that needs to be executed when DOM is ready, after manipulation
});

$() calls a function that either registers a DOM-ready callback (if a function is passed to it) or returns elements from the DOM (if a selector string or element is passed to it)

You can find more here
difference between $ and $() in jQuery
http://api.jquery.com/ready/

于 2018-09-12T23:59:31.760 回答