jQuery 不选择具有动态 ID 的元素,如何做到这一点?

Posted

技术标签:

【中文标题】jQuery 不选择具有动态 ID 的元素,如何做到这一点?【英文标题】:jQuery doesn't select the element with dynamic ID, how to do that? 【发布时间】:2018-05-03 16:09:46 【问题描述】:

当我通过指令传递 ID 时遇到问题。我无法在 Link 函数中使用 jQuery 获取元素,并且该元素使用正确的动态 ID 作为参数:

指令:

(function(angular) 
  var app = angular.module('pi.core');
  app.directive('piSearch', function() 
    return 
      restrict: 'E',
      transclude: true,
      replace: true,
      scope:   
        idelement: '@'
      ,
      link: function(scope, element, attrs, controller, transcludeFn) 
        var idelement = scope.idelement;

        console.log('idElement: ' + idelement);
        console.log($('#' + idelement + ' .typeahead'));
      ,
      template: '<div id="idelement"></div>'
    ;
  );
)(angular);

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

      myApp.directive("piSearch", function() 
        return 
          restrict: 'E',
          transclude: true,
          replace: true,
          scope:   
            idelement: '@'
          ,
          link: function(scope, element, attrs, controller, transcludeFn) 
            var idelement = scope.idelement;
  
  scope.elementSelected = $('#' + idelement + ' .typeahead');
            console.log('idElement: ' + idelement);
            console.log($('#' + idelement + ' .typeahead'));
          ,
          template: '<div id="idelement"></div>'
        ;
      );
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body ng-app="piCore">
<pi-search></pi-search>
$scope.elementSelected
</body>

有什么提示吗?提前感谢您的帮助!

【问题讨论】:

您的 sn-p 不是可运行。请更新它以使其运行并演示问题(或仅使用代码块)。更多关于做shippets here. 另外:我怀疑值得回顾“Thinking in AngularJS” if I have a jQuery background? T.J.谢谢解决这个紧急情况后我会仔细阅读那篇文章 【参考方案1】:

我会重构你的链接函数,记住 Angular 有自己的生命周期,你需要确保你的模板在你的模型有值时编译,将你的逻辑包装在一个手表中

 app.directive('piSearch', function() 
    return 
      restrict: 'E',
      transclude: true,
      replace: true,
      scope:   
        idelement: '@'
      ,
      link: function(scope, element, attrs, controller, transcludeFn) 
        var idelement = scope.idelement;
        scope.$watch('idelement',function()
            scope.elementSelected = $('#' + idelement + ' .typeahead');
            console.log('idElement: ' + idelement);
            console.log($('#' + idelement + ' .typeahead'));
         );
      ,
      template: '<div id="idelement"></div>'
    ;
  );

【讨论】:

感谢 Jorge,现在尝试...但是 scope(不带 $)会出错,因为 scope.watch 不是函数,我应该转到控制器吗?? 嗨,我犯了一个错误,检查更新是'scope.$watch',我强烈建议将此逻辑保留在指令$watchdocs.angularjs.org/api/ng/type/$rootScope.Scope#$watch【参考方案2】:

尝试使用angular.element("#"+ idelement);

还要确保template: '&lt;div id="idelement"&gt;&lt;/div&gt;' 不会多次生成

【讨论】:

我在我的页面中多次使用我的指令,传递 id 因为我需要为特定元素分配一些样式...看起来 angular.element 不起作用(选择所有页面和长度都不存在) 为什么要为实现样式创建指令,您可以使用 ng-class="'class name':CONDITION" 轻松处理 因为它是一个指令,它处理带有额外优化的 twitter typeahead 插件......我现在无法在 ng-class 上添加一些东西,但我会检查我是否能够在未来……【参考方案3】:

关于动态 ID 和全局元素你必须知道的一件事:

1) 首先您必须在 javascript 中生成动态 html

2) 打印、追加或插入 DOM 中的某处

3) 现在要访问该新元素,您必须使用document 来读取该新元素,如下所示:

document.getElementById('new-generic-id');

$(document).on('click touchstart select', '#new-generic-id', function());

希望你能理解。

【讨论】:

谢谢伊维扬。 1)我是否已经通过指令中的模板进行操作了? 2) 与 1 相同 3) 在 Link 中(正确的位置?)使用 document.getElementById (变量名)查询我得到 null .... 有没有办法,即使不是优雅的临时解决方法来做一些事情?我在一页中多次使用该指令,所以这就是为什么我需要有不同的 id... 顺便说一句,我在 $(document).ready(function() 之后做 document.getElementById

以上是关于jQuery 不选择具有动态 ID 的元素,如何做到这一点?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery:在父级中选择具有类名的内部和外部第一个元素

JQuery 选择器:如何选择具有特定类 * 和 * id 的项目

如何在 jQuery 中选择具有 name 属性的元素? [复制]

jQuery 选择具有 A 或 B 或 C 类的元素

如何在jQuery中选择其兄弟元素具有文本“X”的元素?

如何使用 ID 变量在 jQuery 中选择元素?