【问题标题】:making the new instance from unknown Object in javascript在javascript中从未知对象创建新实例
【发布时间】:2016-02-26 13:04:35
【问题描述】:

我是 Javascript 的新手。我面临着不愉快的情况,其中“每个浏览器”对同一事物使用不同的 Object 类 - DOMRectList(在 Firefox 中)= TextRectangleList(在 IE 中)= ClientRectList(在 Chrome 中)。 所以我尝试编写代码,我想根据适当的 classCollection 创建新实例,例如nRect,它是特定 ...List 对象的项。 我尝试了几种方法,但没有任何效果。这是示例:

<style>
div.cont {
    position:absolute;
    top:10px;
    border:3px solid #093;
    height:205px;
    width:100px;
    word-wrap: break-word;
    overflow:hidden;
    font-family:"Times New Roman", Times, serif;
    font-size:12px;
    }
</style>
function MergeClientRects(elID){
    var result = [];
    xRects = document.getElementById(elID).getClientRects(); 
    alert ('ClientRect.constructor is ' + xRects.constructor);
    // Firefox : DOMRectList();
    // IE  :    [object TextRectangleList]
    // Chrome : ClientRectList()
    for (i = 0; i< xRects.length; i++){
        if (xRects[i].top > 5) {
            var nRect = xRects[i].getClass().newInstance(); // wrong, but how should it to be written ???
         // var nRect =new Object.getPrototypeOf(xRects[i]).create(); // wrong too 
            result.push(nRect);
            }
        }
    return result;  
    }


<div id="containter1" class="cont" contentEditable ="true">
<span id="me" style="font-style:italic; font-size:12px;">Donec tempus, nisi a pharetra placerat, diam nisi aliquam elit, a consectetur magna enim sed ligula.  </span>
</div>

<button onclick="MergeClientRects('me')">Process rects</button> 

感谢

【问题讨论】:

  • 试试var nRect = new xRects[i].constructor()
  • 好奇,为什么您认为能够创建这些类型的新实例是有价值的?为什么您认为甚至可以创建新实例?与大多数 DOM 对象一样,这些对象完全有可能是浏览器内部的,不能从客户端代码创建(除非提供了创建它们的函数,例如 document.createElement 的情况)。
  • @Tom> 没有...:未捕获的类型错误:非法构造函数
  • @DarkFalcon:我正在尝试寻找简单的解决方案。我只是潜入javascript,这就是尝试。如果您发现这种方法已经过时,那么我必须找到一些解决方法。但回到你的问题:我只想使用基于浏览器提供的本机对象的更通用的方法。
  • 我的意思是我很确定你不能。创建对象的浏览器版本可能不会在所有地方都得到支持。这意味着您必须创建自己的对象类型并复制所需的属性。

标签: javascript arrays object javascript-objects


【解决方案1】:

尝试用for..in循环替换for循环;删除t rue contentEditable html 内属性值处的空格。

注意,使用 Element.getBoundingClientRect()Element.getClientRects() 之间返回的值大约相差 1px 。无法使用 new 运算符创建 Element.getBoundingClientRect()Element.getClientRects() 的新实例。另见CSSOM View Module

function MergeClientRects(elID) {
  var result = [];
  var xRects; 
  var el = document.getElementById(elID);
  var  xRects = el.getClientRects()[0];
  for (var prop in xRects) {
    if (prop === "top" && xRects[prop] > 5) {
      var nRect = xRects[prop];
      result.push(nRect);
    }
  }
  console.log(result)
  return result;
}
<div id="containter1" contentEditable="true">
  <span id="me" style="font-style:italic; font-size:12px;">Donec tempus, nisi a pharetra placerat, diam nisi aliquam elit, a consectetur magna enim sed ligula.  </span>
</div>

<button onclick="MergeClientRects('me')">Process rects</button>

【讨论】:

  • 谢谢,但应该使用getClientRects()。我已经对原始答案进行了编辑,所以现在文本被分成几行。您的解决方案是替代方案。 :-)
  • 两者返回的不同值在1像素左右。将更新答案以使用ClientRect
  • 我想我会简化它并创建新对象(MyRect),我将在其中一个一个复制值。我只是好奇……谢谢你和黑暗猎鹰……
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2012-01-07
  • 2013-09-13
  • 1970-01-01
  • 2012-11-11
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多