jquery AngularJS使用document.getElementById只查找元素一次

xdyibdwo  于 2023-06-22  发布在  jQuery
关注(0)|答案(1)|浏览(168)

当你点击一个特定的项目时,会有一个页面,面板会出现在右边。
当面板打开时调用Angular JS代码进行操作。
Angular JS代码应该在HTML文档中查找id值为'view-link'的元素。
但是,它只在面板第一次打开时查找项目,而在面板关闭然后重新打开时无法找到元素。
在开发者模式下,元素查找通常使用与代码相同的语法执行。
我必须刷新(F5)才能再次检索它。
有什么问题吗?
将其视为变量或控制器初始化问题,我们已将link_element_2变量配置为在link_element没有href值时进行初始化。
您试图查找的html代码如下所示,并且在面板打开时始终包含该代码。

<a id="view-link" href="https://www.google.com">https://www.google.com</a>

我的代码:

var app = angular.module('myApp', []);

app.controller('myCtrl', function($scope) {
     console.log('widget load!!!');
     var link_element = null;
     var link_element_2 = null;
     console.log(link_element);
     var youtube_link = null;
     console.log(youtube_link);
     
    link_element = angular.element(document.getElementById('view-link'));
    console.log('link_element IS');
    console.log(link_element);
  
    if(link_element.attr('href') == undefined)
    {
        console.log('In if case');
        link_element_2 = angular.element(document.getElementById('view-link'));
        console.log('link_element_2 IS');
        console.log(link_element_2);
    }
        
    $scope.controllerActive = true;
              
    $scope.$on("$destroy", function() {
        $scope.controllerActive = false;
        console.log("Controller destroyed");
    });
 
});

其结果如下。
屏幕是开发者模式下的控制台日志。
enter image description here

cqoc49vn

cqoc49vn1#

看来你遇到了时间问题。JavaScript代码在新的DOM元素(在面板打开时引入)完全加载之前执行。这会导致脚本无法通过元素ID找到元素,因为在执行时,它还不存在于DOM中。要解决这个问题,你应该使用Angular的$timeout服务。

var app = angular.module('myApp', []);

app.controller('myCtrl', ['$scope', '$timeout', function($scope, $timeout) {
     console.log('widget load!!!');
     var link_element = null;
     var link_element_2 = null;
     console.log(link_element);
     var youtube_link = null;
     console.log(youtube_link);
     
     $timeout(function() {
        link_element = angular.element(document.getElementById('view-link'));
        console.log('link_element IS');
        console.log(link_element);
      
        if(link_element.attr('href') == undefined)
        {
            console.log('In if case');
            link_element_2 = angular.element(document.getElementById('view-link'));
            console.log('link_element_2 IS');
            console.log(link_element_2);
        }
     });

     $scope.controllerActive = true;

     $scope.$on("$destroy", function() {
         $scope.controllerActive = false;
         console.log("Controller destroyed");
     });

}]);

如果成功了告诉我。

相关问题