【问题标题】:jquery change svg fill color twicejquery 两次更改 svg 填充颜色
【发布时间】:2014-06-27 06:12:14
【问题描述】:

我正在尝试使用 jQuery 更改 SVG 对象的颜色,但之后我想重置类 st24 中的所有填充属性。 但是重置后 setAttribute 不起作用。

  //Автокомплит
    $(function() {
    $( "#users" ).autocomplete({
      source: function( request, response ) {
      $.ajax({
        cache: true,
        url: "http://127.0.0.1/json.php",
        dataType: "json",
        success: function(data) {
            response($.map(data, function(item){
              return {
                label: item.username,
                placeId: item.LocationInfo.placeId,
              }}));
          }
        });
      },
    minLength: 2,
      select: function(event,ui) {
                $('#users').val(ui.item.username);
                $('#placeId').val(ui.item.placeId);
                console.log(ui.item.placeId);
                console.log(svgdom);
                var svgElement = svgdom.getElementById(ui.item.placeId);
                //Если id елемента есть в svg файле - меняем аттрибур fill, если нет генерируем алерт
                if (svgElement) {
                  var st24 = svgdom.getElementsByClassName("st24");
                  $.each(st24, function( i, val) {
                    val.setAttribute("fill", "none");
                  });
                  svgElement.setAttribute("fill", "#008000");
                } else {
                  generate('information');
                }
            }
      });
});
}); 

如果我试试这个:

          $.each(st24, function( i, val) {
            val.setAttribute("fill", "#008000");
          });

完美运行 - 所有元素都具有此属性,但是当我将 setAttribute 填充更改为 none 并在此代码后添加以下行:svgElement.setAttribute("fill", "#008000"); 时,它不起作用 - 为什么?

更新: 这是我所有的代码:

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="libs/jquery-2.1.1.min.js"></script>
    <script src="libs/jquery-ui-1.10.4.js" type="text/javascript"></script>
    <script src="libs/jquery.panzoom.js"></script>
    <script src="libs/jquery.mousewheel.js"></script>
    <script src="libs/noty/packaged/jquery.noty.packaged.min.js" type="text/javascript"></script>
    <script src="libs/svg-pan-zoom.min.js"></script>
    <link href="css/style.css" rel="stylesheet">
    <link type="text/css" href="css/jquery-ui-1.10.4.custom.css" rel="stylesheet" />
  </head>

  <body>
  <a id="link" href="admin.html">Admin</a> 
<div class="ui-widget">
      <label for="users">users: </label>
      <input id="users" type="text" />
      <input readonly="readonly" id="placeId" name="placeId" />
</div>
<embed src="svg/5.svg" width="900" height="900" id="imap"/>
<script>

//Всплывающие сообщения
function generate(type) {
  var n = noty({
    text        : "Sorry place not found",
    type        : type,
    dismissQueue: true,
    layout      : 'topCenter',
    theme       : 'defaultTheme',
    timeout: 2000,
  });
}

function generateInf() {
  generate('information');
}


// Начинаем работу когда страница полностью загружена (включая графику)
$(window).load(function () {
  // Получаем доступ к SVG DOM
  var svgdom = document.getElementById('imap').getSVGDocument();

  svgPanZoom('#imap', {
    zoomEnabled: true,
    controlIconsEnabled: true
  });


  function clearSvg() {
    var st24 = svgdom.getElementsByClassName("st24");
    $.each(st24, function(i, val) {
      val.removeAttribute("fill");
    });
  }

  function setColor(elem) {
    elem.setAttribute("fill", "#008000");
  }

  //Автокомплит
    $(function() {
    $( "#users" ).autocomplete({
      source: function( request, response ) {
      $.ajax({
        cache: true,
        url: "http://127.0.0.1/json.php",
        dataType: "json",
        success: function(data) {
            response($.map(data, function(item){
              return {
                label: item.username,
                placeId: item.LocationInfo.placeId,
              }}));
          }
        });
      },
    minLength: 2,
      select: function(event,ui) {
                $('#users').val(ui.item.username);
                $('#placeId').val(ui.item.placeId);
                console.log(ui.item.placeId);
                console.log(svgdom);
                var svgElement = svgdom.getElementById(ui.item.placeId);
                //Если id елемента есть в svg файле - меняем аттрибур fill, если нет генерируем алерт
                if (svgElement) {
                  clearSvg();
                  setColor(svgElement);
                } else {
                  generate('information');
                }
            }
      });
});
}); 
</script> 
  </body>

</html>

【问题讨论】:

    标签: javascript jquery svg colors fill


    【解决方案1】:

    fill 设置为none 不会删除填充。它是说“这个元素没有填充”。所以在&lt;svg&gt; 父级上设置fill 不会覆盖它。孩子的价值优先。

    如果您想从孩子使用中删除填充设置

    val.removeAttribute('fill');
    

    更新

    试试这样的:

    if (svgElement) {
      var st24 = svgdom.getElementsByClassName("st24");
      $.each(st24, function( i, val) {
        val.removeAttribute("fill");
      });
      svgElement.setAttribute("fill", "#008000");
    } else ...
    

    更新 2

    看看这个小提琴。希望它可以帮助解释我的意思。

    http://jsfiddle.net/gt7nd/1/

    【讨论】:

    • 当我尝试这个时:var st24 = svgdom.getElementsByClassName("st24"); $.each(st24, function(i, val) { val.setAttribute("fill", "#000000"); }); svgElement.setAttribute("fill", "#008000"); 也不行。
    • 嗯?那不是我建议的。我会用一些代码更新我的答案。
    • 是的,我试试这个。移除一个属性并重新设置它不起作用((可能SVG不能同时移除和设置属性?
    • 如果需要,我可以将 svg 文件添加到问题中。如果需要。
    • BigBadaboom,谢谢你的帮助!这是我的错误,你的代码工作完美!我把 id 和 class 弄混了。
    【解决方案2】:

    使用这个

    $(val).css('fill',"#008000");
    

    或者这个

    val.style.fill = "#000800"
    

    【讨论】:

      【解决方案3】:

      我的 SVG 代码:

              <g id="505Б-1" place="place" v:mID="1937" v:groupContext="shape" transform="translate(206.929,-334.488)" class="test">
              <title>Circle, ellipse.1937</title>
              <v:userDefs>
                  <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
              </v:userDefs>
              <path transform="" d="M0 837.64 A4.25197 4.25197 0 0 1 8.5 837.64 A4.25197 4.25197 0 1 1 0 837.64 Z" class="st24"/>
          </g>
      

      我使用类“test”而不是“st24”,现在一切正常!

      【讨论】:

        猜你喜欢
        • 2017-01-01
        • 1970-01-01
        • 2017-03-13
        • 2020-07-03
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多