Javascript 链接到div失败

Javascript 链接到div失败,javascript,jquery,html,anchor,Javascript,Jquery,Html,Anchor,我有两个页面:index.html和features.html。index.html中的按钮链接到features.html页面中的特定div,如下所示: <a href="features.html#category1">...</a> 所有JSON处理和创建这些div都发生在loadAll函数中,我已经验证该函数是否正常工作。在调试过程中,Chrome元素中最终存在一个id为的div 但问题在于:document.getElementByIdid返回null。这意味

我有两个页面:index.html和features.html。index.html中的按钮链接到features.html页面中的特定div,如下所示:

<a href="features.html#category1">...</a>
所有JSON处理和创建这些div都发生在loadAll函数中,我已经验证该函数是否正常工作。在调试过程中,Chrome元素中最终存在一个id为的div

但问题在于:document.getElementByIdid返回null。这意味着在我调用scrollToDiv时,该div尚未创建。但这怎么可能呢?所有加载都应该在loadAll函数中完成!在Chrome中调试也显示了同样的情况

怎么办


谢谢

代码运行时,内容似乎仍在通过AJAX调用加载,因此getElement返回null


我建议在调用getAnchor和scrollToDiv的请求上使用类似的回调函数,这样就可以保证内容在那里。

您没有提供loadAll的源代码,但是您提到您通过AJAX加载内容,这可能就是问题所在。请记住,在Javascript中加载AJAX资源是异步的,这意味着$.post、$.get、$.AJAX或XHR操作不会在调用的运行时完成,而是在浏览器接收到资源之后完成。有趣的事实:AJAX调用通常不可能在请求开始的起始点(代码中的起始点)之外的流继续之前完成,除非在XMLHTTPRequest上使用sync选项,这在大多数情况下都是一件坏事


您应该做的是将滚动到锚点的逻辑移动到一个函数中,然后在所有AJAX请求返回并且所有内容都设置好后调用该函数。如果您需要请求多个资源,您可以保留一个引用计数器,并在所有资源都计算完毕后启动锚滚动功能。

我假设您的loadAll具有异步组件。如果是这种情况,则可能需要loadall在回调完成后执行回调。在这个回调中,您将包括滚动到div的调用。另外,由于您使用的是jQuery,look into deferred.features.htmlcategory1意味着page feature.html转到html名称为class='category1'的元素。您的jQuery看起来是重复的,试图完成同样的事情。另外,您正在使用document.URL,然后将其拆分。您应该使用location.hash.replace或document.URL.replace。但是,如果您只想单击一个页面的链接并转到另一个页面的HTML名称属性,则根本不需要jQuery,除非您想应用滚动效果或其他什么。谢谢您的回答。正如建议的那样,我使用了$document.ajaxCompletefunction{//scrolling code here};。这种方法虽然有效,但并不完美。有一秒钟,我看到了完美的Div,但随后json中的更多内容在上面/下面加载,屏幕随之移动。我怎样才能得到它,使滚动不仅发生在所有ajax请求完成之后,而且也发生在所有json解析完成之后?
$(document).ready(function () {
    //does all JSON parsing and creation of divs and other elements
    loadAll();

    //scroll to appropriate div
    var id = getAnchor();
    scrollToDiv(id);
});

function scrollToDiv(id) {
   window.scrollTo(0, document.getElementById(id).offsetTop); 
}

function getAnchor() {  
    var currUrl = document.URL;
    var parts   = currUrl.split('#');

    return (parts.length > 1) ? parts[1] : null;
}