首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择<span> out auf <span></span><a></a>

选择<span> out auf <span></span><a></a>
EN

Stack Overflow用户
提问于 2015-06-11 08:26:46
回答 2查看 91关注 0票数 1

我正在测试一个指令,它切断200个字符后的文本。它改变了这一点:

代码语言:javascript
复制
<span mw-text-collapse="long text long text long text
 long text long text long text long text long text long 
 text long text long text long text long text long text 
 long text long text long text long text long text long 
 text long text long text long text long text long text 
 long text long text long text long text long text long 
 text long text long text long text long text long text 
 long text long text long text long text long text long 
 text long text long text long text long text long text 
 long text long text long text long text long text long 
 text long text" class="ng-scope ng-isolate-scope"></span>

对此:

代码语言:javascript
复制
 <span class="line-break ng-binding">
    long text long text long text long text long 
    text long text long text long text long text 
    long text long text long text long text long 
    text long text long text long text long text 
    long text long text ...
 </span>
 <a ng-if="showButton" ng-click="toggleLength()" style="cursor: pointer" class="ng-binding ng-scope">
    {{ showLessOrMore() | i18n }}
 </a>

为了检查是否真的有200个字符,我需要只选择元素。我该怎么做?我试过el.find('span'),但没有成功。

这是我的考验:

代码语言:javascript
复制
describe('mwTextCollapse', function () {

  var longText = 'long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text ' +
    'long text long text long text long text long text long text long text';


  fit('text should have a default length of 200 chars', function () {
    var textCollapse = '<span mw-text-collapse="' + longText + '"></span>';
    var el = $compile(textCollapse)(scope);
    scope.$digest();

    console.log(el.html());   
  });
});

测试指令:

代码语言:javascript
复制
.directive('mwTextCollapse', function ($filter) {
  return {
    restrict: 'A',
    scope: {
      mwTextCollapse: '@',
      length: '=',
      markdown: '='
    },
    templateUrl: 'modules/ui/templates/mwComponents/mwTextCollapse.html',
    link: function (scope) {

      // set default length
      if( scope.length && typeof scope.length === 'number' ) {
        scope.defaultLength = scope.length;
      } else {
        scope.defaultLength = 200;
      }

      // set start length for filter
      scope.filterLength = scope.defaultLength;

      // apply filter length to text
      scope.text = function(){
        return $filter('reduceStringTo')(
          scope.mwTextCollapse, scope.filterLength
        );
      };

      // show Button if text is longer than desired
      scope.showButton = false;
      if( scope.mwTextCollapse.length > scope.defaultLength ) {
        scope.showButton = true;
      }

      // set button to "show more" or "show less"
      scope.showLessOrMore = function () {
        if( scope.filterLength === scope.defaultLength ){
          return 'common.showMore';
        } else {
          return 'common.showLess';
        }
      };

      // collapse/expand text by setting filter length
      scope.toggleLength = function () {
        if( scope.filterLength === scope.defaultLength ) {
          delete scope.filterLength;
        } else {
          scope.filterLength = scope.defaultLength;
        }
      };
    }
  };
})

我尝试过dfsq解决方案:

代码语言:javascript
复制
 fit('text should have a default length of 200 chars', function () {
    var textCollapse = '<span mw-text-collapse="' + longText + '"></span>';
    var el = $compile(textCollapse)(scope);
    scope.$digest();

    var span = angular.element(el[0]);
    console.log(span.html());


  });

它仍然生成<a></a> :(

代码语言:javascript
复制
INFO [PhantomJS 1.9.8 (Mac OS X 0.0.0)]: Connected on socket wIMQX3-7dA2T5nIr11PI with id 86239756
LOG: '<!-- ngIf: markdown -->

<!-- ngIf: !markdown --><div ng-if="!markdown" class="ng-scope">
  <span class="line-break ng-binding">long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text ...</span>
  <!-- ngIf: showButton --><a ng-if="showButton" ng-click="toggleLength()" style="cursor: pointer" class="ng-binding ng-scope">{{ showLessOrMore() | i18n }}</a><!-- end ngIf: showButton -->
</div><!-- end ngIf: !markdown -->

'

编辑:明白了,正确的选择是

代码语言:javascript
复制
var span = angular.element(el[0].children[0].children[0]);

甚至更好

代码语言:javascript
复制
var span = el.find('span').text();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-11 08:37:43

由于指令编译的结果是两个同级节点,所以您应该能够通过0索引获取span (它将是HTMLSpanElement):

代码语言:javascript
复制
var textCollapse = '<span mw-text-collapse="' + longText + '"></span>';
var el = $compile(textCollapse)(scope);
scope.$digest();

var span = angular.element(el[0].children[0]);
var link = angular.element(el[0].children[1]);

console.log(span.html()); 
票数 1
EN

Stack Overflow用户

发布于 2015-06-11 08:36:56

通过添加以下CSS属性,可以完全避免Javascript:

代码语言:javascript
复制
.ng-scope {
     text-overflow: ellipsis;
}

.ng-scope.show {
     text-overflow:clip;
}

text-overflow.asp

然后点击切换按钮时,只需在span上切换类"show“即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30775477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档