不能对document.createElement
,document.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);
答案 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方法可能会或可能不会依赖它; Function
对象,因此可能不会使用您可以用来提供正确的call()
或apply()
方法this
值。在这种情况下,您最好改为编写包装函数,例如
function c(tagName) {
return document.createElement(tagName);
}