1

ページのハッシュが変更されたときに js スクリプトを実行する必要があります。jQuery を使用するなど、ハッシュがいつ変更されたかを知る方法はたくさんあります。

$(window).on('hashchange', function() {
   // do something
});

を使用しようとしましたが、機能しませんでした。オブジェクトObject.observeの更新後にコールバックが起動しない理由を知りたいだけです。document.location

Object.observe(document.location, function(changes) { 
    console.log(changes);
});
4

2 に答える 2

2

document.location は、他の多くの DOM オブジェクトとともに、ホスト オブジェクトのカテゴリに分類されます。ホスト オブジェクトは、仕様ごとに、通常のネイティブ JS オブジェクトのように動作する必要はありません。Object.observe はこれらのオブジェクトの一部で機能する場合がありますが、確実に動作するわけではなく、document.location では機能しません。

それが機能しない別の例は次のとおりです。

var el = document.createElement('div');
document.body.appendChild(el);
Object.observe(el, function(change) { console.log('changed ', change[0].name); })

el.id = "hello";
el.foo = "bar";

于 2015-03-31T14:45:55.330 に答える
0

document.location使用を観察できない理由は、 「標準」オブジェクトではなく、タイプのオブジェクト (特別な読み取り専用インターフェイス) を返すObject.observe()ためだと思います。document.locationLocation Object

Mozilla ドキュメントから:

Document.location 読み取り専用プロパティは Location オブジェクトを返します。Document オブジェクトの location プロパティは、Location オブジェクトを参照します。Window.location は読み取り専用の Location オブジェクトです。

ロケーション インターフェース: https://developer.mozilla.org/en-US/docs/Web/API/Location

例:

console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__);   // returns Location {}
window.location === document.location // always true

Object.observe() メソッドは、オブジェクトへの変更を監視するために使用されます。

例:

var o = { name: ''};
Object.observe(o, function(changes){
    changes.forEach(function(change) {
    console.log(change.type, change.name, change.oldValue);
});
});
o.name = 'foo'; // name is being observed

彼らの違いを見てください__proto__

console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__);   // returns Location {}
console.log(o.__proto__);                 // returns Object {}

オブジェクトのプロトタイプ チェーンに、取得できるコンストラクターのプロトタイプ プロパティがあるかどうかをテストすると、非常に興味深いものになります。

console.log(document.location instanceof Object); // true
console.log(o instanceof Object); // true

コードサンプル:

var o = {
  name: ''
};
Object.observe(o, function(changes) {
  changes.forEach(function(change) {
    console.log(change.type, change.name, change.oldValue);
  });
});

o.name = 'foo';


console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__); // returns Location {}
console.log(o.__proto__); // returns Object {}


console.log(document.location instanceof Object); // true
console.log(o instanceof Object); // true

于 2015-03-31T14:15:29.817 に答える