Javascript 角度观察div大小
我仍在学习AngularJS的工作原理,我正在研究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
$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实现这一点,但您必须记住浏览器兼容性和一些怪癖。