AngularJS获取getElementById()不起作用及HTML与controller加载顺序问题
2018-02-09 10:45
405 查看
AngularJS项目需要引入富文本插件,富文本插件需要获取HTMLdom的id进行富文本插件初始化,所以最开始采用getElementById()方法想要获取id,但是console报出获取不到id,写法如下:
define(["app", "wangEditor"], function (app, E) {
app.controller("savingEdit", ["$scope", "$rootScope",'$timeout',
function ($scope, $rootScope,$timeout) {
//富文本编辑器,引入wangEditor组建,并初始化
var editeditor;
$scope.myEditorClick = function () {
//初始化E
editeditor = new E(document.getElementById("myEditEditor"));
//渲染富文本编辑器
editeditor.create();
}
$scope.myEditorClick();
}
]);
});<div id="myEditEditor"></div>
上面这种写法会报myEditEditor为空id。
经过分析,我推测是因为AngularJS在加载controller时,对应的HTML文件并没有加载完成,他们可能是同时加载的。在网上搜索了很多办法,最后我总结出如下两种办法实现id的正常获取:
1.$timeout延时处理
这个办法显而易见,既然直接加载获取不到,那就价格延时,等html加载了在执行js渲染。代码如下:
define(["app", "wangEditor"], function (app, E) {
app.controller("savingEdit", ["$scope", "$rootScope",'$timeout',
function ($scope, $rootScope,$timeout) {
//富文本编辑器,引入wangEditor组建,并初始化
var editeditor;
$scope.myEditorClick = function () {
//初始化E
editeditor = new E(document.getElementById("myEditEditor"));
//渲染富文本编辑器
editeditor.create();
}
$timeout(function () {
$scope.myEditorClick();
},300);
}
]);
});
大家一般是监听ng-repeat是否渲染完最后一条来监听,你也可以监听其他html是否渲染完成。以ng-repeat为例,代码如下:
app.directive('repeatFinish',function(){
return {
link: function(scope,element,attr){
console.log(scope.$index)
if(scope.$last == true){
scope.$eval( attr.repeatFinish )
}
}
}
})
define(["app", "wangEditor"], function (app, E) {
app.controller("savingEdit", ["$scope", "$rootScope",'$timeout',
function ($scope, $rootScope,$timeout) {
//富文本编辑器,引入wangEditor组建,并初始化
var editeditor;
$scope.myEditorClick = function () {
//初始化E
editeditor = new E(document.getElementById("myEditEditor"));
//渲染富文本编辑器
editeditor.create();
}
$scope.myEditorClick();
}
]);
});<div id="myEditEditor"></div>
上面这种写法会报myEditEditor为空id。
经过分析,我推测是因为AngularJS在加载controller时,对应的HTML文件并没有加载完成,他们可能是同时加载的。在网上搜索了很多办法,最后我总结出如下两种办法实现id的正常获取:
1.$timeout延时处理
这个办法显而易见,既然直接加载获取不到,那就价格延时,等html加载了在执行js渲染。代码如下:
define(["app", "wangEditor"], function (app, E) {
app.controller("savingEdit", ["$scope", "$rootScope",'$timeout',
function ($scope, $rootScope,$timeout) {
//富文本编辑器,引入wangEditor组建,并初始化
var editeditor;
$scope.myEditorClick = function () {
//初始化E
editeditor = new E(document.getElementById("myEditEditor"));
//渲染富文本编辑器
editeditor.create();
}
$timeout(function () {
$scope.myEditorClick();
},300);
}
]);
});
<div id="myEditEditor"></div>2.通过directive监听html文本是否渲染完成
大家一般是监听ng-repeat是否渲染完最后一条来监听,你也可以监听其他html是否渲染完成。以ng-repeat为例,代码如下:
app.directive('repeatFinish',function(){
return {
link: function(scope,element,attr){
console.log(scope.$index)
if(scope.$last == true){
scope.$eval( attr.repeatFinish )
}
}
}
})
<div id="box"> <span ng-repeat="item in data" repeat-finish="renderFinish()">{{item.str}}</span> </div>
相关文章推荐
- javascript在html中的加载顺序------为什么window.alert(document.getElementById("time").innerTex)无法弹出对话框
- 在document.getElementById("oDiv").innerHTML="JS执行问题";
- document.getElementById 不能获取值的问题
- getElementById获取不到标签的问题
- js表单问题之基础浅谈----getElementById和getElementsByTagName
- ie的大问题,关于document。getElementById和getElementsByName
- ASP.NET#使用母版时,如果要使用js中的getElementById()方法取得某个内容页的元素时要注意的问题
- 获取HTML元素3个方法:document.getElementsByName()、document.getElementById()、document.getElementsByTagName()
- 关于使用 document.getElementById("input").value 给输入域赋值赋不上的问题
- 根据对象名称获取对象--document.getElementById
- 获取表单对象,getElementById(), getElementsByName(), and getElementsByTagName() 和用法
- jquery中$(id)与document.getElementById;innerHTML和.html()区别
- 关于html和javascript在浏览器中的加载顺序问题的讨论
- 关于html和javascript在浏览器中的加载顺序问题的讨论(zz)
- 使用getElementById获取xml中的指定元素
- document.getElementById获取控件对象为空的解决方法
- 水滴石穿之getElementsByName()、IFRAME背景开关、HTML控件获取焦点问题
- 获取HTML元素3个方法:document.getElementsByName()、document.getElementById()、document.getElementsByTagName()
- 获取表单对象,得三种方法getElementById(), getElementsByName(), and getElementsByTagName() 和用法