【问题标题】:jQuery $("#Div").height() returns undefinedjQuery $("#Div").height() 返回未定义
【发布时间】:2017-10-06 07:07:07
【问题描述】:

问题

似乎 jQuery 已加载并正在运行,但它尝试使用的元素(<div>s)尚不可用,因此它只是返回未定义。问题可能是该项目包含也使用$ 符号的AngularJS 框架。知道这一点后,我修改了我的 jQuery 代码,以 jQuery(document).ready(function($) { ... 开头,但似乎并没有解决问题。我还添加了jQuery.noConflict();,这也没有帮助。我也试过这种模式:

var $j = jQuery.noConflict();
// $j is now an alias to the jQuery function; creating the new alias is optional.

$j(document).ready(function() {
    $j( "div" ).hide();
});

那也没有用。我尝试在index.html 中移动脚本,将jQuery 和bootstrap.min.js(因为引导程序依赖于jQuery)放在脚本的底部、顶部或中间。这改变了结果,但它仍然是错误的结果。我有时会从console.log() 得到undefined undefined undefined 0 作为所有divs 的高度的结果。

很奇怪的问题。在我尝试使用 jQuery 执行此操作之前,我实际上只是使用了 JavaScript,但后来我尝试了 jQuery,因为我读到了 ready() 方法,因为我认为 HTML 元素本身还没有“准备好”使用。

注意:$("#contentDivision") 是问题的最重要特征,因为它是动态填充的,因此它的高度会随着文档加载而变化,这意味着 jQuery 需要在 $("#contentDivision") 填满所有文字和图片(这是一个博客)。

导致我产生这种想法的另一件事是,在 chrome 控制台中编写与 main.js 中完全相同的 jQuery 代码会产生正确的结果。

我还需要帮助创建某种侦听器或其他东西以动态重新运行 jQuery 脚本,以便窗口为每种类型的屏幕适当地调整其高度。

感谢任何帮助,谢谢。

main.js(包含我的 jQuery 代码)

jQuery.noConflict();
jQuery(document).ready(function($) {
console.log('jQuery(document) is ready');
console.log($(window).height());   // returns height of browser viewport
console.log($(document).height()); // returns height of HTML document
console.log(
    $("#panelDivision").height() + " " +
    $("#scrollDivision").height() + " " +
    $("#contentDivision").height() + " " +
    $("#extraDivision").height()
);

var $max = Math.max($("#contentDivision").height(), $("#extraDivision").height());
console.log($max);

$("#scrollDivision").height($max - $("#panelDivision").height());
$("#contentDivision").height($max);
$("#extraDivision").height($max);
});

我从 jQuery 得到的输出

jQuery(document) is ready
949
1299
75 0 undefined 800
NaN

index.html(省略css链接和元标记)

<body ng-app="myApp">
<div class="main_container">
<navbar></navbar>
<div class="container-fluid page-wrap">
    <div class="row">
        <div id="leftDivision" class="col-md-3 paddingRemove side-posts">
            <posts></posts>
        </div>
        <div id="contentDivision" class="col-md-7 paddingRemove white-container" ng-view></div>
        <div id="extraDivision" class="col-md-2 paddingRemove white-container">
            <lorem></lorem>
        </div>
    </div>
</div>
<foobar></foobar>
</div>

<!-- Imported JavaScript Files -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular-route.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular-sanitize.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

<!-- Local Angular-related JavaScript Files -->
<script src="client/js/app.js" type="text/javascript"></script>
<script src="client/js/main.controller.js" type="text/javascript"></script>
<script src="client/js/auth.controller.js" type="text/javascript"></script>
<script src="client/js/blog.controller.js" type="text/javascript"></script>
<script src="client/js/directives.js" type="text/javascript"></script>
<script src="client/js/filters.js" type="text/javascript"></script>
<script src="client/js/factories.js" type="text/javascript"></script>

<script src="client/js/main.js" type="text/javascript"></script>
</body>

</html>

【问题讨论】:

  • 我的 angularJS 时间已经很久了,但我知道您在 oncontentDivision 上使用的 ng-view 在第一步中只会在 dom 中创建评论。只有在插入之后才会创建 div。 docs.angularjs.org/api/ngRoute/directive/ngView阅读这里,我无法解释,所以我不能给出正确的答案
  • 我在 html 中看不到 id="Div"。

标签: jquery html angularjs


【解决方案1】:

在 AngularJS 脚本之前加载 jQuery 脚本:

<!-- Imported JavaScript Files -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular-route.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular-sanitize.min.js"></script>

虽然我不得不说,你甚至不需要 jQuery,因为 AngularJS 可以做你想做的所有事情。

【讨论】:

  • 奇怪的是我没想那么多。你会怎么做呢?可能是$scope。抱歉,我对此没有太多经验。
【解决方案2】:

ng-view 渲染概念的问题。

ngView 是一个指令,它通过将当前路由的渲染模板包含到主布局 (index.html) 文件中来补充 $route 服务。每次当前路由变化时,包含的视图都会根据 $route 服务的配置而变化。


在您的代码中,您在该 div 上使用 ng-view。这样 div (Dom Element) 将在任何路由更改完成后呈现。否则 div 元素将不会呈现,这意味着您无法在 html 页面源中看到 div 标签。这就是为什么你变得不确定。


所以你可以在下面试试这个。

<div id="contentDivision" class="col-md-7 
paddingRemove white-container">
<div ng-view></div>
</div>

【讨论】:

  • 这是一个很好的提示,但控制台仍然会记录 75 0 137 800,其中 137 是内容的像素高度,这意味着它没有被文本和图片填充。
  • @AquaSolid 这取决于您的主 div 高度而不是内容。我认为它可能来自contentDivision div 类。如果对您有帮助,请接受我的回答。
  • @AquaSolid 但我不知道你说的meaning it isn't filled up with text and pictures是什么意思??
  • 通过此建议,您将在 ng-view 呈现之前获取像素值。但是,您需要之后的高度。您需要找到一种在加载 ui-view 后运行逻辑的方法,而不是在准备好的情况下运行逻辑。
  • 那么他应该检查ng-view是否渲染。
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 2015-01-10
  • 2013-04-22
  • 1970-01-01
  • 2021-09-06
  • 2016-12-01
  • 2010-11-29
  • 2020-06-30
相关资源
最近更新 更多