Javascript 为什么属性初始化中的jQuery对象为空?

Javascript 为什么属性初始化中的jQuery对象为空?,javascript,hoisting,Javascript,Hoisting,显然,对象属性中的元素不存在,但它们确实存在!如果我不能像那样使用javascript,有人能告诉我吗 也许是因为吊装的原因破坏了剧本 我已经尝试将对象放在init之前,结果是一样的 我知道我可以扩展原型,但我有这样使用的理由 谢谢。我能想到三个可能的原因: 在解析DOM之前,正在初始化代码 HTML实际上不包含与这些选择器匹配的元素 在初始化此代码后,将动态创建所需的元素 在本宣言中: 'use strict'; var Controller = function Controller() {

显然,对象属性中的元素不存在,但它们确实存在!如果我不能像那样使用javascript,有人能告诉我吗

也许是因为吊装的原因破坏了剧本

我已经尝试将对象放在init之前,结果是一样的

我知道我可以扩展原型,但我有这样使用的理由


谢谢。

我能想到三个可能的原因:

  • 在解析DOM之前,正在初始化代码
  • HTML实际上不包含与这些选择器匹配的元素
  • 在初始化此代码后,将动态创建所需的元素
  • 在本宣言中:

    'use strict';
    var Controller = function Controller() {};
    
    Controller.init = function() {
      if (!Controller.PROPERTIE.element || !Controller.PROPERTIE.indicator) {
        return 'Expected to find [data-controller] and [data-controller-to]';
      }
    
      Controller._start();
    };
    
    Controller.PROPERTIE = {
      element: $('[data-controller]'),
      indicator: $('[data-controller-to]'),
      state: false
    };
    
    Controller._start = function() {
      Controller.PROPERTIE.indicator.bind('click', Controller._toggle);
    };
    
    Controller._toggle = function() {
      Controller.PROPERTIE.element
        .animate({
          bottom: (Controller.PROPERTIE.state = !Controller.PROPERTIE.state) ? '-110' : '0'
        });
    };
    
    解析此代码时,将立即计算这两个jQuery表达式。如果此代码没有放在正文的最后,那么这些元素可能还不存在

    通常的解决方案不是在静态声明中初始化这些元素,而是在页面加载后通过调用函数来初始化它们

    如果你真的想让他们成为全球人,那么你可以这样做:

    Controller.PROPERTIE = {
      element: $('[data-controller]'),
      indicator: $('[data-controller-to]'),
      state: false
    };
    
    但是,您还必须确保在代码运行之前不要尝试使用它们



    我能想到的唯一其他可能的原因是DOM不包含与两个选择器匹配的元素。这似乎是这两个问题中的一个。由于您既没有向我们显示要匹配的HTML的整体页面结构,我们无法告诉您可能的原因。

    我感觉您认为jQuery对象没有定义是因为:

    $(document).ready(function() {
        Controller.PROPERTIE = {
          element: $('[data-controller]'),
          indicator: $('[data-controller-to]'),
          state: false
        };
    });
    
    您必须记住,jQuery构造函数
    $()
    将始终返回一个对象。如果确实要测试是否存在选定项,则必须使用jQuery对象的length属性

    if (!Controller.PROPERTIE.element || !Controller.PROPERTIE.indicator) {
        return 'Expected to find [data-controller] and [data-controller-to]';
      }
    

    $()
    jQuery吗?它们引用DOM元素吗?它们已经被加载了吗?是的,$是jQuery,它们引用了它们存在的DOM元素,如果我尝试用jQuery将它们放在里面,我可以,但是如果我尝试获取引用,我无法确定您执行代码的顺序或您询问的属性。请明确说明您对哪个属性有问题(“对象属性”是一个通用术语-它不描述您指的是哪个属性),并显示调用代码。对不起。。。我的意思是object Controller.property中的元素,它们不存在于我的代码中,但它们存在于DOM中。我正在尝试测试元素和指标。@Amandaferari,问题是。。。在设置Controller.property之前是否存在DOM元素?(如果没有动态诡计,那么它们应该在jqueryready事件之后准备就绪)@jfriend00@AmandaFerrari-好的,您可能会错误地理解与DOM加载相关的代码,或者您的DOM不包含与这些选择器匹配的元素。“这就是其中之一。”Amandaferari——我在回答中总结了可能的原因。您的职责是调查这些问题,或者向我们展示问题发生的完整背景。好吧,我尝试使用document.ready,在我要求使用browserify的其他文件中,它可以工作。。谢谢
    if (!Controller.PROPERTIE.element.length || !Controller.PROPERTIE.indicator.length) {
        //element or indicator not there.
        return 'Expected to find [data-controller] and [data-controller-to]';
      }