【问题标题】:How do I get a numeric or string value for a javascript object such as window instead of the string [object]如何获取 javascript 对象(例如 window)而不是字符串 [object] 的数字或字符串值
【发布时间】:2010-08-31 19:10:35
【问题描述】:

如何获取 javascript 对象(例如 window)而不是字符串 [object] 的数字或字符串值

寻找对象 id 之类的东西,例如 44001 或 0xFF0012,对于该对象来说是唯一的

【问题讨论】:

  • 你希望窗口对象是什么字符串?
  • 独特的东西,比如 4401 或 0xFF0012

标签: javascript internet-explorer


【解决方案1】:

Javascript 不会为每个对象保留类似 python 的唯一哈希。您可以创建一个函数来为一个对象分配一个唯一的字符串,或者如果它已经被分配,则检索该字符串。

var getUniqueId = (function(){

  // uncomment this block if you want to avoid memory leaks
  // in browsers with crappy garbage collectors.
  /*
  try {
    window.addEventListener('unload', cleanup);
    window.addEventListener('beforeunload', cleanup);
  } catch (_) { try {
    window.attachEvent('onunload', cleanup);
    window.attachEvent('onbeforeunload', cleanup);
  } catch (__){}}

  function cleanup () { guid.knownObjects.length=0; }
  */

  guid.knownObjects=[];

  return guid;

  function guid (obj) {
    for (var i=guid.knownObjects.length; i--;) {
      if (guid.knownObjects[i][0]===obj) return guid.knownObjects[i][1];
    }
    var uid='x'+(+(''+Math.random()).substring(2)).toString(32);
    guid.knownObjects.push([obj, uid]);
    return uid;
  }

}());

测试一下:

getUniqueId(window)
> "x7onn8ne58ug"

getUniqueId(document)
> "x9jeriqjdf9o"

getUniqueId(document)
> "x9jeriqjdf9o"

getUniqueId(window)
> "x7onn8ne58ug"

您可以执行 console.dir(getUniqueId.knownObjects) 以获得一些有用的调试信息。

getUniqueId.knownObjects
> [
  Array
  0: DOMWindow
  1: "x7onn8ne58ug"
  , 
  Array
  0: HTMLDocument
  1: "x9jeriqjdf9o"
  ]

【讨论】:

  • 谢谢,太好了。当我移动到域中的另一个 url 时,有没有办法让说窗口的对象 id 保持不变?
  • 在不修改服务器上的任何内容的情况下执行此操作的唯一方法是在片段标识符中传递您需要的信息(可以出现在 URL 中的井号符号之后的文本位)。您还需要某种方式来包含什么对象与什么哈希一起使用,例如一个字符串,当 eval'd 时,它会产生所需的对象。不过,我不确定这是个好主意。毕竟,当您浏览页面时,您会得到一个新的窗口对象。它在内存中有自己的地址,并且应该有自己的唯一 ID。
  • 历史/导航器对象呢,从一个请求到下一个请求都可用,为什么它不保持不变?
  • widow.history 和 window.navigator 从页面到页面似乎是同一个对象,但是尝试向其中一个对象添加一个属性,导航页面,然后检查该属性 - 它已经消失了。当页面导航时,每个对象都会被重建;让信息从一个页面持续到下一个页面的唯一方法是通过服务器端帮助或 URL 片段标识符。
  • 实际上,您还可以采用另一种方法,但它很笨拙...有一个巨大的 iframe 占据整个页面,这是活动发生的地方。如果 iframe 和外部窗口都在您的域中,并且用户仅将 iframe 导航到您域中的其他页面,则您可以使用外部窗口跟踪内容,因为它永远不会导航。
【解决方案2】:

Javascript 没有对唯一标识符的原生支持。

您可以更改对象原型以包含一个。

查看这个帖子:JavaScript Object Id

【讨论】:

  • 我试图用我感兴趣的对象进行这项工作,它只适用于我创建的新对象。它不适用于说 window.id() 或 document.id()
【解决方案3】:

您希望看到window 的哪种字符串表示形式?

为 JS 运行时提供 toString 实现的对象负责它们自己的值。所以像HTMLElement 这样的对象可以返回,比如说,innerHTMLtoString。但它没有,所以默认是类型名称。

【讨论】:

  • 寻找对象 id 之类的东西,例如 44001 或 0xFF0012,对于该对象和 window 或 opener 或 window.parent 等对象来说是唯一的
【解决方案4】:

你可以像这样写一个基本的调试,你把你的对象作为o传递:

function debug(o){
   var r = '';
   for (var k in o){
      r += k + ' => ' + o[k] + '\n';
   }
   window.alert(r);
}

或者您可以像这样搜索转储或 print_re eaquivalent:http://geekswithblogs.net/svanvliet/archive/2006/03/23/simple-javascript-object-dump-function.aspx

【讨论】:

  • 寻找对象 id 之类的东西,例如 44001 或 0xFF0012,对于该对象来说是唯一的
  • 我不确定你想要达到什么目的......如果你只是存储对象引用,你就会得到一个唯一标识符,不是吗?
  • 试图实现导出唯一标识符以在其他地方使用。例如,知道我所在的特定窗口或我正在使用的唯一连接
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多