【问题标题】:JQuery select pseudo-element :after [duplicate]JQuery选择伪元素:之后[重复]
【发布时间】:2015-01-31 00:14:05
【问题描述】:

我要选择伪元素:after

这是我的CSS:

show-more:after
{
    content : (" > ");
}

JQuery代码

$(function(){
    $('.show-more:after').click(function() {
        alert("Yes");
    }); 
});

【问题讨论】:

标签: javascript jquery css


【解决方案1】:

不可能直接绑定到伪元素,因为它们不是 DOM 的一部分,但是可以通过绑定到父元素并测试与 :after作用于:

以下呈现为ELEMENT++,其中单击“ELEMENT”和“++”分别触发不同的行为:

<span>ELEMENT</span>
span::after {
  content: '++';
  position: absolute;
}

span.c1 {
  background: yellow;
}

span.c2::after {
  background: orange;
}
const span = document.querySelector('span');

span.addEventListener('click', function (e) {
    if (e.offsetX > span.offsetWidth) {
        span.className = 'c2';
    } else {
        span.className = 'c1';
    }
});

互动:http://jsfiddle.net/wC2p7/1/

【讨论】:

    【解决方案2】:

    编辑、更新

    试试

    (function($) {
      jQuery.fn.extend({
        getPseudo: function(pseudo, prop) {
          var props = window.getComputedStyle(
            $(this).get(0), pseudo
          ).getPropertyValue(prop);
          return String(props);
        },
        setPseudo: function(_pseudo, _prop, newprop) {
          var elem = $(this);
          var s = $("style");
          var p = elem.getPseudo(_pseudo, _prop);
          var r = p !== "" ? new RegExp(p) : false;
          var selector = $.map(elem, function(val, key) {
            return [val.tagName
                    , val.id 
                      ? "#" + val.id : null
                    , val.className ? "." + val.className : null]
          });
          var _setProp = "\n" + selector.join("")
            .toLowerCase()
            .concat(_pseudo)
            .concat("{")
            .concat(_prop + ":")
            .concat(newprop + "};");
          return ((!!r ? r.test($(s).text()) : r) 
                  ? $(s).text(function(index, prop) {
                      return prop.replace(r, newprop)
                    }) 
                  : $(s).append(_setProp)
          );
        }
      })
    })(jQuery);
    

    例如,初始css

    .show-more:after {
        content : ' > ';
    }
    

    设置pseudo元素

    $(".show-more-after").on("click", function() {
      $(this).setPseudo(":after", "content", "'123'")
    })
    

    githubpseudo.js

    (function($) {
      jQuery.fn.extend({
        getPseudo: function(pseudo, prop) {
          var props = window.getComputedStyle(
            $(this).get(0), pseudo
          ).getPropertyValue(prop);
          return String(props);
        },
        setPseudo: function(_pseudo, _prop, newprop) {
          var elem = $(this);
          var s = $("style");
          var p = elem.getPseudo(_pseudo, _prop);
          var r = p !== "" ? new RegExp(p) : false;
          var selector = $.map(elem, function(val, key) {
            return [val.tagName
                    , val.id 
                      ? "#" + val.id : null
                    , val.className ? "." + val.className : null]
          });
          var _setProp = "\n" + selector.join("")
            .toLowerCase()
            .concat(_pseudo)
            .concat("{")
            .concat(_prop + ":")
            .concat(newprop + "};");
          return ((!!r ? r.test($(s).text()) : r) 
                  ? $(s).text(function(index, prop) {
                      return prop.replace(r, newprop)
                    }) 
                  : $(s).append(_setProp)
          );
        }
      })
    })(jQuery);
    
    $(".show-more-after").on("click", function() {
      $(this).setPseudo(":after", "content", "'123'");
    })
    .show-more-after:after {
        content : ' > ';
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <div class="show-more-after">click</div>

    【讨论】:

    • 它只适用于 .one:before 之类的一个伪元素,但不适用于 .one:hover:before 之类的 2 个伪元素。例如。它适用于 $(this).setPseudo(":after", "content", "'123'");但相同的代码不适用于 $(this).setPseudo(":hover:after", "content", "'123'");
    【解决方案3】:

    改为这样做:

    $(function(){
        $('.show-more').after().click(function() {
            alert("Yes");
        }); 
    });
    .show-more {
    Width: 100px;
    Height: 40px;
    Position: relative; /* Helps you define the area you want to be clickable */
    Overflow: hidden;
    }
    
    
    .show-more:after {
     content: 'Click me';
    Left:0;
    Top: 0;
    width: 100%;
    height: 100%;
    background: red;
    color: white;
    padding: 15px;
    line-height: 40px;
    cursor: pointer;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="show-more"> </div>

    【讨论】:

    • 如果您将 HTML 更改为 &lt;div class="show-more"&gt;INSIDE&lt;/div&gt;,然后单击“INSIDE”它会中断。您的代码无法区分对元素的点击和对 after 伪元素的点击。
    • 点击.show-more类的任何部分实际上可以工作。不是特别适合::after
    • 用position属性和value relative设置固定的宽高,解决了“任意部分”触发点击事件的问题。请参阅 jsfiddle。
    【解决方案4】:

    显示更多后使用它添加文本

    $(function(){
        $('.show-more').text($('.show-more').text()+">");
    });
    

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2012-06-30
      • 2019-06-02
      • 2015-06-27
      • 2020-09-10
      相关资源
      最近更新 更多