DOM方法的简短变量

时间:2011-06-09 09:29:37

标签: javascript

不能对document.createElementdocument.createTextNode[element].setSelectionRange等方法设置“快捷方式”吗?

var c = document.createElement;
var div = c('div');
div.innerHTML = 'blah';

document.body.appendChild(div);

执行上述代码时, Firebug控制台会返回错误

  

未捕获的异常:[例外...“无法转换JavaScript参数”nsresult:“0x80570009(NS_ERROR_XPC_BAD_CONVERT_JS)”location:“JS frame :: http://fiddle.jshell.net/_display/ :: :: line 20”data:no] < / p>

这发生在jsfiddle as provided here上,并且在jsfiddle之外完成时无声地失败。

以下代码工作正常,它只限于DOM操作方法吗?

function long_function_name(prop)
{
   alert(prop);
}

var c = long_function_name;

c('blah');

这有压缩的实用示例

而不是:

if (element.setSelectionRange)
{
    element.setSelectionRange(pos, pos);
}

压缩到:

var s = element.setSelectionRange || 0;
if (s) s(pos, pos);

2 个答案:

答案 0 :(得分:5)

在JavaScript中,调用document.createElement会使用.createElement调用this = document方法。当您将其分配给变量时,它将失去此关联。

您必须编写一个简短的函数来正确调用该方法。例如:

var c = function(name){ return document.createElement(name); };

在某些浏览器使用的较新版本的ECMAScript中,您可以更轻松地选择

var c = document.createElement.bind(document);

不幸的是,这并不是普遍支持的。

答案 1 :(得分:3)

有两个明显的问题:

  • 调用别名函数将不会提供正确的this值(它将是全局对象而不是document),DOM方法可能会或可能不会依赖它;
  • JavaScript中的DOM节点是主机对象,它们不受本机JavaScript对象的常规规则约束,并且基本上可以执行他们喜欢的操作。例如,无法保证宿主对象的方法是常规Function对象,因此可能不会使用您可以用来提供正确的call()apply()方法this值。

在这种情况下,您最好改为编写包装函数,例如

function c(tagName) {
    return document.createElement(tagName);
}