Javascript 角度观察div大小

Javascript 角度观察div大小,javascript,angularjs,onchange,Javascript,Angularjs,Onchange,我仍在学习AngularJS的工作原理,我正在研究$watch的工作原理。我有一个场景,我想观察div.id=“area”的维度。因为我在观察维度,所以我计划在值发生任何变化时触发一个函数(clientWidth和clientHeight) 到目前为止,根据我对$watch的理解,我得到的是: $scope.browser = { width: document.getElementById("area").offsetWidth, height: document.getEle

我仍在学习AngularJS的工作原理,我正在研究
$watch的工作原理。我有一个场景,我想观察
div.id=“area”
的维度。因为我在观察维度,所以我计划在值发生任何变化时触发一个函数(
clientWidth
clientHeight

到目前为止,根据我对
$watch
的理解,我得到的是:

$scope.browser = {
    width: document.getElementById("area").offsetWidth,
    height: document.getElementById("area").offsetHeight
};
console.log($scope.browser);
$scope.$watch("browser", function(newValue, oldValue) {
    console.log("changed from: " + oldValue.width + " to " + newValue.width);
}, true);
你知道我怎样才能让手表工作吗?

试试看

scope.browser = {
    width: document.getElementById("area").offsetWidth,
    height: document.getElementById("area").offsetHeight
};

$scope.$watch(function() {
    console.log("changed from: " + $scope.browser.width + " to " +  $scope.browser.width);
});
试试看

scope.browser = {
    width: document.getElementById("area").offsetWidth,
    height: document.getElementById("area").offsetHeight
};

$scope.$watch(function() {
    console.log("changed from: " + $scope.browser.width + " to " +  $scope.browser.width);
});
试试看

scope.browser = {
    width: document.getElementById("area").offsetWidth,
    height: document.getElementById("area").offsetHeight
};

$scope.$watch(function() {
    console.log("changed from: " + $scope.browser.width + " to " +  $scope.browser.width);
});
试试看

scope.browser = {
    width: document.getElementById("area").offsetWidth,
    height: document.getElementById("area").offsetHeight
};

$scope.$watch(function() {
    console.log("changed from: " + $scope.browser.width + " to " +  $scope.browser.width);
});

问题是,您正在监视不可变对象<创建
$scope.browser
时,代码>宽度和
高度将被读取一次。因为这些值永远不会更新,
$watch
将永远不会触发回调

有几种解决方案:

1) 您可以查看函数值而不是对象值,例如:

$scope.$watch(function() {
   return {
     width: document.getElementById("area").offsetWidth,
     height: document.getElementById("area").offsetHeight
   }
}, function(newValue, oldValue) {
   console.log("changed from: " + oldValue.width + " to " + newValue.width);
}, true);
这是非常低效的(访问DOM的速度很慢),但如果其他解决方案不可能应用于您的情况,那么这是可能的

2) 查找
#area
改变其尺寸的情况。是浏览器大小调整吗?是jQuery/另一个3d派对脚本吗?例如,要截取窗口大小,可以使用以下指令:

.directive('windowResize',['$parse', '$timeout', function($parse, $timeout){
  return function($scope, $element, $attrs) {
    var fn = $parse($attrs.windowResize);
    $(window).on('resize', function(){
      $scope.$apply(function() {
        fn($scope);
      });
    });
}])

//template
<div id="area" window-resize="onWindowResize()"></div>
如果发生事件,您可以在自己的范围内收听:

$scope.$on('areaDimensionsUpdated', function($event, args) {
  //
});

问题是,您正在监视不可变对象<创建
$scope.browser
时,代码>宽度和
高度将被读取一次。因为这些值永远不会更新,
$watch
将永远不会触发回调

有几种解决方案:

1) 您可以查看函数值而不是对象值,例如:

$scope.$watch(function() {
   return {
     width: document.getElementById("area").offsetWidth,
     height: document.getElementById("area").offsetHeight
   }
}, function(newValue, oldValue) {
   console.log("changed from: " + oldValue.width + " to " + newValue.width);
}, true);
这是非常低效的(访问DOM的速度很慢),但如果其他解决方案不可能应用于您的情况,那么这是可能的

2) 查找
#area
改变其尺寸的情况。是浏览器大小调整吗?是jQuery/另一个3d派对脚本吗?例如,要截取窗口大小,可以使用以下指令:

.directive('windowResize',['$parse', '$timeout', function($parse, $timeout){
  return function($scope, $element, $attrs) {
    var fn = $parse($attrs.windowResize);
    $(window).on('resize', function(){
      $scope.$apply(function() {
        fn($scope);
      });
    });
}])

//template
<div id="area" window-resize="onWindowResize()"></div>
如果发生事件,您可以在自己的范围内收听:

$scope.$on('areaDimensionsUpdated', function($event, args) {
  //
});

问题是,您正在监视不可变对象<创建
$scope.browser
时,代码>宽度和
高度将被读取一次。因为这些值永远不会更新,
$watch
将永远不会触发回调

有几种解决方案:

1) 您可以查看函数值而不是对象值,例如:

$scope.$watch(function() {
   return {
     width: document.getElementById("area").offsetWidth,
     height: document.getElementById("area").offsetHeight
   }
}, function(newValue, oldValue) {
   console.log("changed from: " + oldValue.width + " to " + newValue.width);
}, true);
这是非常低效的(访问DOM的速度很慢),但如果其他解决方案不可能应用于您的情况,那么这是可能的

2) 查找
#area
改变其尺寸的情况。是浏览器大小调整吗?是jQuery/另一个3d派对脚本吗?例如,要截取窗口大小,可以使用以下指令:

.directive('windowResize',['$parse', '$timeout', function($parse, $timeout){
  return function($scope, $element, $attrs) {
    var fn = $parse($attrs.windowResize);
    $(window).on('resize', function(){
      $scope.$apply(function() {
        fn($scope);
      });
    });
}])

//template
<div id="area" window-resize="onWindowResize()"></div>
如果发生事件,您可以在自己的范围内收听:

$scope.$on('areaDimensionsUpdated', function($event, args) {
  //
});

问题是,您正在监视不可变对象<创建
$scope.browser
时,代码>宽度和
高度将被读取一次。因为这些值永远不会更新,
$watch
将永远不会触发回调

有几种解决方案:

1) 您可以查看函数值而不是对象值,例如:

$scope.$watch(function() {
   return {
     width: document.getElementById("area").offsetWidth,
     height: document.getElementById("area").offsetHeight
   }
}, function(newValue, oldValue) {
   console.log("changed from: " + oldValue.width + " to " + newValue.width);
}, true);
这是非常低效的(访问DOM的速度很慢),但如果其他解决方案不可能应用于您的情况,那么这是可能的

2) 查找
#area
改变其尺寸的情况。是浏览器大小调整吗?是jQuery/另一个3d派对脚本吗?例如,要截取窗口大小,可以使用以下指令:

.directive('windowResize',['$parse', '$timeout', function($parse, $timeout){
  return function($scope, $element, $attrs) {
    var fn = $parse($attrs.windowResize);
    $(window).on('resize', function(){
      $scope.$apply(function() {
        fn($scope);
      });
    });
}])

//template
<div id="area" window-resize="onWindowResize()"></div>
如果发生事件,您可以在自己的范围内收听:

$scope.$on('areaDimensionsUpdated', function($event, args) {
  //
});

试试这个。它更符合你的要求。打印窗口的尺寸而不是div

function Dimensions($scope){
    $scope.docWidth = 0;
    $scope.docHeight = 0;

}

试试这个。它更符合你的要求。打印窗口的尺寸而不是div

function Dimensions($scope){
    $scope.docWidth = 0;
    $scope.docHeight = 0;

}

试试这个。它更符合你的要求。打印窗口的尺寸而不是div

function Dimensions($scope){
    $scope.docWidth = 0;
    $scope.docHeight = 0;

}

试试这个。它更符合你的要求。打印窗口的尺寸而不是div

function Dimensions($scope){
    $scope.docWidth = 0;
    $scope.docHeight = 0;

}


它不起作用。此外,我认为最好看
$scope.browser
,而不是看整个
$scope
。它不起作用。此外,我认为最好看
$scope.browser
,而不是看整个
$scope
。它不起作用。此外,我认为最好看
$scope.browser
,而不是看整个
$scope
。它不起作用。此外,我认为最好是观看
$scope.browser
,而不是观看整个
$scope
。如果您提供的指令片段中没有包含jQuery,是否可能?当然可以。jQuery在这里只是检索DOM元素和分派事件。您也可以使用纯JS实现这一点,但您必须记住浏览器兼容性和一些怪癖。我将把这些问题留给jQuery。如果
jQuery
angular
一起使用,会不会有冲突?不会。事实上,angular使用jQuery,如果它包含在页面中。否则,它将使用自己的jQuery实现,称为jqLite。如果您提供的指令片段中没有包含jQuery,是否可能?当然可以。jQuery在这里只是检索DOM元素和分派事件。您也可以使用纯JS实现这一点,但您必须记住浏览器兼容性和一些怪癖。我将把这些问题留给jQuery。如果
jQuery
angular
一起使用,会不会有冲突?不会。事实上,angular使用jQuery,如果它包含在页面中。否则,它将使用自己的jQuery实现,称为jqLite。如果您提供的指令片段中没有包含jQuery,是否可能?当然可以。jQuery在这里只是检索DOM元素和分派事件。您也可以使用纯JS实现这一点,但您必须记住浏览器兼容性和一些怪癖。