2011-06-09 65 views
2

不能對諸如document.createElement,document.createTextNode,[element].setSelectionRange等方法進行「快捷方式」嗎?DOM方法的短變量

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

document.body.appendChild(div); 

當執行上面的代碼螢火蟲控制檯返回錯誤

未捕獲的異常:[異常... 「無法轉換的JavaScript變量」 nsresult: 「0x80570009(NS_ERROR_XPC_BAD_CONVERT_JS)」 位置: 「JS幀:: http://fiddle.jshell.net/_display/ :: ::線20」 的數據:無]

這發生在jsfiddle as provided here和靜默時的jsfiddle機智的外完成失敗h沒有錯誤。

下面的代碼工作正常,所以它僅僅侷限於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

即使'變種S = element.setSelectionRange;'就足夠了。如果該屬性沒有定義,它將返回'undefined',其值爲'false'。 – 2011-06-09 09:48:16

+0

哦謝謝@Felix,很高興知道!這是一個恥辱,這是行不通的,因爲上下文問題,如下面的答案 – 2011-06-09 10:39:57

回答

3

有兩個明顯的問題:

  • 調用你的別名功能將不會提供正確的this值(這將是全球的對象,而不是document),其中DOM方法可能會或可能不會取決於;
  • JavaScript中的DOM節點是主機對象,它們不受本機JavaScript對象的正常規則約束,並且基本上可以做他們喜歡的事情。例如,不能保證主機對象的方法是常規對象,因此可能不具有可用於提供正確的this值的call()apply()方法。

既然如此,你最好寫一個包裝函數代替,如

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

在JavaScri pt,致電document.createElementthis = document調用.createElement方法。當你將它分配給一個變量時,它會失去這種聯繫。

您必須編寫一個簡短的函數來正確調用該方法。例如:

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

在某些瀏覽器中使用的ECMAScript的新版本,你有

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

的更容易的選擇不幸的是,這是沒有得到普遍支持。

+0

謝謝這是很好的信息+1 – 2011-06-10 12:09:25

+0

FYI在IE 7/8這種東西工作'var w = document.write;' – 2013-02-05 19:19:30