RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 700750
Accepted
Yuri
Yuri
Asked:2020-08-02 03:45:14 +0000 UTC2020-08-02 03:45:14 +0000 UTC 2020-08-02 03:45:14 +0000 UTC

创建自己的函数时出现未知错误

  • 772

我正在编写自己的函数来为伪元素分配属性,并注意到一个未知错误。属性的分配通过向样式表添加行来进行。

当我在第三种情况下调用该函数时,由于某种原因第一个元素被涂成蓝色,尽管color我没有为它设置它。

(function() {
  var setPseudoElement = function(parameters) {
    for (var element of parameters.elements.get()) {
      if (!element.pseudoElements) element.pseudoElements = {
        styleSheet: null,
        before: {
          index: null,
          properties: null
        },
        after: {
          index: null,
          properties: null
        }
      };

      var selector = (function() {
        if (element.id) {
          return '#' + element.id + '::' + parameters.pseudoElement;
        } else {
          var parentsList = $(element).parents().map(function() {
            return this.tagName.toLowerCase();
          }).get().reverse().join(' > ') + ' > ' + element.tagName.toLowerCase();

          var elementClass = element.classList.length ? '.' + $(element.classList).get().join('.') : '';

          var elementAttributes = element.hasAttributes() ? $(element.attributes).get().map(function(className) {
            return className.nodeName !== 'class' ? className.nodeValue ? '[' + className.nodeName + '="' + className.nodeValue + '"]' : '[' + className.nodeName + '"]' : '';
          }).join('') : '';

          var elementNthChild = ':nth-child(' + ($(element).index() + 1) + ')';

          return parentsList + elementClass + elementAttributes + elementNthChild + '::' + parameters.pseudoElement;
        };
      })();

      if (!element.pseudoElements.styleSheet) {
        if (document.styleSheets[0]) {
          element.pseudoElements.styleSheet = document.styleSheets[0];
        } else {
          var styleSheet = document.createElement('style');

          document.head.appendChild(styleSheet);
          element.pseudoElements.styleSheet = styleSheet.sheet;
        };
      };

      if (element.pseudoElements[parameters.pseudoElement].properties !== null && element.pseudoElements[parameters.pseudoElement].index !== null) {
        element.pseudoElements.styleSheet.deleteRule(element.pseudoElements[parameters.pseudoElement].index);
      };

      if (typeof parameters.argument === 'object') {
        if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
          var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length || element.pseudoElements.styleSheet.length;

          element.pseudoElements[parameters.pseudoElement].index = newIndex;
          element.pseudoElements[parameters.pseudoElement].properties = parameters.argument;
        };

        var properties = '';

        for (var property in parameters.argument) {
          element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property];
        };

        for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
          properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
        };

        element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
      } else if (parameters.argument !== undefined && parameters.property !== undefined) {

      } else if (parameters.argument !== undefined && parameters.property === undefined) {

      } else {
        console.error('Invalid values!');
        return false;
      };
    };
  };

  $.fn.cssBefore = function(argument, property) {
    setPseudoElement({
      elements: this,
      pseudoElement: 'before',
      argument: argument,
      property: property
    });
  };
})();

$(function() {
  // Случай 1
  $('.el0').cssBefore({
    'content': '"Новый \'before\'"',
    'color': 'green'
  });
  // Случай 2
  $('.el1').cssBefore({
    'content': '"Новый \'before\' №2"',
    'color': 'blue'
  });
  // Случай 3
  $('.el0').cssBefore({
    'content': '"Новый \'before\' №3"'
  });
});
.element {
  width: 480px;
  margin: 0 auto;
  border: 2px solid red;
}

.element:before {
  content: "Старый 'before'";
  color: orange;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<div class="element el0" name="MyName"></div>
<div class="element el0 el1" id="elem"></div>
<div>
  <div class="element el1"></div>
</div>

为什么在第三种情况下第一个元素被涂成蓝色?如何解决?


更新:

如果在每次赋值后将元素的值打印到控制台,那么就会出现非常奇怪的值:

(function () {
    var i = 1;

    var setPseudoElement = function (parameters) {
        for (var element of parameters.elements.get()) {
            if (!element.pseudoElements) element.pseudoElements = {styleSheet: null, before: {index: null, properties: null}, after: {index: null, properties: null}};
            
            var selector = (function () {
                if (element.id) {
                    return '#' + element.id + '::' + parameters.pseudoElement;
                } else {
                    var parentsList = $(element).parents().map(function () {
                        return this.tagName.toLowerCase();
                    }).get().reverse().join(' > ') + ' > ' + element.tagName.toLowerCase();

                    var elementClass = element.classList.length ? '.' + $(element.classList).get().join('.') : '';

                    var elementAttributes = element.hasAttributes() ? $(element.attributes).get().map(function (className) {
                        return className.nodeName !== 'class' ? className.nodeValue ? '[' + className.nodeName + '="' + className.nodeValue + '"]' : '[' + className.nodeName + '"]' : '';
                    }).join('') : '';

                    var elementNthChild = ':nth-child(' + ($(element).index() + 1) + ')';

                    return parentsList + elementClass + elementAttributes + elementNthChild + '::' + parameters.pseudoElement;
                };
            })();

            if (!element.pseudoElements.styleSheet) {
                if (document.styleSheets[0]) {
                    element.pseudoElements.styleSheet = document.styleSheets[0];
                } else {
                    var styleSheet = document.createElement('style');

                    document.head.appendChild(styleSheet);
                    element.pseudoElements.styleSheet = styleSheet.sheet;
                };
            };

            if (element.pseudoElements[parameters.pseudoElement].properties !== null && element.pseudoElements[parameters.pseudoElement].index !== null) {
                element.pseudoElements.styleSheet.deleteRule(element.pseudoElements[parameters.pseudoElement].index);
            };

            if (typeof parameters.argument === 'object') {
                if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
                    var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length ||  element.pseudoElements.styleSheet.length;

                    element.pseudoElements[parameters.pseudoElement].index = newIndex;
                    element.pseudoElements[parameters.pseudoElement].properties = parameters.argument;
                };

                var properties = '';

                for (var property in parameters.argument) {
                    element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property];
                };

                for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
                    properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
                };

                element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
            
                console.log('Номер запуска: ' + Math.round(i / 2) + '; Номер присваивания элементу: ' + i);
                console.log({
                    'Элемент 1': $('.el0:not(.el1)').get(0).pseudoElements,
                    'Элемент 2': $('.el0.el1').get(0).pseudoElements,
                    'Элемент 3': $('.el1:not(.el0)').get(0).pseudoElements
                });
                i++;
            } else if (parameters.argument !== undefined && parameters.property !== undefined) {

            } else if (parameters.argument !== undefined && parameters.property === undefined) {

            } else {
                console.error('Invalid values!');
                return false;
            };
        };
    };

    $.fn.cssBefore = function (argument, property) {
        setPseudoElement ({
            elements: this, 
            pseudoElement: 'before', 
            argument: argument, 
            property: property
        });
    };
})();

$(function() {
  // Случай 1
  $('.el0').cssBefore({
    'content': '"Новый \'before\'"',
    'color': 'green'
  });
  // Случай 2
  $('.el1').cssBefore({
    'content': '"Новый \'before\' №2"',
    'color': 'blue'
  });
  // Случай 3
  $('.el0').cssBefore({
    'content': '"Новый \'before\' №3"'
  });
});
.element {
  width: 480px;
  margin: 0 auto;
  border: 2px solid red;
}

.element:before {
  content: "Старый 'before'";
  color: orange;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<div class="element el0" name="MyName"></div>
<div class="element el0 el1" id="elem"></div>
<div>
  <div class="element el1"></div>
</div>

如果您查看控制台,那么在第一次调用该函数时,1 号元素为蓝色,3 号内容

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Drag13
    2020-08-04T19:52:20Z2020-08-04T19:52:20Z

    我想我发现了问题:

    element.pseudoElements[parameters.pseudoElement].properties = parameters.argument;
    

    哪里parameters.argument是一个对象。当我们进行第一遍时,我们将它设置为第一个和第二个元素。在第二次传递时,我们针对第二种情况更改它,它也会针对第一种情况进行更改。

    这是证明和解决方案

    element.pseudoElements[parameters.pseudoElement].properties = Object.assign({}, parameters.argument);
    
    • 10
  2. Vyacheslav Potseluyko
    2020-08-04T20:04:45Z2020-08-04T20:04:45Z

    这就是您期望的行为方式。最初的问题是什么 - 虽然我明白,但我会在半小时内添加它。setTimeouts 是为了方便调试,如果有的话。同志们,对于我的生活,我不明白它为什么有效以及首先通常是什么错误。混淆元素循环体中的滑动parameters,因为从逻辑上讲,它不应该在循环内,工作正在用特定的循环完成element,但很可能,我只是不知道jquery。

    (function() {
      var i = 1;
    
      var setPseudoElement = function(parameters) {
        for (var element of parameters.elements.get()) {
         if (!element.pseudoElements){ element.pseudoElements = {
            styleSheet: null,
            before: {
              index: null,
              properties: null
            },
            after: {
              index: null,
              properties: null
            }
          };}
         if (element.pseudoElements) {
            element.pseudoElements.before.properties = null;
            element.pseudoElements.before.index = null;
          }
      
    
          var selector = (function() {
            if (element.id) {
              return '#' + element.id + '::' + parameters.pseudoElement;
            } else {
              var parentsList = $(element).parents().map(function() {
                return this.tagName.toLowerCase();
              }).get().reverse().join(' > ') + ' > ' + element.tagName.toLowerCase();
    
              var elementClass = element.classList.length ? '.' + $(element.classList).get().join('.') : '';
    
              var elementAttributes = element.hasAttributes() ? $(element.attributes).get().map(function(className) {
                return className.nodeName !== 'class' ? className.nodeValue ? '[' + className.nodeName + '="' + className.nodeValue + '"]' : '[' + className.nodeName + '"]' : '';
              }).join('') : '';
    
              var elementNthChild = ':nth-child(' + ($(element).index() + 1) + ')';
    
              return parentsList + elementClass + elementAttributes + elementNthChild + '::' + parameters.pseudoElement;
            };
          })();
    
          if (!element.pseudoElements.styleSheet) {
            if (document.styleSheets[0]) {
              element.pseudoElements.styleSheet = document.styleSheets[0];
            } else {
              var styleSheet = document.createElement('style');
    
              document.head.appendChild(styleSheet);
              element.pseudoElements.styleSheet = styleSheet.sheet;
            };
          };
    
          if (element.pseudoElements[parameters.pseudoElement].properties !== null && element.pseudoElements[parameters.pseudoElement].index !== null) {
            element.pseudoElements.styleSheet.deleteRule(element.pseudoElements[parameters.pseudoElement].index);
          };
    
          if (typeof parameters.argument === 'object') {
            if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
              var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length || element.pseudoElements.styleSheet.length;
    
              element.pseudoElements[parameters.pseudoElement].index = newIndex;
              element.pseudoElements[parameters.pseudoElement].properties = parameters.argument;
            };
    
            var properties = '';
    
            for (var property in parameters.argument) {
              element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property];
            };
    
            for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
              properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
            };
    
            element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
    
            console.log('Номер запуска: ' + Math.round(i / 2) + '; Номер присваивания элементу: ' + i);
            console.log({
              'Элемент 1': $('.el0:not(.el1)').get(0).pseudoElements,
              'Элемент 2': $('.el0.el1').get(0).pseudoElements,
              'Элемент 3': $('.el1:not(.el0)').get(0).pseudoElements
            });
            i++;
          } else if (parameters.argument !== undefined && parameters.property !== undefined) {
    
          } else if (parameters.argument !== undefined && parameters.property === undefined) {
    
          } else {
            console.error('Invalid values!');
            return false;
          };
        };
      };
    
      $.fn.cssBefore = function(argument, property) {
        setPseudoElement({
          elements: this,
          pseudoElement: 'before',
          argument: argument,
          property: property
        });
      };
    })();
    
    $(function() {
      // Случай 1
      $('.el0').cssBefore({
        'content': '"Новый \'before\'"',
        'color': 'green'
      });
      setTimeout(() => {
      // Случай 2
      $('.el1').cssBefore({
        'content': '"Новый \'before\' №2"',
        'color': 'blue'
      });
      }, 3000);
      // Случай 3
      setTimeout(() => {
      $('.el0').cssBefore({
        'content': '"Новый \'before\' №3"'
      });}, 6000);
    });
    .element {
      width: 480px;
      margin: 0 auto;
      border: 2px solid red;
    }
    
    .element:before {
      content: "Старый 'before'";
      color: orange;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    
    <div class="element el0" name="MyName"></div>
    <div class="element el0 el1" id="elem"></div>
    <div>
      <div class="element el1"></div>
    </div>

    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5