You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AngularJS获取SVG图像的path id?现有代码失效求建议

解决SVG路径ID获取与点击事件绑定问题

我来帮你梳理下当前代码的问题和可行的解决方案:

  • 补全代码的语法缺陷
    你写的addEventListener('click'明显没写完,完整的点击事件绑定应该是这样的,这样才能拿到点击路径的ID:

    p[i].addEventListener('click', function() {
        console.log('当前点击的Path ID:', this.id);
    });
    
  • 适配AngularJS的DOM操作时机
    你直接用原生JS获取<object>元素绑定事件,很可能在Angular还没完成模板渲染的时候就执行了,导致找不到目标元素。AngularJS推荐用指令来处理DOM操作,这样能确保元素已经渲染完成:
    先定义一个指令:

    var app = angular.module("myApp", []);
    app.controller('uiCtrl', function($scope) {
        $scope.list1 = {img : '你的SVG地址'};
        $scope.selectedPathId = ''; // 用来存选中的Path ID
    });
    
    app.directive('svgLoader', function() {
        return {
            link: function(scope, element) {
                // 监听object的load事件,确保SVG加载完成
                element.on('load', function() {
                    var svgDoc = this.contentDocument;
                    var paths = svgDoc.querySelectorAll('path');
                    // 给每个path绑定点击事件
                    angular.forEach(paths, function(path) {
                        path.addEventListener('click', function() {
                            var pathId = this.id;
                            console.log('点击的Path ID:', pathId);
                            // 把ID同步到Angular的scope中(需要用$apply触发视图更新)
                            scope.$apply(function() {
                                scope.selectedPathId = pathId;
                            });
                        });
                    });
                });
            }
        };
    });
    

    然后在模板里使用这个指令:

    <div ng-app="myApp" ng-controller="uiCtrl">
        <object data="{{list1.img}}" svg-loader></object>
        <p>选中的Path ID: {{selectedPathId}}</p>
    </div>
    
  • 注意跨域限制
    如果你的SVG文件和当前页面不在同一个域名下,浏览器的同源策略会阻止你访问contentDocument,这时候你需要把SVG文件放到和页面同域的服务器上,或者配置服务器允许跨域访问。

  • 如果想用jQuery实现
    要是你习惯用jQuery,也可以这么写(但还是建议优先用Angular指令):

    // 确保jQuery已引入,且在Angular渲染完成后执行
    app.controller('uiCtrl', function($scope, $timeout) {
        $scope.list1 = {img : '你的SVG地址'};
        $timeout(function() {
            $('object').on('load', function() {
                var $paths = $(this.contentDocument).find('path');
                $paths.on('click', function() {
                    console.log('点击的Path ID:', $(this).attr('id'));
                });
            });
        });
    });
    

内容的提问来源于stack exchange,提问作者Pratyush Pranjal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:21:00