2011-01-21 60 views
2

更新:在瀏覽器的JavaScript在運營商和事件

 
for(i in window)if(i=='onhashchange')console.log(i, window[i]); //prints onchangechange undefined 

,是支持onhashchange事件我有

'onhashchange' in window; //returns true 
window['onhashchange']; //returns false 
window.onhashchange; //returns false; 

爲什麼前者返回true,其餘返回false?

+0

onhashchange是非標準(據我所知)和th因此不完全支持。我期望它或者被逐漸淘汰,或者是一些奇怪的事情。嘗試setInterval循環。現在,你顯然是一位經驗豐富的使用window ['onhashchange']的JavaScript開發人員,但我坦白地說自己從未聽說過它。 – 2011-01-21 07:40:17

回答

1

我想在第一個操作的幫助下,你只要檢查這個事件是否在窗口對象中,所以它返回true。另外兩個告訴你,如果這樣的處理程序已經實現,並且沒有實現,但你會得到錯誤。 您可以檢查以下內容:

window.onhashchange = function() {} 
window['onhashchange']; 

啊,反正現在它將返回true,因爲我們已經定義了變量...所以最有可能

'onhashchange' in window; 

只檢查,如果瀏覽器支持

window['onhashchange']; //returns false 
window.onhashchange; //returns false; 

只是檢查,如果處理已經實現

PS。你也可以在Javascript IN operator compatibility有趣,在這裏@Andy E寫道:

當你用它來檢查事件支持時,你應該謹慎行事。除Mozilla之外的所有實現都支持元素中的「eventname」作爲DOM事件的測試,除非處理程序定義爲,否則Firefox將導致此處爲false。

UPDATE:看「x合窗口」和「window.x」之間的差異(其等於窗口[「X」]),看看下面的腳本,其輸出:

var foo = {}; 
console.info('bar' in foo); // false, because no such proeprty 
console.info(foo.bar); // undefined, because no such property 
console.info(foo.bar ? 'true' : 'false'); // 'false' because no such property 

foo = { bar: false }; 
console.info('bar' in foo); // true, because there is such property 
console.info(foo.bar); // false, because this is value of bar property 
console.info(foo.bar ? 'true' : 'false'); // 'false' because foo.bar is false 

foo = { bar: 1 }; 
console.info('bar' in foo); // true, because there is such a property 
console.info(foo.bar); // 1, because this is value of bar proeprty 
console.info(foo.bar ? 'true' : 'false'); // 'true', because foo.bar is 1 (which is not 0 which meant to be false) 

foo = { bar: 0 }; 
console.info('bar' in foo); // true, because there is such a property 
console.info(foo.bar); // 0, because this is value of bar proeprty 
console.info(foo.bar ? 'true' : 'false'); // 'false', because foo.bar is 0 (which meant to be false) 

UPDATE2:Detecting event support without browser sniffing - 這篇文章說明如何使事件檢測跨瀏覽器(因爲「事件窗口」並不在Mozilla工作;這篇文章中還回答了爲什麼它是如此)

+0

沒有進入瀏覽器的問題,但從純JavaScript的角度來看,在窗口不同於窗口[x],window.x怎麼樣? – user157195 2011-01-21 10:21:38

2

難道簡單地說window對象有一個名爲onhashchange的屬性,但該屬性的值當前是null,因此被認爲是錯誤的?

var a = { 'foo': null } 
console.log('foo' in a) // true 
console.log(a.foo) // null 
console.log(!!a.foo) // false 

...其中!!是一個雙重否定,一招值轉換爲真/假。